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

Aktuelle Zeit: Do Jul 17, 2025 02:06

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 25, 2005 12:48 
Offline
DGL Member

Registriert: Mo Apr 05, 2004 19:51
Beiträge: 105
@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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 25, 2005 21:53 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm..Und was ist mit Frustumculling? Oder hab ich da was falsch verstanden?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 26, 2005 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
if(CamPosX>0 && CamPosY!=0) movementAngel=atan(CamPosY/CamPosX)-radiant; //radiant = Drehwinkel im Winkelmaß
if(CamPosX<0 && CamPosY!=0) movementAngel=atan(CamPosY/CamPosX)-(PI+radiant);
if(CamPosX==0 && CamPosY>0) movementAngel=PI/2-radiant;
if(CamPosX==0 && CamPosY<0) movementAngel=1.5*PI-radiant;
if(CamPosX>0 && CamPosY==0) movementAngel=-radiant;
if(CamPosX<0 && CamPosY==0) movementAngel=PI-radiant;
radius=sqrt(pow(CamPosX,2)+pow(CamPosY,2));

fieldMatrix[i][j].posX=fieldMatrix[i][j].posX+radius*cos(movementAngel);
fieldMatrix[i][j].posY=fieldMatrix[i][j].posY+radius*sin(movementAngel);

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:
  1.  
  2. glRotatef(-radiant,0,0,1);
  3.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 27, 2005 13:06 
Offline
DGL Member

Registriert: Di Jan 18, 2005 21:51
Beiträge: 12
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:
  1.  
  2.             starvekx=(fieldMatrix[i][j].posX-centerX);
  3.                     starveky=(fieldMatrix[i][j].posY-centerY);
  4.             u1r=(starvekx*zoomFactor);
  5.             v1r=(starveky*zoomFactor);
  6.  
  7.                         fieldMatrix[i][j].posX=u1r+centerX;
  8.             fieldMatrix[i][j].posY=v1r+centerY;
  9.  

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 ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 27, 2005 13:28 
Offline
Guitar Hero
Benutzeravatar

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... 8)
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 27, 2005 14:57 
Offline
DGL Member

Registriert: Di Jan 18, 2005 21:51
Beiträge: 12
Flash hat geschrieben:
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. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 27, 2005 17:32 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 27, 2005 21:55 
Offline
Guitar Hero
Benutzeravatar

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... 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 28, 2005 01:48 
Offline
DGL Member

Registriert: Di Jan 18, 2005 21:51
Beiträge: 12
Ä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 ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 28, 2005 16:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du mal das CompGeoScript angegeuckt (Links -> General -> CompGeo)? Dort sind die entsprechenden Matrizen drinnen.

Weichtig is noch die Reihenfolge. Du multiplizierst nicht die Punkte mit der Matrix sondern wendest die Matrix auf die Punkte an (A * P nicht P * A)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 30, 2005 13:30 
Offline
DGL Member

Registriert: Di Jan 18, 2005 21:51
Beiträge: 12
Tut alles mit dem Matrizen. Ihr habt mir wirklich mal wieder sehr weitergeholfen, vielen Dank.:D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.010s | 14 Queries | GZIP : On ]