@Flash: Wenn ich Good_Punk richtig verstehe, bringt das so aber nichts. Wenn er nämlich 2 Mio. Bäume vor sich hat, muss ja er von der Kameraposition und deren Orientierung aus entscheiden können, welche davon denn gerendert werden sollen (das wären im Normalfall höchstens 100). Wenn er nur die Kamera herumdreht, lässt sich ein solches Culling nicht bewerkstelligen.
Soweit ich das hier entnehmen kann machst du folgendes:
Die Punktdarstellung wird von (X,Y) in ein Winkel,Radius Darstellung umgewandelt.
Dann addierst du bzw. ziehst du radiant vom Erhalten winkel ab und wandelst den Punkt wieder in die X,Y Darstellung zurück.
Für dies was nicht mehr als eine Rotation ist machst du so einen Aufwand.(sin,cos usw. sind sehr langsam)
Ich hab das auch mal so wie du gemacht und hab mich später genauer mit Matrizen befasst und ein Projekt das auf dieser umständlichen Technik bassierte aufgegeben.(das war übrigens Florians3D und wurde hier als exe veröffentlicht)
Dein Problem könntest du durch eine einfache Rotation der Modelview-Matrix lösen.
Code:
glRotatef(-radiant,0,0,1);
MfG
Flo
PS: Das Wiki hat einen interessanten "Matrix" Artikel.
PS': Falls du es noch nicht getan hast schau dir mal die glPushMatrix/glPopMatrix Befehle an.
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
glRotate würde mir da überhaupt nicht weiterhelfen, weil das ja die Szene und nicht mein Array rotiert.
Und die Kamera drehe ich auch unter anderem deswegen nicht, weil mein Tutor gemeint hatte, dass anders ein Rotieren um einen Punkt sehr umständlich würde und ich lieber die Szene rotieren soll.
Naja, aber jetzt zu was "ganz" anderem. Das mit Rotation und Bewegung klappt nur scheint jetzt noch ein Fehler in meiner Scale-Funktion zu liegen, den ich nicht finde.
Also meine Szene wird mit glScale(zoomFactor, zoomFactor, zoomFactor) skaliert. zoomFactor läßt sich mit einer Taste erhöhen bzw. erniedrigen.
Für meine Datenstruktur habe ich dort diese Funktion geschrieben
Code:
starvekx=(fieldMatrix[i][j].posX-centerX);
starveky=(fieldMatrix[i][j].posY-centerY);
u1r=(starvekx*zoomFactor);
v1r=(starveky*zoomFactor);
fieldMatrix[i][j].posX=u1r+centerX;
fieldMatrix[i][j].posY=v1r+centerY;
Einfach Idee dahinter, ich messe den Abstand jedes Punktes zum Mittelpunkt der Matrix und nehme ihn mit meinem zoomFactor mal. Tut auch zum Teil, nur wenn ich "zu nahe" reinzoome (ab zoomFactor=1.5 ca.) dann wächst meine Matrix nicht in gleicher Geschwindigkeit sondern langsamer als meine Szene.
Vermutlich wieder n kleiner Fehler, aber ich seh, wie so oft, den Wald vor lauter Bäumen nicht ^^
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Drehung um einen Punkt? In OpenGL bewegst du das zu drehende Objekt an seine Anfangsposition (mit entsprechendem Radius zum KOZentrum) und rufst glRotate auf...
Wenn du's per Hand machst, brauchst du auch nur die Translations und Rotationsmatrizen nacheinander anzuwenden...
Also ich glaub du machsts dir zu kompliziert... Hab natürlich keine Ahnung wie das Projekt mal sein soll, aber ich glaub net, dass die Szene verändert werden muss.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Drehung um einen Punkt? In OpenGL bewegst du das zu drehende Objekt an seine Anfangsposition (mit entsprechendem Radius zum KOZentrum) und rufst glRotate auf...
Nicht ein Objekt sondern die Kamera sollte um die Szene drehen. Und mit GlutLookAt wäre das eben nicht so trivial.
Aber egal, ich werde das auf jeden Fall so machen wie ich's jetzt angefangen habe, deswegen schreibt doch bitte was zu der Skalierungsmethode.
Registriert: Do Jun 19, 2003 10:44 Beiträge: 991 Wohnort: Karlsfeld (nahe München)
Good_Punk hat geschrieben:
glRotate würde mir da überhaupt nicht weiterhelfen, weil das ja die Szene und nicht mein Array rotiert.
Und die Kamera drehe ich auch unter anderem deswegen nicht, weil mein Tutor gemeint hatte, dass anders ein Rotieren um einen Punkt sehr umständlich würde und ich lieber die Szene rotieren soll.
Hier bei liegt glaub ich ein Verständnis Problem. In OpenGL hast du nie so etwas wie eine Kamera.
Stattdessen täuscht man diese vor, in dem man die Szene bewegt/dreht.(<= Durch die Manipulation der Modelview-Matrix oder in speziellen Fällen auch der Projektions-Matrix)
Also wenn du eine Drehung um 30° nach links erreichen möchtest drehst du die Szene einfach um 30° nach rechts.
Und selbst wenn du die Daten und nicht das ausgegebene rotieren möchtest kannst du wie Flash schon angeteutet hat, dazu eine Rotationsmatrix verwenden.
Wenn du das Prinzip der Matrizen verstanden hast wirst du 100% das was du bisher gemacht hast über Bord werfen. Denn du machst hier aus der einfachsten Roatation oder auch Skalierung ein riesen Problem.
MfG
Flo
_________________ Danke an alle, die mir (und anderen) geholfen haben. So weit... ...so gut
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Sorry aber das kann ich jetzt net so stehn lassen...
Du kannst mittels der Projektionsmatrix eine Art Kamera vortäuschen und eine "Bewegung" durch die Szene allein durch ändern diser Projektionsmatrix machen. Man muss also die Szene nicht bewegen um sich selbst zu bewegen.
Hier mal eine etwas Bildlichere erklärung:
Die Modelviewmatrix ist eine Art Roboterarm, mit dem man Vertexe in der 3DWelt Positionieren kann. Die Koordinaten werden dem Arm übergeben und der positioniert sie (jeh nach eigenem Zustand) in der Welt.
Die Projektionsmatrix ist eine Art Kameraarm. Diese Matrix liefert Bilder aus der Welt.
Klar ist dadurch auch, dass man eine Bewegung auch mittels Roboterarm-Modelviewmatrix bewerkstelligen kann. Durch Verschieben der gesamten Welt glaubt man durch das Kameraauge gesehen, die Kamara hätte sich bewegt. Aber eigentlich wärs "einfacher" man verschiebt die Kamera.
Tatsächlich ist das verschieben der ganzen Welt in OpenGL zwar nur ein Befehl, aber das soll hier mal net stören.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Ähm ja, so vom Prinzip ist mir das schon alles klar ^^
Ich hab mich jetzt eben dafür entschieden die Kamera feststehen zu lassen und die Szene immer anzupassen, was soll's
Zu den Matrizen: also kann ich meine Punkte als Vektor abspeichern und dann irgendwie mit den entsprechenden Matrizen (ich denke mal eine für Rotation, eine für Bewergung und eine für Skalierung) multiplizieren und hab meinen neuen Punkt ?
Ich meine ich brauch zwar das ganze nur im 2-dimensionalen, aber wenns 3D soviel einfacher geht, dann sind halt alle Z-Koordinaten gleich.
Wir würde das dann aussehen, wenn ich 2-float Werte für X und Y habe und sagen wir mal -10 konstant für Z, wenn ich das dann drehen, bewegen oder skalieren wollte ?
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.