Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 06:14

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Unklarheiten gluProject
BeitragVerfasst: Fr Aug 22, 2008 13:29 
Offline
DGL Member

Registriert: Do Aug 14, 2008 16:25
Beiträge: 15
In einem anderen Thread hatte ich bereits zum gleichen Thema Fragen gestellt, da ich allerdings den Thread mit zuviel verschiedenen Problemen überhäuft hatte (Asche auf mein Haupt) und somit das Ganze zu einem Monolog meinerseits wurde greife ich die Bitte von Lossy eX auf und konzentriere mich auf ein Thema.

Ich stehe weiter vor dem Problem dass ich ein Objekt von der Draufsicht im Raum drehe und die Darstellungsgrösse automatisch angepasst an die Panelgrösse benötige.
Um dies zu bewerkstelligen erschien mir gluProject brauchbar, allerdings funktioniert es nicht wie gewünscht.
Statt vieler Erklärungsversuche habe ich mal ein kleines Beispiel erstellt, da sieht man es am besten:

Code:
  1. {Einzustellende Events:
  2.  Form1        : OnCreate -> FormCreate
  3.                 OnShow -> FormShow
  4.  ScrollBar1..3: OnChange -> ScrollBarChange}
  5.  
  6. unit testunit1;
  7.  
  8. interface
  9.  
  10. uses
  11.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  12.   Dialogs, dglOpenGL, Math, ExtCtrls, StdCtrls;
  13.  
  14. type
  15.   TForm1 = class(TForm)
  16.     Panel1: TPanel;
  17.     ScrollBar1: TScrollBar;
  18.     ScrollBar2: TScrollBar;
  19.     ScrollBar3: TScrollBar;
  20.     Label1: TLabel;
  21.     Label2: TLabel;
  22.     Label3: TLabel;
  23.     Label4: TLabel;
  24.  
  25.     procedure FormCreate(Sender : TObject);
  26.     procedure FormShow(Sender : TObject);
  27.     procedure FormDestroy(Sender: TObject);
  28.     procedure ScrollBarChange(Sender: TObject);
  29.  
  30.   private    { Private-Deklarationen }
  31.     procedure SetupGL;
  32.     Procedure Render;
  33.  
  34.   public    { Public-Deklarationen }
  35.     DC                                : HDC;  //Handle auf Zeichenfläche
  36.     RC                                : HGLRC;//Rendering Context
  37.   end;
  38.  
  39. var
  40.   Form1             : TForm1;
  41.   NearClipping,
  42.   FarClipping,
  43.   alpha,
  44.   x                 : integer;
  45.   Distanz,
  46.   ZoomFaktor        : real;
  47.   FlagCounter       : byte;
  48.   winx, winy, winz  : GLDouble;
  49.   modelMatrix       : TGLMatrixd4;
  50.   projMatrix        : TGLMatrixd4;
  51.   viewport          : TGLVectori4;
  52.   objx, objy, objz  : double;
  53.  
  54. implementation
  55.  
  56. {$R *.dfm}
  57.  
  58. {***************************************************************************}
  59. { SetUp GL }
  60. {***************************************************************************}
  61. procedure TForm1.SetupGL;
  62. begin
  63.   glClearColor(0, 0, 0, 0);
  64.   glEnable(GL_DEPTH_TEST);
  65.   glEnable(GL_CULL_FACE);
  66.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  67.   glMatrixMode(GL_PROJECTION);
  68.   glLoadIdentity;
  69. end;
  70.  
  71. {***************************************************************************}
  72. { Form erstellen }
  73. {***************************************************************************}
  74. procedure Tform1.FormCreate(Sender : TObject);
  75. begin
  76.  // Definition Form
  77.  form1.Height := 768;
  78.  form1.Width := 1024;
  79.  NearClipping := 0;
  80.  FarClipping := 1000;
  81.  // Panelgrösse in Relation zur Form
  82.  Panel1.height := round(form1.Height/1.2);
  83.  Panel1.Width := round(form1.Width/1.2);
  84.  // Versatz wg. Platz für Scrollbars
  85.  Panel1.Top := 25;
  86.  Panel1.left := 150;
  87.  // Definition Scrollbars
  88.  ScrollBar1.Max := 90;
  89.  ScrollBar1.Min := 0;
  90.  ScrollBar1.Top := 5;
  91.  ScrollBar1.Left := 3;
  92.  ScrollBar1.Width := 120;
  93.  ScrollBar1.Height := 15;
  94.  ScrollBar2.Max := 90;
  95.  ScrollBar2.Min := 0;
  96.  ScrollBar2.Top := 22;
  97.  ScrollBar2.Left := 3;
  98.  ScrollBar2.Width := 120;
  99.  ScrollBar2.Height := 15;
  100.  ScrollBar3.Max := 90;
  101.  ScrollBar3.Min := 0;
  102.  ScrollBar3.Top := 39;
  103.  ScrollBar3.Left := 3;
  104.  ScrollBar3.Width := 120;
  105.  ScrollBar3.Height := 15;
  106.  // Definition Labels
  107.  Label1.Left := 3;
  108.  Label1.Top := 65;
  109.  Label2.Left := 3;
  110.  Label2.Top := 85;
  111.  Label3.Left := 3;
  112.  Label3.Top := 105;
  113.  Label4.Left := 3;
  114.  Label4.Top := 125;
  115.  
  116.  // Blickwinkel vertikal
  117.  alpha := 30;
  118.  // Kantenlänge Quadrat
  119.  x := 20;
  120.  
  121.  DC:= GetDC(Panel1.Handle);
  122.  RC:= CreateRenderingContext( DC,
  123.                               [opDoubleBuffered],
  124.                               32,
  125.                               24,
  126.                               0,0,0,
  127.                               0);
  128.  ActivateRenderingContext(DC, RC);
  129.  glViewport(0, 0, Panel1.Width, Panel1.Height);
  130.  SetupGL;
  131.  // Starteinstellung Zoomfaktor
  132.  ZoomFaktor := 1;
  133.  // Erstaufruf Render
  134.  Render;
  135. end;
  136.  
  137. {***************************************************************************}
  138. { Form zeichnen }
  139. {***************************************************************************}
  140. procedure TForm1.FormShow(Sender: TObject);
  141. begin
  142.  if FlagCounter > 0 then Render;  // Flackerunterdrückung
  143. end;
  144.  
  145.  
  146. {***************************************************************************}
  147. { Bindungen aufheben }
  148. {***************************************************************************}
  149. procedure TForm1.FormDestroy(Sender: TObject);
  150. begin
  151.   DeactivateRenderingContext;
  152.   DestroyRenderingContext(RC);
  153.   ReleaseDC(Handle, DC);
  154. end;
  155.  
  156. {***************************************************************************}
  157. { Reaktion auf Scrollbar-Änderung }
  158. {***************************************************************************}
  159. procedure TForm1.ScrollBarChange(Sender: TObject);
  160. begin
  161.  FlagCounter := 2;
  162.  Render;
  163. end;
  164.  
  165.  
  166. {***************************************************************************}
  167. { Render-Routine }
  168. {***************************************************************************}
  169. procedure TForm1.Render;
  170. begin
  171.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  172.   glMatrixMode(GL_PROJECTION);
  173.   glLoadIdentity;
  174.   gluPerspective(alpha, Panel1.Width/Panel1.Height, NearClipping, FarClipping);
  175.   glMatrixMode(GL_MODELVIEW);
  176.   glLoadIdentity;
  177.  
  178.   // Berechnung Distanz aufgrund Öffnungswinkel
  179.   // und Kantenlänge, dann Skalierung mit Zoomfaktor
  180.   Distanz := -x/2 / tan(degtorad(alpha/2))/Zoomfaktor;
  181.   glTranslatef(0,0,Distanz);
  182.  
  183.   // Rotation gem. Scrollbars
  184.   glRotatef(-ScrollBar1.Position,1,0,0);
  185.   glRotatef(-ScrollBar2.Position,0,1,0);
  186.   glRotatef(-ScrollBar3.Position,0,0,1);
  187.  
  188.   // Quadrat zentrisch zeichnen
  189.   glBegin(GL_Quads);
  190.    glColor3f(1, 1, 1);
  191.    glVertex3f(-x/2,-x/2,0);
  192.    glVertex3f(x/2,-x/2,0);
  193.    glVertex3f(x/2,x/2,0);
  194.    glVertex3f(-x/2,x/2,0);
  195.   glend;
  196.  
  197.   // Bildschirmposition rechte untere Ecke ermitteln
  198.   objx := x/2;
  199.   objy := -x/2;
  200.   objz := 0;
  201.   glGetDoublev(GL_MODELVIEW_MATRIX, @modelmatrix);
  202.   glGetDoublev(GL_PROJECTION_MATRIX, @projMatrix);
  203.   glGetIntegerV(GL_VIEWPORT, @viewport);
  204.   gluProject(objx,objy,objz,modelmatrix,projmatrix,viewport,@winx,@winy,@winz);
  205.  
  206.   // Info-Labels beschreiben
  207.   Label1.caption := 'wx: ' + floattostr(winx);
  208.   Label2.caption := 'wy: ' + floattostr(winy);
  209.   Label3.caption := 'Fakt: ' + floattostr(Zoomfaktor);
  210.   Label4.caption := 'Dist: ' + floattostr(Distanz);
  211.  
  212.   // Anpassung Zoomfaktor an Panelhöhe
  213.   Zoomfaktor := (Panel1.Height/2)/((Panel1.Height/2) - winy);
  214.   // Wenn Objekt zu breit dann Anpassung Zoomfaktor
  215.   if (winx > (Panel1.Width)) then ZoomFaktor := ZoomFaktor * (Panel1.Width/2)/((Panel1.Width/2) + winx);
  216.  
  217.   // Schleifenzähler dekrementieren
  218.   dec(Flagcounter);
  219.  
  220.   // Nur zeichnen wenn Render 2x durchlaufen um 'Pumpen' zu vermeiden
  221.   if FlagCounter = 0 then SwapBuffers(DC);
  222.  
  223. end;
  224.  
  225. {***************************************************************************}
  226. { Programmende }
  227. {***************************************************************************}
  228. end.
  229.  
  230.  


Erstellt wird eine Form 1024*768 Pixel mit drei Scrollbars für die X/Y/Z-Drehung und vier Labels für ein paar Informationen (kann man auch weglassen).

Gezeichnet wird ein Quadrat mit der Kantenlänge X=20 (Wert ist letztlich egal), und zwar zentrisch auf der X-Ebene da eine Drehung um die Z-Achse einer Drehung um den Mittelpunkt des Quadrats entsprechen soll.
Nach zeichnen des Quadrats werden die tatsächlichen Screenkoordinaten der rechten unteren Ecke mittels gluProject ermittelt und der Betrachterabstand entsprechend skaliert damit die Darstellung stets formatfüllend ist.
Um ein Flackern oder Pumpen zu unterdrücken war das fragwürde Konstrukt :lol: mit dem Schleifenzähler notwendig, so halbwegs geht es so (obwohl das Quadrat nun nicht immer gezeichnet wird).

Mein Verständnisproblem nun: Die Drehung um Z (dritte Scrollbar) funktioniert exakt wie gewünscht, auch schön am 2.Label (winy-Wert) und am 4.Label (Betrachtungsabstand) nachzuvollziehen.
Die Drehung um Y oder Z aber hat eine stetige Vergrösserung der Betrachterdistanz zur Folge, völlig egal in welche Richtung die zugehörigen Scrollbars verstellt werden. Auch ist die Zunahme zu gross, das Objekt wird nicht formatfüllend dargestellt sondern verschwindet ruckzuck im Nirvana.
Wer sich an der Zeile...
if (winx > (Panel1.Width)) then ZoomFaktor := ZoomFaktor * (Panel1.Width/2)/((Panel1.Width/2) + winx);
...stört: Die ist unschuldig, wenn man sie auskommentiert ist der Effekt der gleiche.

Wer kann mir auf die Sprünge helfen was hier schiefläuft? Und evtl. auch erklären warum das Quadrat mal gerendert wird, mal aber nicht? Langsam verzweifele ich wirklich.

Schöne Grüsse
Toenne


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 23, 2008 07:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo toenne,
ich versuche mal ein wenig was rauszuarbeiten:

----- procedure TForm1.SetupGL
Hier solltest Du das "glEnable(GL_CULL_FACE); " rausnehmen, es könnte zumindest einen Teil der Probleme unten beim Anzeigen verursachen.

Das
glMatrixMode(GL_PROJECTION);
glLoadIdentity;

brauchst Du hier nicht, es ist hier absolut überflüssig, denn Du hast diesen Code unten beim Rendern ohnehin immer drin. Aber es verursacht auch keinen Fehler.

-----------procedure Tform1.FormCreate(Sender : TObject);
Das "NearClipping := 0;" muß gemäß unserem Wikiartikel über gluPerspective abgeändert werden: es darf nur positiv sein und muss auch größer als Null sein. Auch das könnte die Ursache für Deine Probleme weiter unten sein, weil dieser Wert in die Berechnung der Projektionsmatrix eingeht, und diese Nutzt Du ja für gluProject. Du musst also so etwas wie

NearClipping := 1; oder
NearClipping := 0.1;

schreiben.


------------------procedure TForm1.FormShow(Sender: TObject);

Hier ist mir die Sache mit dem FlagCounter nicht ganz klar; normalerweise sollte SwapBuffers eigentlich gewährleisten, dass Flackern nicht vorkommt. Aber egal.

-----------------procedure TForm1.Render;
Die Einleitung des Rendervorgangs schaut OK aus.

Die Distanzberechnung bzw. die Berechnung des Zoomfaktors weiter unten ist mir absolut unklar, kann ich also nicht beurteilen.

Ich schlage Folgendes vor: Du lässt die Distanzberechnung und den Zoomfaktor zunächst mal weg und versuchst das ganze ohne diese Zusätze soweit zu kriegen, dass Du mit dem Ergebnis zufrieden bist, also die Rotation um die drei Achsen. Dann sehen wir weiter.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 23, 2008 13:05 
Offline
DGL Member

Registriert: Do Aug 14, 2008 16:25
Beiträge: 15
Erstmal danke für deine Antwort :).

- Zu 'glEnable(GL_CULL_FACE);': OK, hier kann ich es sicher herausnehmen, allerdings in der eigentlichen Anwendung wofür ich die Drehfunktion benötige eher nicht.
Egal, ich habe die Zeile auskommentiert was aber leider auch nichts bringt.

- 'glMatrixMode(GL_PROJECTION); glLoadIdentity;'
OK, alles klar.

- 'NearClipping := 0;'
Auch klar, sorry. War auch ursprünglich '1', habe allerdings aus lauter Verzweifelung mit allen möglichen Parametern experimentiert und vor posten des Codes vergessen das wieder zu korrigieren. Aber du ahnst es schon: Spielt keine Rolle was ich eintrage, das Verhalten bleibt gleich.

- 'Hier ist mir die Sache mit dem FlagCounter nicht ganz klar; normalerweise sollte SwapBuffers eigentlich gewährleisten, dass Flackern nicht vorkommt.'
Das Problem liegt darin dass gluProject ja nicht hellsehen kann und daher nicht weiss wo der nächste Punkt liegen wird bevor er nicht gezeichnet wurde ;).
Stellen wir uns das Quadrat in Nullstellung vor, die untere Kante verläuft in Deckung mit der unteren Panelkante. gluProject liefert mir nun winy = 0.
Drehe ich nun das Quadrat, durchlaufe die Renderroutine und lasse das Ergebnis mit SwapBuffers darstellen dann liefert mir gluProject zwar schon einen negativen Wert für winy, für eine Korrektur ist es aber schon zu spät, das Quadrat würde mit abgeschnittener Ecke gezeichnet. Erst im nächsten Durchlauf von Render würde die Perspektive geändert und das Quadrat korrekt skaliert gezeichnet. Das meine ich mit 'Flackern' oder 'Pumpen', es würde immer erst falsch und erst im nächsten Durchlauf korrekt gezeichnet.
Mit dem Counter sorge ich dafür dass zwar - gewissermassen im Hinterkopf - das Quadrat berechnet aber noch nicht gleich wirklich auf dem Panel gezeichnet wird. Erst im nächsten Durchlauf nach Korrektur der Betrachterdistanz wird es dann mit SwapBuffers tatsächlich auf dem Bildschirm dargestellt.
Ich hoffe das war wenigstens halbwegs verständlich ;).
Allerdings ergibt das den merkwürdigen Effekt dass der Bildschirm alle paar Klicks auf den Scrollbar leer bleibt und erst beim nächsten Klick wieder dargestellt wird. Eine logische Abfolge konnte ich allerdings nicht feststellen...

- 'Die Distanzberechnung bzw. die Berechnung des Zoomfaktors weiter unten ist mir absolut unklar, kann ich also nicht beurteilen.'
Eigentlich völlig simpel, nur muss man eben zwischen den Matrizenkoordinaten und den Bildschirmkoordinaten umrechnen. Der Nullpunkt der Matrize liegt genau auf der Panelmitte, bezogen auf die Bildschirmkoordinaten läge er also bei Panel.Height/2.
Winy darf die Bildschirmkoordinate '0' und somit die Matrizenkoordinate '-Panel.Height/2' nicht unterschreiten, sonst wäre die Ecke abgeschnitten.
Man stelle sich das Quadrat mal um 45° gedreht vor, ywin ist in diesem Fall ohne Korrektur des Betrachterabstands also negativ.
Für eine korrekte Darstellung müsste ymin direkt auf dem Panelrand liegen, bezogen auf die Matrizenmitte also bei -Panel.Height/2.
Diese beiden Strecken setze ich in Relation (wobei die Vorzeichen keine Rolle spielen solange sie bei Nenner und Zähler gleich berücksichtigt werden):
Panel.Height/2 ist der Wert der maximal erlaubt wäre
Panel.Height/2 - winy ist der tatsächliche Wert. Wird winy nun negativ so ergibt sich in Summe ein Wert > Panel.Height/2.
Der Faktor würde also < 1.
Ist winy positiv (der untere Panelrand also noch nicht erreicht) so wäre (Panel.Height/2 - winy) < Panel.Height/2, der Faktor also >1.
Die Distanz dividiere ich nun einfach durch diesen Faktor und erreiche damit (-> Strahlensatz) dass ymin bei der Bildschirmkoordinate 0 liegen würde.
OK, wahrscheinlich wäre es einfacher verständlich wenn ich den Bruch welcher den Faktor definiert einfach umdrehe und dafür die Distanz mit diesem Faktor multipilziere:
winy negativ -> Faktor würde >1 -> Die Distanz würde durch Multiplikation mit diesem Faktor grösser -> winy geht gegen 0.
winy positiv -> Faktor würde <1 -> Die Distanz würde durch Multiplikation mit diesem Faktor kleiner -> winy geht gegen 0.

Ich weiss nicht ob du obigen Code mal ausprobiert hast, ich hatte ihn extra so erstellt dass man ihn mit Copy&Paste direkt verwenden kann. Zumindest was die Drehung um Z angeht wirst du feststellen dass es prima funktioniert.
Nur bei Drehung um X oder Y kommen für winy abstruse Werte heraus. Und was das merkwürdige ist: Der Wert wird stetig kleiner, egal in welche Richtung ich drehe. Wenn ich den entsprechenden Slider hin- und herbewege so 'flattert' das Quadrat Richtung Hintergrund ins Nirvana statt mal näher zu kommen und mal zu entfernen.
Das ist es was ich nicht kapiere, obiger 'Mechanismus' müsste hier eigentlich genauso funktionieren, tut es aber nicht. Wieso liefert gluProject hier andere, stetig fallende Werte als bei Drehung um Z?

Gruss
Toenne


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 25, 2008 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo toenne,
Ich habe mir Dein Programm angesehen, und nicht nur das: ich habe es auch bei mir implementiert. Nach langem Hin und her bin ich zu folgendem Schluss gekommen:

1. gluProject liefert offenbar eine Fenster-Y-Koordinate. Das Y muss also umgerechnet werden: WinY:= Panel.Height-WinY;

2. Zoomfaktor:

Die ursprüngliche Distanzberechnung ist OK und funktioniert ganz ausgezeichnet. Aber m.E. ist der Zoomfaktor nicht korrekt. Du berechnest den ZoomFaktor letztendlich aus dem Vergleich der Panelgröße mit den projizierten Koordinaten. Das ist OK. aber Du fütterst ihn in die Berechnung der Objektdistanz hinein, das geht dann in glTranslate ein. Das ist nicht OK. Die Objektdistanz ist die Z-Koordinate des gezeichneten 3D-Objekts (denn es ist ein 3D-Objekt, wenn Du gluPerspective verwendest).

Hiezu kommt noch, dass der Zoomfaktor in seine eigene Berechnung eingeht: Zoomfaktor berechnen, Zeichnen, daraus projizierte Koordinaten errechnen, aus denen der Zoomfaktor wieder berechnet wird. Wenn der Zoomfaktor nicht ganz exakt berechnet wird, liefert das eine sich selbst verstärkende Funktion, was hier soviel bedeutet wie: wenn der Zoomfaktor ausreitet, dann macht er das immer schneller und das ist der Grund für das Verschwinden Deines Objekts.

Eine Möglchkeit, den Zoomfaktor korrekt zu berechnen wäre, auf die ursprüngliche Distanzberechnung zurückzugreifen, und diese auf die transformierten Objektkoordinaten anzuwenden, nicht auf die ursprünglichen.
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 25, 2008 21:11 
Offline
DGL Member

Registriert: Do Aug 14, 2008 16:25
Beiträge: 15
Zitat:
1. gluProject liefert offenbar eine Fenster-Y-Koordinate. Das Y muss also umgerechnet werden: WinY:= Panel.Height-WinY;

Klar liefert gluProject eine Fensterkoordinate, ist ja Sinn und Zweck der Funktion ;).
Gezählt wird Y aber wie im Karthesischen System von unten nach oben und nicht von oben nach unten.
Siehe auch http://wiki.delphigl.com/index.php/gluUnProject
Zitat:
Y_new := viewport[3] - y; // In OpenGL steigt Y von unten (0) nach oben

Matrixmittelpunkt ist panel.height/2. Wenn ich nun die Matrixkoordinaten in Bezug auf die Bildschirmkoordinaten betrachten will muss ich also panel.height/2 als Referenzpunkt nehmen.
Das zweite Label zeigt ja den winy-Wert, wenn man bei glTranslatef 'Distanz' einfach mal durch eine Konstante ersetzt (also die Distanzanpassung 'stillegt') sieht man wie ymin von einem positiven Wert gegen Null geht und im Falle einer abgezwickten Ecke sogar ins Minus.
Wie gesagt, bei der Drehung um Z funktioniert es ja wunneprächtig.

Zitat:
Die Objektdistanz ist die Z-Koordinate des gezeichneten 3D-Objekts (denn es ist ein 3D-Objekt, wenn Du gluPerspective verwendest).

Hmpf? glTranslatef definiert doch die Distanz zur Matrix wenn ich nicht irre? Klar stimmt die Rechnung bei positiven Z-Werten nicht mehr 100%tig (das würde ich ohnehin durch einen zusätzlichen Faktor berücksichtigen welcher einen Rand zum Panelfenster garantiert...im Verhältnis zur Objektgrösse sind die Z-Were auch gering, 1:100 oder weniger), aber der Z-Wert im obigen Beispiel ist ohnehin bewusst Null.

Die eigentliche Frage ist ja die:
Bei Drehung des Quadrats ohne Korrektur geht winy erst gegen Null, dann ins Negative und dann wieder ins Positive (bei Drehwinkel >45°). Das wird auch prima abgefangen und korrigiert.
Nun schauen wir uns aber die Drehung um Y an, wie einen Fensterflügel den man zu sich hinzieht. Hier wird ymin auch negativ, die Korrektur greift aber nicht richtig obwohl mathematisch eigentlich die gleichen Regeln gelten. Schlimmer aber noch: Wenn man den Fensterflügel wieder zuklappt dann müsste ymin wieder Richtung Null bzw. ins Positive gehen, hier aber geht ymin immer weiter ins Negative. Bei X dasselbe.
Man sieht es ja: Zunächst wird die Distanz korrigiert (wenn auch vom absoluten Zahlenwert her zu stark), das Quadrat weicht zurück. Wenn man nun den Slider wieder Richtung Null bewegt müsste die Distanz wieder kleiner werden da die Y-Bildschirmkoordinate ja positiv ist...statt dessen weicht das Quadrat noch weiter zurück.
Das ist es was ich nicht in den Kopf bekomme, wieso wird bei Z-Drehung perfekt korrigiert derweil bei X und Y das Quadrat im Nirvana verschwindet :? .

Gruss
Toenne


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]