Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 3D-Rotation (https://www.delphipraxis.net/62751-3d-rotation.html)

eyeless 8. Feb 2006 23:19


3D-Rotation
 
Liste der Anhänge anzeigen (Anzahl: 2)
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 :oops: musste ja nur in der OnCreate DoubleBuffered auf true setzen. ... sorry.

mfg, eyeless

em-sigma 9. Feb 2006 07:04

Re: 3D-Rotation
 
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

eyeless 9. Feb 2006 12:40

Re: 3D-Rotation
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

omata 9. Feb 2006 17:11

Re: 3D-Rotation
 
Hallo eyeless

schau doch mal hier.

Vielleicht hilft dir das ja weiter.

MfG
Thorsten

eyeless 9. Feb 2006 17:51

Re: 3D-Rotation
 
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

omata 9. Feb 2006 18:15

Re: 3D-Rotation
 
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

eyeless 9. Feb 2006 18:24

Re: 3D-Rotation
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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