Soll ich besser glTranslatef() oder gluLookAt() benutzen?

Status
Nicht offen für weitere Antworten.

magma

Mitglied
Einen schönen guten Tag an alle.

Ich programmiere hier ein 3D Szenario mit Java und opengl.
Ich habe hier eine kleine Plattform erstellt und auf ihr zwei Würfel plaziert.
Ich will mich nun auf die Würfel zu bewegen und wieder von ihnen weg.

Wie fange ich das am besten an.

1. Soll ich mit glTranslatef(0.0f, 0.0f, z_wert); alles in der z-Richtung verschieben.
Die Plattform und die sich darauf befindlichen Gegenstände.

2. Oder ist es besser gluLookAt(); zu verwenden und so ein darauf zu und ein davon
„weg-bewgen“ zu erreichen

Ich will mich dann spaeter auch in dem Szenario Drehen.


magma
 

Marco13

Top Contributor
Hm - mach doch, was du willst :wink: Also, du hast geschrieben
Ich will mich nun auf die Würfel zu bewegen und wieder von ihnen weg.
Angenomen, du würdest das jetzt mit
glTranslatef(0.0f, 0.0f, z_wert);
machen. Wenn du dann zusätzlich die Plattform auf dich zu bewegen willst, darfst du irgendwelche wild-wüsten z-Werte ausrechnen, so dass es stimmt.

Ich würde ganz pauschal und pragmatisch sagen: Wenn man die Szene bewegen will, verwendet man glTranslatef. Wenn man sich selbst (also den Betrachter) bewegen will, verwendet man gluLookAt (oder eine analoge Methode). Das entspricht genau der OpenGL-eigenen Trennung zwischen der MODELVIEW_MATRIX und der PROJECTION_MATRIX (oder wie datt Ding hieß...)
 

Evil-Devil

Top Contributor
Ich würde immer glTransform benutzen, weil du mit gluLookAt eigentlich nur die Betrachtungsmatrix definierst.

Und ob sich die Welt nun um dich dreht oder du dich um die Welt ist doch nur eine Frage der Perspektive ;)

Und bei glulookat wäre der Rattenschwanz den du nebenbei bräuchtest noch viel größer. Denn warum sollte man die Perspektive jedesmal wenn sich etwas bewegt neu berechnen, anstatt nur das was sich bewegt hat zu errechnen?
 

magma

Mitglied
Hallo Evil-Devil.
...bei glulookat wäre der Rattenschwanz...
Darauf wollte ich hinaus. Was für das Programm mehr oder weniger Aufwand ist.

Danke an euch beide.


magma
 

Marco13

Top Contributor
Was genau meint ihr denn nun mit "Rattenschwanz"? Die ein, zwei furz-Matrixmultiplikationen, die innerhalb von 42 Mikrosekunden gemacht werden können? Wenn sich der Betrachter bewegt, bewegt sich der Betrachter, und wenn sich die Szene bewegt, bewegt sich die Szene. IMHO ein schönes Beispiel für "KISS". Man kann es sich (und demjenigen, der den Code vielleicht mal irgendwann nachvollziehen muss) einfach machen, oder aus falscher Sparsamkeit etwas schreiben, wovon man nach ein paar Monaten selbst nichtmehr weiß, was man dort gemacht hat. Aber ... egal ... nochmal (diesmal mit einer etwas anderen Bedeutung) : Man kann ja machen, was man will...
 

Evil-Devil

Top Contributor
Ich meine zb. diesen Thread:
http://www.idevgames.com/forum/archive/index.php/t-8731.html

FÜr eine einfache Szene ist gluLookAt einfach zu nutzen...aber bei einer sehr umfangreichen Szene wie sie in jedem Spiel nunmal vorkommt sind einzelne Aufrufe von glTranslate und glRotate einfacher.

gluLookAt führt zwar zum selben Resultat wie glTranslate, ruft aber auch noch glRotate mit auf.

Ich persönlich finde es besser, wenn die Welt sich um den Betrachter dreht und nicht der Betrachter um die Welt.
 

Marco13

Top Contributor
Es kommt (wenn überhaupt) dann nicht darauf an, wie einfach oder umfangreich die Szene ist. Wie in dem verlinkten Thread auch gesagt wurde ist es hauptsächlich "Geschmacksache". Aber ein bißchen kommt es vielleicht auch darauf an, was man machen will. Bei einer Flugsimulation wäre vielleicht glRotate/Translate besser, und bei einem First-Person-Shooter eher gluLookAt (nur als Beispiel) ...

EDIT: Abgesehen davon war die Frage im Anfangspost ja auch eine andere: Dort ging es darum, ob die Szene oder die Kamera bewegt werden soll. Und ich finde, er sollte die Kamera bewegen (und NUR darauf wollte ich hinaus). Ob der das nun mit gluLookAt oder "per Hand" macht, ist egal....
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben