2010-12-06 9 views
2

Ich habe eine einfache OpenGL-App, die beliebige 3D-Modelle anzeigt. Ich möchte Zoom implementieren. was ich jetzt benutze glScale und funktioniert bis zu einem gewissen Grad. Ich habe jedoch zwei Probleme.OpenGL "Zoom": Objekt Clipping und Helligkeit

  1. Jede Art von Zoom (+) erreicht schnell den Punkt, an dem sich die Kanten des Objekts in der nahen Clipping-Ebene befinden. Momentan ist mein zNear ungefähr 0.1, also macht es Sinn, dass das Vergrößern des Maßstabs des Objekts Clipping verursacht. Ich frage mich, ob es andere Ansätze für eine bessere Wirkung gibt.

  2. Wenn ich hineinzoomiere, wird das Objekt gedimmt. verkleinern und es wird heller. Ich habe eine Lichtposition bei etwa 0, 0, 100. Ich habe eine sehr einfache Beleuchtung bei 0,0,100 positioniert und nur diffuse verwenden.

    gl.glEnable(GL10.GL_LIGHTING); 
    gl.glEnable(GL10.GL_LIGHT0); 
    gl.glEnable(GL10.GL_COLOR_MATERIAL); 
    
    
    float[] lights; 
    
    
    lights = new float[] { 0f, 0f, 0f, 1f }; 
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lights, 0); 
    lights = new float[] { 1f, 1f, 1f, 1f }; 
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lights, 0); 
    lights = new float[] { 0f, 0f, 0f, 1f }; 
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lights, 0); 
    
    
    float matAmbient[] = { 0f, 0f, 0f, 1f }; 
    float matDiffuse[] = { 1f, 1f, 1f, 1f }; 
    float matSpecular[] = { 0f, 0f, 0f, 1f }; 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0); 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0); 
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, matSpecular, 0); 
    
    
    float lightPosition[] = { mesh.mid.vertex[X], mesh.mid.vertex[Y], 100f, 
         1f }; 
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosition, 0); 
    

ich habe Dämpfungseinstellungen nicht, was ich glaube Bedürfnisse aktiviert werden das Licht zu veranlassen, nach Entfernung beeinträchtigt werden. Unabhängig davon ändere ich nicht die Entfernung des Objekts, skaliere es einfach. Sicher, die Position der Gesichter ändert sich, aber nicht signifikant. Wie auch immer, ich würde denken, dass das Heranzoomen heller und nicht schwächer wird.

dies geschieht mit opengl-es 1.0 auf der android-plattform, wenn das relevant ist.

jede Hilfe wird geschätzt.

Antwort

1

Die Teilantwort auf # 2 ist, dass ich meine Normalen nicht skaliert habe. mit anderen Worten, die zuvor normalisierten Normalwerte haben eine größere (relative) Größe, wenn das Objekt kleiner skaliert wird, was bewirkt, dass die Flächen mehr Licht reflektieren ... und umgekehrt.

Sie einen Parameter einstellen,

glEnable(GL_NORMALIZE) 

und es löst das Problem, auf Kosten von einigen zusätzlichen Berechnungen. Die ganze Geschichte ist hier, http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/

(siehe # 16).

+0

ah, ich hätte es wissen müssen. Das passiert, wenn ich spät nachts Fragen beantworte. Ich werde meine Antwort jetzt bearbeiten. – PeterT

1

Skalierung ändert die Art, wie Ihr Objekt beleuchtet wird, da auch die Normalen skaliert sind (was Sie, wie Sie in Ihrer eigenen Antwort darauf hingewiesen haben, mit einem Aufruf von glEnable(GL_NORMALIZE) erzwingen können). Beachten Sie, dass je nachdem, wann sie festgelegt sind, die Lichter selbst können nicht die äquivalente Transformation haben: http://www.opengl.org/resources/faq/technical/lights.htm

einer Position des Lichts, das von der aktuellen Modelview Matrix zum Zeitpunkt transformiert wird die Position mit einem Aufruf an glLight angegeben *().

Je nach Art des gewünschten Zoomeffekts können Sie den Zoom auf verschiedene Arten erzielen.

Wenn Sie buchstäblich wie ein Zoomobjektiv an einer Kamera "zoomen" möchten, können Sie den in gluPerspective übergebenen Sichtfeldparameter ändern. Dies bedeutet, dass Sie den Effekt einer abgeflachten oder übertriebenen Perspektive haben, wie Sie es mit einer echten Kamera tun.

Was normalerweise von typischen Anwendungen gewünscht wird, ist die Position der Kamera in Bezug auf das Objekt zu ändern. Der einfachste Weg dazu ist gluLookAt.

Vorsicht vor dem Unterschied zwischen Projektions- und Modelview-Matrizen; Die Perspektive sollte bei der Projektion geändert werden, während die Positionierung der Kamera die Modellansicht beeinflussen sollte. Siehe http://www.sjbaker.org/steve/omniv/projection_abuse.html

nb ... Ich habe gerade festgestellt, dass die OpenGL-es, die Sie verwenden, diese genauen Funktionen möglicherweise nicht unterstützen; Sie sollten in der Lage sein, leicht zu finden, wie Sie die gleichen Ergebnisse erzielen.

+0

Ich hatte zuvor versucht, den GLU.lookAt() Eye Z-Parameter zu skalieren. der Effekt war nichts bis zu einem bestimmten Schwellenwert und dann begann das Objekt zu beschneiden. Die (scheinbare) Größe des Objekts hat sich nie geändert. –

+0

Das würde passieren, wenn Sie orthographische Projektion (oder eine sehr kleine FOV-Perspektive, die in Richtung der gleichen Sache neigt) verwenden. – PeterT