2011-01-09 51 views
2

我是一個總noob,我試圖在opengl(Blender)中顯示一個建立在3D建模程序中的小潛艇。Android和OpenGL - 通過另一個對象查看對象

潛艇是使用一個長圓柱與球體相交的末端來建造的。

我得到的問題是,當我看結果時,我可以看到整個圓柱體。我還可以通過球體看到柱體的末端。這在我點亮照明時出現。我正在使用環境照明和漫射照明。我只想看到圓柱體外側的一半球體,我不想看到任何內臟。

我有面對剔除和它刪除兩個對象的正面,但我清楚地看到球體。

下面我粘貼了我的onSurfaceCreated函數,我設置了所有的opengl參數。任何建議表示讚賞!

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    // 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    //gl.glMatrixMode(GL10.GL_PROJECTION); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 

    gl.glEnable(GL10.GL_POLYGON_OFFSET_FILL); 

    gl.glEnable(GL10.GL_LIGHTING); 
    gl.glEnable(GL10.GL_LIGHT0); 

    // Define the ambient component of the first light 
    float[] light0Ambient = {0.1f, 0.1f, 0.1f, 1.0f};   
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, FloatBufferFromFloatArray(light0Ambient, 4)); 

    // Define the diffuse component of the first light 
    float[] light0Diffuse = {0.7f, 0.7f, 0.7f, 1.0f}; 
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, FloatBufferFromFloatArray(light0Diffuse, 4)); 

    // Define the specular component and shininess of the first light 
    float[] light0Specular = {0.7f, 0.7f, 0.7f, 1.0f}; 
    float light0Shininess = 0.4f; 
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, FloatBufferFromFloatArray(light0Specular, 4));   

    // Define the position of the first light 
    float[] light0Position = {1.0f, 0.0f, 0.0f, 0.0f}; 
    gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, FloatBufferFromFloatArray(light0Position, 4)); 

    // Define a direction vector for the light, this one points correct down the Z axis 
    float[] light0Direction = {0.0f, 0.0f, -1.0f}; 
    //gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPOT_DIRECTION, FloatBufferFromFloatArray(light0Direction, 3)); 

    // Define a cutoff angle. This defines a 90° field of vision, since the cutoff 
    // is number of degrees to each side of an imaginary line drawn from the light's 
    // position along the vector supplied in GL_SPOT_DIRECTION above 
    //gl.glLightf(gl.GL_LIGHT0, gl.GL_SPOT_CUTOFF, 180.0f); 

    gl.glEnable(GL10.GL_CULL_FACE); 
    // which is the front? the one which is drawn counter clockwise 
    gl.glFrontFace(GL10.GL_CCW); 
    // which one should NOT be drawn 
    gl.glCullFace(GL10.GL_BACK); 

    gl.glClearDepthf(10f); 
    gl.glPolygonOffset(1.0f, 2); 

    initShape(); 

    gl.glScalef(0.5f, 0.5f, 0.5f); 
} 
+0

你能張貼屏幕截圖嗎? – ChrisF 2011-01-09 21:42:09

+0

法線聲音相反。 – Dave 2011-01-09 21:54:13

+0

http://img696.imageshack.us/i/13043028.png/ – 2011-01-09 21:56:48

回答

1

你有沒有試過檢查它是否是背面剔除問題?通過將glEnable(GL_CULL_FACE)更改爲glDisable來檢查它,只是爲了檢查它絕對不是這樣。可以在同一個網格上同時使用兩個纏繞順序,因此對於模型的一部分來說剔除是正確的,但對於另一部分來說剔除是錯誤的 - 最簡單的方法就是禁用它以確保這不是問題。

這是要麼你的表面可能已創建沒有深度緩衝區出於某種原因?檢查EGLConfig參數以確保不是這種情況。通常默認情況下它會創建深度緩衝區,但可以覆蓋該行爲。

另外,用內部表面建模永遠不會被看到的東西不會爲您的實時性能做好事。您應該考慮在混合器中使用布爾運算符或至少爲了擺脫內部面孔,但最終最好的方法是對模型進行精心設計,注意其拓撲結構,而不僅僅是聚合計數,還要考慮它們的性能。 (不能原諒你現在遇到的問題 - 這只是未來的一個註釋)

1

我明白了,你仍然在思考「初始化一些場景圖」。這不是OpenGL的工作方式(哎呀,這是我連續第三次寫這個答案)。你在onSurfaceCreated中做的所有事情都屬於顯示例程。 OpenGL不是一個場景圖。在繪製需要該狀態的東西之前,您先設置所需的所有狀態。

我看到你有那個函數「initShape」那裏。我不認爲這是你想要的。

+0

initShape只是打開一個文件,其中包含用於繪製形狀的所有頂點,索引和法線。 因此,我的onSurfaceCreated中的所有東西實際上都屬於onDrawFrame?我在那裏看到的所有例子都是這樣做的:)。我會繼續前進,把它放在一起。 圓柱問題中的球體呢?你認爲這會照顧到嗎? – 2011-01-09 23:12:27

1

你確定你有一個啓用了深度緩存的EGL上下文嗎?如果您正在使用GLSurfaceView,您可能正在尋找像SimpleEGLConfigChooser(false)這樣的應該是SimpleEGLConfigChooser(true)的東西。

1

讓我們看看你的onDrawFrame()?什麼是你的投影,它可以翻轉法線和一個搞砸的投影使它看起來很有趣。

您的深度緩衝區或深度測試的問題也是可能的。

編輯:它看起來像深度測試不是你的問題,因爲你可以看到你的多邊形深度剔除是相交的球體。它看起來像你的幾何是問題。

我會讓你的相機可以移動,然後你可以環顧四周,弄清楚它與什麼搞砸了。

0

如果您使用的是紋理,請查看您正在使用的混合功能。可能是重疊的像素像覆蓋效果一樣倍增而不是被覆蓋,這是你想要的。

相關問題