Autor |
Beitrag |
goose
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 10:48
Hallo,
ich brauch ein bischen OpenGL für mein Programm, hab damit aber so meine Probleme.
Hab mich auf dieser Seite : www.delphigl.com/ hier umgeschaut, sah auch relativ einfach aus und die ersten schritte waren ja auch einfach.
Also es geht um folgendes :
Ich hab ein einfaches Objekt, einen Quader meinetwegen.
Wenn ich den an der Position 0,0,0 ( x,y,z) erstelle, dann kann ich den mit
glRotateF(30,1,0,0) um 30 Grad um die X achse drehen.
Leider liegen meine Objekte aber nicht auf 0,0,0 sondern irgenwo bei 12,51,2.
Gut, Tutorial gelesen und da steht das so :
Erst glTranslatef(-12,-51,-5), dann das glRotateF(30,1,0,0).
Ok, gesagt getan, aber was ist passiert, nix mehr da ...ja wo is es denn hin ?
Also um das Problem nochmal zusammen zu fassen:
Einen Quader oder was auch immer an Position X=12, y=51, Z=0 ( Z is erst mal egal )
Dann das Teil um die X Achse drehen !?
Wie mach ich das ?
Dank Euch
Matthias
Besser ????
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DGLopenGL, ExtCtrls;
type TForm1 = class(TForm) glPanel: TPanel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); private procedure SetupGL; procedure Init; procedure Render; procedure IdleHandler(Sender: TObject; var Done: Boolean); public DC : HDC; RC : HGLRC; end;
const NearClipping = 1; FarClipping = 1000;
var Form1: TForm1;
implementation
{$R *.dfm} procedure TForm1.SetupGL; begin glClearColor(0, 0, 0, 0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); end;
procedure TForm1.Init; begin
end;
procedure TForm1.FormCreate(Sender: TObject); begin DC:= GetDC(glPanel.Handle); if not InitOpenGL then Application.Terminate; RC:= CreateRenderingContext( DC,[opDoubleBuffered],32,24,0,0,0,0); ActivateRenderingContext(DC, RC); ActivateRenderingContext(DC, RC); SetupGL; Init; end;
procedure TForm1.FormDestroy(Sender: TObject); begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(Handle, DC); end;
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean); begin Render; Done:= false; end;
procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); glLoadIdentity;
gluPerspective(45.0, glPanel.ClientWidth/glPanel.ClientHeight, NearClipping, FarClipping);
glTranslatef(-12, -51, -5);
glMatrixMode(GL_MODELVIEW); glLoadIdentity;
glRotateF(30, 1, 0, 0); glRotateF(0, 0, 1, 0); glRotateF(0, 0, 0, 1);
glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(12, 51, 0); glColor3f(1, 0, 0); glVertex3f(10, 51, 0); glColor3f(0, 1, 0); glVertex3f(10, 49, 0); glColor3f(0, 1, 0); glVertex3f(12, 49, 0); glEnd;
SwapBuffers(DC); end;
procedure TForm1.FormResize(Sender: TObject); var tmpBool : Boolean; begin glViewport(0, 0, glPanel.ClientWidth, glPanel.ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45.0, glPanel.ClientWidth/glPanel.ClientHeight, NearClipping, FarClipping);
glMatrixMode(GL_MODELVIEW); glLoadIdentity; IdleHandler(Sender, tmpBool); end;
end. |
Moderiert von Tino: Negative Hinweise bezgl. anderem Forum entfernt.
Moderiert von Tino: Titel erweitert.
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von goose am Fr 24.02.06 11:08, insgesamt 2-mal bearbeitet
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Fr 24.02.06 11:24
Nun, es verwundert mich, das Dir bei uns nicht geholfen wurde, allerdings liegt dies meistens an der Art und Weise wie eine Frage gestellt wird. Ich bitte einmal um einen Querverweis auf den entsprechenden Thread, bevor ich anfange mich mit Dingen evtl. doppelt zu befassen.
1. Generell gilt: Translate + Rotate != Rotate + Translate.
2. Bei einem zweiten Blick auf deinen Quellcode fällt mir auf, dass Du die Positionierung in der Projektions-Matrix ausführst und nicht in der Modelview. Dies kann auf einigen Rechner zu merkwürdigen Problemen führen und sollte vermieden werden. Von uns wirst Du eigentlich gewohnt sein, dass man die Projektionsmatrix nur zu Beginn und bei einem Resize neu justiert und ansonsten alles über die ModelView laufen läßt.
3. Weiß ich nicht wie bei Dir eine Rotation zu Stand kommen soll, da Du nur mit fixen Variablen arbeitest. Um eine Rotation zu bewirken musst Du die Drehung beim Rendern stets verändern. Es kann auch sein, dass Du gerade die Rückseite des Objektes siehst oder es von der Seite betrachtest und deswegen nichts siehst.
Um ehrlich zu sein, würde es mich sehr verwundern, wenn Du auf eine solche Frage nicht min. einer der drei Antworten bekommen hättest. Mich würde ein Verweis sehr interessieren, damit ich das einmal mitverfolgen könnte.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 11:32
Hallöchen,
hier erst mal der Link : www.delphigl.com/for...ic.php?p=42988#42988
Hmm, also ich hab dort in das Forum geschrieben und geschrieben, aber es war keiner Bereit mal ein Stück von dem geposteten Code einfach mal so zu verändern das ich sehe wie es sein muss.
Das mit der Matrix hat mir dort auch jemand geschrieben, hab ich auch so getestet und ging aber auch nicht.
Ob das nun so richtig war weiss ich nicht, denn das hat mir auch keiner gesagt.
Es ist nunmal schwer wenn man sich das nicht gleich vorstellen kann.
Nur ein Forum ist doch dazu da das geholfen wird und nicht immer und immer wieder auf die WIKI dort verwiesen wird obwahl ich gesagt habe das ich mir das durchgelesen habe und das so wie das dort ist ja auch geht, nur eben nicht wenn der Punkt irgendwoe bei 12,51,0 liegt.
Aber naja, ich bin auch dort grad am fragen , ein letztes mal
Matthias
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 11:56
Hallo,
hab jetzt erst mal die Render Procedure berichtigt. Ist das so jetzt richtig ?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity;
glTranslatef(0, 0, -5);
glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-1, -1, 0); glColor3f(0, 1, 0); glVertex3f(1, -1, 0); glColor3f(0, 0, 1); glVertex3f(1, 1, 0); glColor3f(1, 1, 0); glVertex3f(-1, 1, 0); glEnd;
SwapBuffers(DC); end; |
Das geht und macht mir ein Viereck genau in der mitte der Form.
den zu drehen geht ja auch :
erst
glTranslatef(0, 0, -5);
dann
glRotateF(20,1,0,0);
Geht..........RICHTIG so ?
Matthias
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Fr 24.02.06 12:09
Also erstmal nochmal vorweg. Mir nimmt es immer schon stets die Lust, wenn ich solche Posts sehe a la "Da hat man mir nicht geholfen". Das ganze ist ein Angebot von freiwilligen und DGL steht in keinerlei Konkurrenz mit dem DF oder anderen Foren, weil wir ein Fachforum sind. Wie Du merkst, wirst Du viele Leute von DGL auch hier finden.
Aber nun zu deinem Problem. Ich minimiere die Frage auf: Du willst, dass ein Objekt an Position x,y,z erscheint und um die X-Achse dreht mit rot? Nichts leichter als das.
1. Korrigiere das mit der Projektions-Matrix. 3D-Programmierung kann unglaublich komplex werden und man sollte nie davon ausgehen es mit nur einen Fehler zu tun haben. Oftmals sind es zahlreiche Folgefehler, die dann erst zu einem Versagen führen. Korrigiere das bitte.
2. Stellten wir fest, dass die Matrix-Operationsreihenfolge wichtig ist. Diee ist für dein Problem soweit korrekt. Erst Translate, dann Rotate.
3. Bedenke folgendes. Es gibt zwei sinnvolle Methoden um in OpenGL Objekte zu platzieren. Zum einen in dem man diese als Parameter in glVertex3f definiert, zum anderen in dem man die Punkte alle im Zentrum generiert und dann mit Matrix-Operationen entsprechend hinprojeziert. Für deinen Fall würde ich Dir letzteres empfehlen, da man hier auch viel leichter mit glPushMatrix und glPopMatrix Objekte in Verbindung miteinander setzt. Mann dreht Person A und Arm B wird automatisch mit gedreht. Du probierst beides. Das kann nicht gehen. Am einfachsten wird es, wenn Du das Objekt also um das Zentrum herum aufbaust, was bei einer Längeneinheit einem Bereich von (-0.5/-0.5 bis 0.5/0.5) entspricht. Deine Rotationsvariable musst Du dann gesonders erhöhen. Anfangs wird es reichen dies in der Render-Loop zu tun, jedoch führt dies dazu, dass schneller Rechner, schneller rotieren - das will man meist eher nicht.
Der Pseudo-Code für Dich sähe also wie folgt aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| rot := rot + 0.01; // das ist eine schlechte Lösung glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
glLoadIdentity; //glTranslatef(0,0,-10); Dies geht und das Objekt ist sichtbar! glTranslatef(-12, -51, 5); // Das ist was Du willst glRotatef(rot,1,0,0); glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-0.5, -0.5, 0); glColor3f(0, 1, 0); glVertex3f( 0.5, -0.5, 0); glColor3f(0, 0, 1); glVertex3f( 0.5, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(-0.5, 0.5, 0); glEnd; |
Solltest Du diese Punkte abarbeiten, solltest Du eine Lösung haben.
//edit, da du was geschrieben hattest:
Sieht schon um einiges besser aus. Was mir gerade noch auffällt. Bitte vorsicht bei den Achsen! Instinktiv geht man davon aus, dass die Z-Achse nach vorne hin positiv wird! Das ist jedoch nicht der Fall, sie wird (in den Bildschirm hinein) negativ. Entsprechend kann ich nicht nachvollziehen wie Du mit deinem Quellcode das Dreieck jemals gesehen hast, da sich das ganz im Prinzip "hinter" dem Beobachter abspielt. Prüfe das ganze bitte einmal, ob dies vielleicht eher das ist, was Du wolltest, also eine Transformation nach -5 auf der Z-Achse. Alternativ fällt es vielen Einsteigern einfacher mit der Hilfsfunktion glulookat zu arbeiten. Diese sollte direkt nach dem glLoadIdentity aufgerufen werden und würde das erste glTranslatef ersetzen.
Des Weiteren solltest Du Dir nicht vorstellen, dass sich in OpenGL eine Kamera durch die Welt bewegt, sondern anstatt eine Kamera zu drehen, man einfach die Welt dreht. Visuell der gleiche Effekt, macht man sich dies im Kopf jedoch bewußt, wird es einem meist einleuchtender.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
Zuletzt bearbeitet von Phobeus am Fr 24.02.06 12:15, insgesamt 2-mal bearbeitet
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Fr 24.02.06 12:09
Hallo Mathias,
ich hab Deine negativen Aussagen bzgl. des anderen Forums entfernt. Unter den ganzen Delphi Foren im Internet besteht ein gutes Verhältnis und das möchte ich auch gerne beibehalten. Kritik ja - aber dann bitte in dem passenden Forum.
Gruß
Tino
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 12:30
Hallo zusammen,
@Tino, ist Ok und war sicher auch einiges nicht so gemeint, also SORRY
So, nun weiter mit dem Problem.
Was ich darstellen will sind Geografische Koordinaten, deswegen macht sich das blöd die erst um den Nullpunkt herumzurechnen.
Also besser für mich wäre die mit glVertex3F an die gegebenen Koordinaten zu setzen welche da als Beispiel sein könnten :
Lat=51.414997 ( Y )
Lon=12.226944 ( X )
Alt=462 ( Z ) // erst später
die können auch negativ sein oder so was.
Also wenn das geht, dann wär mir das lieber ich könnte die Daten so nehmen wie ich sie vorliegen habe. Deswegen wollte ich das ja mit OGL machen. Ansonsten kann ich auch ein BMP nehmen und auf ein Canvas zeichnen. ( ohne die Höhe natürlich dann )
Ok, also soweit dazu.
Da ich nun erst mal völlig durch den Wind bin hab ich genau das was Du gerade geschrieben hat so wie es ist übernommen, jedoch nichts ist zu sehen. Weder mit drehung noch ohne.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity;
glLoadIdentity;
glTranslatef(-12, -51, 5); glRotatef(10,1,0,0);
glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-0.5, -0.5, 0); glColor3f(0, 1, 0); glVertex3f( 0.5, -0.5, 0); glColor3f(0, 0, 1); glVertex3f( 0.5, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(-0.5, 0.5, 0); glEnd;
SwapBuffers(DC); end; |
ich glaube das kann auch nicht gehen weil das objekt ja an dem Nullpunkt ist und mit glTranslate die Position verändert wird oder ???
Ich weiss es echt nicht.
Was ist den da wieder verkehrt ?
Matthias
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Fr 24.02.06 12:56
Bin nur noch aufm Sprung. Du hast "5" für die Z-Achse genommen. Das liegt hinter der Kamera, so wie Du sie ausrichtest. Mache eine -5 daraus, dann solltest Du es sehen, sofern es dann nicht soweit nach außen verschoben wurde, dass es wieder außerhalb des Sichtkegels liegt. Nimmst Du die -10 von mir, siehst Du Das Objekt und kannst versuchen dein Gebilde mit den Abständen vernünftig zu positionieren.
Würde es Dir vielleicht helfen, wenn Du keine "richtiges 3D" hättest, sondern nur eine orthogonale Projektion (2D ähnlich eines Canvas, so dass die Z-Achse nur noch bestimmt in welcher Reihenfolge etwas gerendert wird) hast? Bin mit geographischen Koordinaten und deren Eigenschaften nicht ganz vertraut
Sofern Du nur ein Quad brauchst an einer Stelle, macht es keinen Unterschied, ob Du diese mit einer Längeneinheit an x,y setzt oder im Ursprung generierst und dann dort hinprojizierst. Bei Rotationen ist es oft nur am günstigsten, wenn das Zentrum des Gebildes bei einer Rotation im Ursprung liegt. Würdest Du ja z.b. ein Quad von 0,0 bis 1,1 nehmen, würde es sich bei einer Rotation um die X-Achse nicht im Zentrum drehen, sondern um seine Unterseite. Was ich allerdings langsam den Eindruck bekomme, dass Du nicht ein Quad irgendwo gedreht haben möchtest, sondern etwas zeichnen mächtest und dann die ganze Szene drehen möchtest?
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 16:15
Hallo,
jap, ich möchte die ganze Scene drehen.
Also zu Erklärung mal was ich überhaupt vor habe, also mein Wunschdenken.
Das ganze wird ein Flugplanungsprogramm.
Wem das nix sagt, es berechnet den Weg von A nach B den man mit einem Flugzeug abfliegen muss.
Also das Programm berechnet die Punkte die zwischen A und B liegen. Das sind Geo Koordinaten. Eventuelle Erdkrümmungen kann man dabei vernachlässigen. Das ist auch mein problem das eventuell zu berechnen.
Jedenfalls hat man dann den Startpunkt und eine unbestimmte menge Wegpunkte bis zum Zielpunkt. ( siehe Grafik )
Startpunkt und Zielpunkt , sowie die dazwischenliegenden Wegpunkte sollen gezeichnet werden, und zwar in der Draufsicht.
Dann soll das ganze drehbar sein, so das man also das Flugprofiel ( höhe ) sehen kann.
Dabei will ich das, als Draufsicht, Y+ oben, X+rechts, Y- unten und X- links liegt weil sich das mit den Koordinaten gut machen läßt.
Die höhe soll auf der Z-Achse dargestellt werden.
Hier erst mal die Draufsicht :
Das schwarze sollen die Start/landebahnen sein, das rote der Flugweg von OBEN.
( so als schaue man auf einen Starßenatlas und markiert sich einen Weg von Strasse A nach Strasse B )
Die Achsen hab ich extra mit eingezeichnet.
Hier mal die gedrehte Ansicht ( um die X-Achse )
So soll es mal werden.
Ich denke mal, wenn ich das nicht wieder falsch verstehe, das heisst das ich die ganze Scene drehen möchte.
Ist ja auch so, es soll sich alles was gezeichnet wird um die X-Achse drehen lassen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Render; begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity;
glLoadIdentity;
glTranslatef(-12, -51, -5); glRotatef(10,1,0,0);
glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex3f(-0.5, -0.5, 0); glColor3f(0, 1, 0); glVertex3f( 0.5, -0.5, 0); glColor3f(0, 0, 1); glVertex3f( 0.5, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(-0.5, 0.5, 0); glEnd;
SwapBuffers(DC); end; |
Das hab ich auch so probiert und geht auch nicht.
Aber müsste das nicht glVertex3F(12,51,0) heissen damit da was zu sehen sein kann ?
Wie auch immer ich das versuche, es dreht sich immer nur im Nullpunkt, also bei 0,0,0 richtig.
Matthias
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Fr 24.02.06 17:25
Okay, so langsam glaube ich zu wissen, was Du meinst. Warum Du nicht siehst? Verzeihe meinem Zynismus, aber stelle Dir mal folgendes vor (es hilft!)  Du stellst an einem Punkt eine Flage rein. Das ist dein Ursprung und dort stehst Du mit einem Kumpel. Diesem sagst Du nun, er soll 12 m nach rechts gehen und dann 5 m nach vorne. Damnit wäre er (bei meinem eingeschränkten Gesichtsfeld) bereits außerhalb dem was ich erblicken würde. Danach sagst Du ihm er soll sich 51 m in den Boden graben und spätestens dann wäre er gänzlich aus dem Sichtfeld
Folgendes Problem. Ich bin Linux-Nutzer und kann daher keine VCL-Beispiele liefern. Bei DGL verwenden wir ein Prototyping Framework namens easySDL. Entsprechender Header ist im Zip drinne, es benötigt noch die SDL-Header (sind bei der DGLSDK dabei). Entweder installierst Du diese oder Du portierst Dir den Kram auf VCL zu recht.
Für dein Problem empfehle ich folgendes. Die X-Achse verläuft zur rechten positiv, zur linken negativ (klar), in den Bildschirm hinein, ist die Y-Achse positiv, hinter Dir wird sie negativ. Die Z-Achse gibt die Höhe an. Du hast damit den Vorteil, dass Du zwei Achsen verwendest, die in der Richtung positiv werden wie man es erwartet und Du nicht die ganze Zeit bei einer Achse das Vorzeichen drehen mußt. Das nimmt eine Menge Verwirrung weg und ist weitaus einfacher im Kopf vorzustellen. Nun habe ich ein Drahtgitter entlang X und Y positiv gezeichnet. Das erfüllt keinen Sinn, hilft aber imens die Abstände besser zu sehen und Distanzen einzuschätzen. Danachj zeichne ich entlang der Achsen fabige Linien um klar zu machen, wo welche Achse längst geht. Die Säule steht im Mittelpunkt.
Mit AWSD kannst Du dich entlang der X und Y-Achse bewegen mit PageUp/PageDown kannst Du die Höhe verändern. Space beginnt eine Rotation der Szene um den Ursprung, wobei die Achsensäulen sich nicht mitdrehen (würde evtl. irritieren). Mit F1 schaltest Du hin und her zwischen einer Top-Ansicht und einer Seitenansicht (aus dem negativen Y, leicht erhoben). Danach ziehe ich eine Linie vom Urpsrung aus über zwei Punkte zum gegenüberliegenden Ende und verbinde diese mit der Ebene Z=0, damit man es im 3D-Raum besser sieht. Damit hast Du eine Szene, die zwar nicht die Maße verwendest, die Du wolltest, die aber das Prinzip, was Du erklärt hast graphisch darstellst und kannst Dich im Raum bewegen (das hilft auch ungemein um etwaigen Fehlern auf die Schliche zu kommen). Nehme die Szene einmal und versuche mit dieser ein wenig zu "spielen". Hoffe sehr, dass es Dir damit ein wenig klarer wird.
Gerade wenn man eine Szene neu aufbaut, passiert es sehr schnell, dass man irgendwo Achsen verdreht oder vertauscht und nicht sofort sehen kann, wo es fehlt schlägt. Es lohnt sich daher immer eine Szene zunächst mit fixen Punkten zu generieren, da man mit deren Hilfe oftmals die Fehler leichtert sieht. Das Sample ist ein 5-Min-Beispiel mit Code aus einem aktuellen Projekt von mir. Also bitte keine klagen über hässliche Formatierung oder merkwürdige Kommentare
//edit: lese gerade deinen letzten Satz
Wenn Du nicht willst, dass der "Drehpunkt" meiner Szene der Mittelpunkt ist, so passe das rotate wie folgt an:
Quelltext 1: 2:
| glRotatef(rot,0,0,1); glTranslatef(-5,-5,0); |
Damit ist nicht mehr die linke untere Ecke der Punkt um den sich alles dreht, sondern der Mittelpunkt der Quadrate (5,5,0);
Einloggen, um Attachments anzusehen!
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 17:47
Hallo,
also ich hab jetzt deine Antwort auf dem einen Schirm und Antworte Dir hier auf dem anderen, sonst vergesse ich wieder was.
Ich hab noch gar nicht zuende gelesen, wollte mich aber erst mal für die sher ausführlich Antwort bedanken !!!!!!!!! Echt genial !!!
Also das hier :
Zitat: |
Die X-Achse verläuft zur rechten positiv, zur linken negativ (klar), in den Bildschirm hinein, ist die Y-Achse positiv, hinter Dir wird sie negativ. Die Z-Achse gibt die Höhe an. |
Ich denke die Z-Achse geht in den Bildschirm hinein nach Minus und hinter mir wird sie positiv....wurde mir so erklärt.
Na wie denn nun ?
Ich versuch dein Beispiel erst mal zum laufen zu bekommen, mal sehen ob ich das hinbekomme....Dank Dir erst mal, bis gleich denke ich
Matthias
|
|
goose 
      
Beiträge: 93
|
Verfasst: Fr 24.02.06 20:07
Hallöchen,
ich hab gerade im DGL Forum ne Antwort bekommen die das Problem löst.
Hab auch schon gefragt, da ich das noich nicht so richtig verstehe, warum das denn nun so funktioniert.
Ich danke Dir für Deine Mühe !
Matthias
www.delphigl.com/for...ic.php?p=43064#43064
Ps.: Jetzt möchte ich ja gerne noch mit der Maus auf die Scene klicken und dann soll die Scene an der Position zentriert werden
Na mal schauen
|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Fr 24.02.06 22:24
Um dennoch deine Frage zur Z-Achse zu beantworten  Das gilt auch noch weiterhin. Allerdings verläuft die Z-Achse normalerweise ja nach vorne hin negativ. Ich habe die Szene so gedreht, dass die Z-Achse negativ nach oben verläuft. Man sieht dies beim gluLookAt gut, dass ich subtrahiere, anstatt zu addieren. Wenn man sich jedoch primär nur auf zwei Ebenen bewegt ist diese Konstellation IMAO einfacher, weil die Höhe seltener Verändert wird als man Objekte entlang der Y-Achse platziert. Das -1 bei der Y-Achse dient nur dazu, damit man nicht direkt von oben drauf blickt, sondern ganz leicht versetzt. Die Szene wirkt dadurch dreidimensionaler und es kann nicht passieren, dass eine Line plötzlich verschwindet, weil man direkt von oben drauf schaut.
Und für alle die mitlesen und in den künftigen Jahren eine Frage stellen: Das ist die Positionierung, die ich immer meine, wenn ich sage, dass jemand der eine Iso-Engine heutzutage in 2D schreibt - schlichtweg zuviel Zeit hat
So nun mal schauen, was die Jungs geschrieben haben 
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
|