AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

3D-Rotation

Offene Frage von "eyeless"
Ein Thema von eyeless · begonnen am 9. Feb 2006 · letzter Beitrag vom 9. Feb 2006
Antwort Antwort
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#1

3D-Rotation

  Alt 9. Feb 2006, 00:19
Servus!

So, da ich jez mal angefangen habe, einen eigenen 3D-Plotter zu basteln, tritt schon das 1. Problem auf: irgendwie funz die Rotation noch nicht ganz ... aber fast ...

Das ganze hab ich mit Hilfe der Einheitsmatrix gemacht:

Rotatiom um die x-Axe:
( 1 0 0 0)
( 0 cos sin 0)
( 0 -sin cos 0)
( 0 0 0 1)

Rotatiom um die y-Axe:
( cos 0 -sin 0)
( 0 1 0 0)
( sin 0 cos 0)
( 0 0 0 1)


Rotatiom um die z-Axe:
( cos sin 0 0)
(-sin cos 0 0)
( 0 0 1 0)
( 0 0 0 1)

daraus folgt:

Delphi-Quellcode:
procedure rotVertex(G1,G2,G3 : double; var V : TSimpleVertex);
begin
  //x-Axe
  V.x := V.x*1+ V.y*0+ V.z*0;
  V.y := V.x*0+ V.y*cos(G1)+ V.z*sin(G1);
  V.z := V.x*0+ -V.y*sin(G1)+ V.z*cos(G1);

  //y-Axe
  V.x := V.x*cos(G2)+ V.y*0+ -V.z*sin(G2);
  V.y := V.x*0+ V.y*1+ V.z*0;
  V.z := V.x*sin(G2)+ V.y*0+ V.z*cos(G2);

  //z-Axe
  V.x := V.x*cos(G3)+ V.y*sin(G3)+ V.z*0;
  V.y := -V.x*sin(G3)+ V.y*cos(G3)+ V.z*0;
  V.z := V.x*0+ V.y*0+ V.z*1;
end;
Eigentlich foll logistisch, ABER:

1. Selbst wen ich einen Winkel von 1 Grad nehme, spielt das Ding verrückt.
2. Wenn ich nun mal Werte nehme, die sehr klein (z.B. 0,05), dass funzt es, allerdings Wird das Objekt dann immer kleiner
3. Einfach Bsp anguggen ...

Den Würfel habe ich gedreht, indem ich jeden einzelnen Punkt um den 0-Punkt drehe, da dieser auch der Schwerpukt des Würfels ist (was dann noch zu lösen ist, wie ich das Ding um seinen eigenen Schwerpunkt drehe, hab aber schon ne Idee)

Delphi-Quellcode:
procedure rotPoly(G1,G2,G3 : double; var P : TSimplePolygon); //ein Polygon hat einfach 3 Punkte ...
begin
  rotVertex(G1,G2,G3,P.P1);
  rotVertex(G1,G2,G3,P.P2);
  rotVertex(G1,G2,G3,P.P3);
end;

procedure TCube.trans(T : TSimpleVertex); // dder Würfel hat 12 Polys ...
var
  i : Integer;
begin
  for i := 0 to 11 do
  begin
    transPoly(T,Polys[i]);
  end;
end;
Kann mir da jemand helfen ... Bitte?

Noch ein Prob: Da es unter delphi 2005 kein DoubleBuffered bei der PaintBox gibt .. was kann ich also machen, um das Flackern zu killen? ... hat sich erledigt musste ja nur in der OnCreate DoubleBuffered auf true setzen. ... sorry.

mfg, eyeless
Angehängte Dateien
Dateityp: rar 3d-rot-w32_498.rar (163,1 KB, 35x aufgerufen)
Dateityp: exe 3d-rot-dotnet_505.exe (20,0 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
em-sigma

Registriert seit: 8. Jul 2004
40 Beiträge
 
Delphi 12 Athens
 
#2

Re: 3D-Rotation

  Alt 9. Feb 2006, 08:04
Hi eyeless,

deine Matrix sieht gut aus, aber hast du auch daran gedacht, dass die Winkelfunktionen ein Argument in Bogenmaß erwarten und nicht in Grad?

Bei sehr kleinen Winkeln fällt der Unterschied kaum auf, aber bei einem Wert von 1 schon (sind fast 60 Grad).

Greetings, em-sigma
Allen ist das Denken erlaubt. Vielen bleibt es erspart. (Curt Goetz)
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#3

Re: 3D-Rotation

  Alt 9. Feb 2006, 13:40
Jo, das hab ich mir auch schon gedacht, aber selbst wenn ich jez statt z.B. n Grad n*(pi/180) rad nehme, ist nach ca 40-45 Grad (rund 0.7 rad) der Würfel nur noch ein sehr dünner Quader ... warum?

Bsp im Anhang ...

Das komische ist auch, wenn ich das ganze rad für rad auf zu sagen wir mal 60*(pi/180) rad drehe, wird das ding einfach nur klein ... wenn ich aber auf einmal auf 60*(pi/180) drehe, vermurkst es mir total ...nochmal: warum?

hier mal der code:

Delphi-Quellcode:
procedure TForm3D.StartClick(Sender: TObject); // dreh rad für rad
begin
  roti := roti+1;
  Cube.rot(roti*rad,0,0);
  Scr3D.Repaint;
  Label2.Caption := '°:'+intToStr(roti);
  Label3.Caption := 'rad:'+FloatToStr(roti*rad);
end;

procedure TForm3D.Button1Click(Sender: TObject); // dreh um 60 Grad
begin
  Cube.rot(60*rad,0,0);
  Scr3D.Repaint;
  Label2.Caption := '°:'+intToStr(60);
  Label3.Caption := 'rad:'+FloatToStr(60*rad);
end;
EDIT:

Ich habe mir auch gerade überlegt, das vieleicht das roti vor dem rad falsch ist und habe einfach immer um rad gedreht, bei ca 700 Grad sieht man aber auch eine Verengung .. vieleicht wäre erstmal ein Notlösung, dass ich immer um n-((n DIV 360)*360), wobei n der Winkel ist vor jeder neuen Rotation erstmal die Ursprungs-Rotation wiederherstelle und dann erst um den neuen Winkel dazu drehe ... oder so

mfg, eyeless
Angehängte Dateien
Dateityp: rar 3d-rot-w32-rad_913.rar (163,4 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: 3D-Rotation

  Alt 9. Feb 2006, 18:11
Hallo eyeless

schau doch mal hier.

Vielleicht hilft dir das ja weiter.

MfG
Thorsten
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#5

Re: 3D-Rotation

  Alt 9. Feb 2006, 18:51
Hi omata,

ich habe es mir mal angeschaut, ist aber das gleiche wie bei mir ... verstehe ich also nicht ... ich werde wohl einfach mal noch ein bisschen rumbasteln ...

Nur mal so: Ist das von dir eine "echte" 3D-zu-2D Projektion (Ist doch _Rechnen(), oder?)? Sieht mir etwas zu einfach aus ... oder?
(Ich habe das mit Schnittpunkt zw. Camera-zu-Punkt-Strecke und Leinwand-Ebene gemacht, zwex clipping und so)

mfg, eyeless
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: 3D-Rotation

  Alt 9. Feb 2006, 19:15
Hallo eyeless,

ich dachte eigentlich mehr an _RotiereX, _RotiereY, _RotiereZ.

Wenn du mal einen Würfel zum testen haben möchtest, dann füge doch mal im FormCreate folgendes ein...
Delphi-Quellcode:
  FVektorGraph.AddStrecke( 30, -10, 0, 10, -10, 0, clBlue, true);
  FVektorGraph.AddStrecke( 30, -10, 0, 30, -30, 0, clBlue, false);
  FVektorGraph.AddStrecke( 30, -30, 0, 10, -30, 0, clBlue, false);
  FVektorGraph.AddStrecke( 10, -30, 0, 10, -10, 0, clBlue, false);

  FVektorGraph.AddStrecke( 30, -10, -20, 10, -10, -20, clBlue, false);
  FVektorGraph.AddStrecke( 30, -10, -20, 30, -30, -20, clBlue, false);
  FVektorGraph.AddStrecke( 30, -30, -20, 10, -30, -20, clBlue, false);
  FVektorGraph.AddStrecke( 10, -30, -20, 10, -10, -20, clBlue, false);

  FVektorGraph.AddStrecke( 30, -10, 0, 30, -10, -20, clBlue, false);
  FVektorGraph.AddStrecke( 30, -30, 0, 30, -30, -20, clBlue, false);
  FVektorGraph.AddStrecke( 10, -30, 0, 10, -30, -20, clBlue, false);
  FVektorGraph.AddStrecke( 10, -10, 0, 10, -10, -20, clBlue, false);
Ich weiss die Erklärung des Programm ist einfach nur schlecht bzw. nicht vorhanden.

Tastenkombinationen: (kleiner Auszug)
X: rotiere X-Achse
Y: rotiere Y-Achse
Z: rotiere Z-Achse
T: transponieren (im Demo ist nur X eingestellt (auf 1) -> muss man selber anpassen)
G: größer
K: kleiner

diese Tasten beziehen sich auf...

F1: Koodinatensystem (also alles)
F2: 1. Figur
F3: 2. Figur

In Verbingung mit Shift kann das Verhalten jeweils umgedreht werden.

MfG
Thorsten
  Mit Zitat antworten Zitat
eyeless

Registriert seit: 12. Aug 2005
49 Beiträge
 
#7

Re: 3D-Rotation

  Alt 9. Feb 2006, 19:24
Ich auch.

Meine Rotationsfunktion sieht genau so aus wie deine, nur etwas anders von den Vorzeichen her, was aber letztendlich auf das selbe hinausläuft ... habe es aber trotzdem mal so wie du gemacht, was allerdings nichts geändert hat ...

Vieleicht liegt es ja auch daran, das ich mit double arbeite und nicht wie du mit real? glaube aber nicht ...

Ich werde es wohl erstmal so machen, dass man das Objekt um max. 360 Grad drehen kann ... dann sind die Auswirkungen nur minimal .. hoffe ich ... sozusagen eine zu-dem-Winkel-dreh-funxion, und keine um-den-winkel-dreh-funxion ... mal sehn ...

Die Frage wegen deiner _Rechnen-Funktion war nur so, da etwas konfus für mich ...

mfg, eyeless
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz