2011-06-12 57 views
1

我需要在相機所在的三維空間中定位天空球體。如何顯示天空球體?

我設置相機如下:

public void onSurfaceChanged(GL10 glUnused, int width, int height) { 
    // Ignore the passed-in GL10 interface, and use the GLES20 
    // class's static methods instead. 
    GLES20.glViewport(0, 0, width, height); 
    float ratio = (float) width/height; 
    Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 1000); 
} 

... 
Matrix.setLookAtM(mVMatrix, 0, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
... 

球體的直徑爲100個單位,它的中心是在(0; 0; 0)。

的方法,來繪製一個球體:

private void drawSphere() { 
    //Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 

    mTriangleVerticesSphere.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); 
    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVerticesSphere); 
    mTriangleVerticesSphere.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); 
    GLES20.glEnableVertexAttribArray(maPositionHandle); 
    GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVerticesSphere); 
    GLES20.glEnableVertexAttribArray(maTextureHandle); 

    Matrix.setRotateM(mMMatrix, 0, jitterX, 1.0f, 0, 0); 
    Matrix.rotateM(mMMatrix, 0, angleYaw + jitterY, 0, 1.0f, 0); 
    Matrix.scaleM(mMMatrix, 0, 0.01f, 0.01f, 0.01f); 
    Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0); 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0); 

    GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numPolysSphere); 
} 

這個代碼顯示一個球體。禁止背面剔除,並且可以看到球體的兩側(紋理具有透明部分)。 爲了在相機位置正確顯示球體,我嘗試移動相機。但如果我在drawSphere()開頭取消Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, 0f, 0f, 0f, 0f, 1.0f, 0.0f)它不顯示任何內容。可能與裁剪飛機有關嗎? 請舉例說明如何正確定位球體。

回答

1

好的,所以我想出瞭如何去做。
1.看正確的角度。
3.畫天空球。
2.清零Z緩衝區。
3.重新定位相機。
4.繪製其餘的。

1

我覺得你更希望做像

Matrix.setLookAtM(mvMatrix, 0, 0, 0, 10, 0, 0, 0, 0, 1, 0); 

的東西,如果我沒看錯的OpenGL不知道它看着

哪種方式你要價太高尋找(0,0, 0)朝向(0,0,0),而朝向(0,1.0,0)

+0

這是有道理的。實際上,這樣我就設置了攝像頭在場景中繪製其他對象,這樣就設置攝像頭從頂部看(0,0,0)。 我也試過'Matrix.setLookAtM(mVMatrix,0,0,0,0,0,10,0,1,0)'但無濟於事。 – keaukraine 2011-06-12 12:19:50