2010-12-06 76 views
2

我有一個簡單的opengl應用程序,可以顯示任意3D模型。我想實現縮放。我現在使用glScale,並在一定程度上工作。不過,我有兩個問題。opengl「zoom」:對象裁剪和亮度

  1. 任何形式的縮放(+)都會快速到達對象邊緣位於近剪裁平面內的點。現在,我的zNear類似於0.1,所以增加對象的比例會導致剪輯是有意義的。我想知道是否有其他方法可以達到更好的效果。

  2. 當我放大時,對象變暗。縮小並變得更亮。我在0,0,100左右有一個明亮的位置。我有非常簡單的燈光定位在0,0,100,只使用漫反射。

    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); 
    

我沒有衰減設置,我相信要啓用需要使光通過距離的影響。無論如何,我不會改變物體的距離,只是縮放它。確定臉部的位置正在改變,但並不顯着。無論如何,我想放大會導致它變得更亮,而不是更暗。

這恰好在android平臺上使用opengl-es 1.0,如果這是相關的。

任何幫助表示讚賞。

回答

1

#2的部分答案是我沒有縮放我的法線。換句話說,當物體縮小時,先前標準化的正常值具有更大(相對)的幅度,導致臉部反射更多光線,反之亦然。

你可以設置一個參數,

glEnable(GL_NORMALIZE) 

,它解決了這個問題,在一些額外計算的代價。整個故事在這裏, http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/

(見#16)。

1

縮放會改變你的對象被點亮的方式,因爲法線也被縮放(正如你在自己的答案中指出的,可以通過調用glEnable(GL_NORMALIZE)來強制)。請注意,根據指定,當他們在,燈本身可能沒有相應的等價變換: http://www.opengl.org/resources/faq/technical/lights.htm

光的位置由當前模型視圖矩陣的位置與到glLight調用中指定的時間轉換* ()。

根據所需的縮放效果類型,您可以通過不同的方式實現縮放。

如果您真的想以相機上變焦鏡頭的方式「變焦」,那麼您可以將視場參數傳遞到gluPerspective。這就意味着你會產生扁平或誇張的視角效果,就像你使用真實的相機一樣。

典型應用更常見的是改變相機相對於物體的位置。最簡單的方法是使用gluLookAt

注意投影和模型視圖矩陣之間的差異;應該對投影做出不斷變化的視角,而定位相機應該影響模型視圖。請參閱http://www.sjbaker.org/steve/omniv/projection_abuse.html

nb ...我剛剛意識到您使用的OpenGL-es可能不支持這些確切的功能;你應該能夠很容易地找到如何達到相同的結果。

+0

我以前曾嘗試縮放GLU.lookAt()眼睛Z參數。效果是什麼,直到一些門檻,然後對象開始削減。對象的(表觀)大小從未改變。 – 2010-12-07 01:02:48

+0

如果您使用的是正投影(或非常小的FOV視角,傾向於相同的事物),會發生這種情況。 – PeterT 2010-12-07 10:05:35