如何显示天空球?

时间:2011-06-12 11:46:44

标签: android opengl-es-2.0

我需要将天空球放置在相机所在的3D空间中。

我设置了相机如下:

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

此代码显示一个球体。禁用背面剔除,我可以看到球体的两侧(纹理具有透明部分)。 为了在相机位置显示球体,我尝试移动相机。但是如果我在Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, 0f, 0f, 0f, 0f, 1.0f, 0.0f)的开头取消注释drawSphere(),它就不会显示任何内容。可能与剪裁平面有关吗? 请举例说明如何正确定位球体。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

好的,所以我想出了怎么做。
1.看正确的角度 3.画出天空球 2.清除Z缓冲区 3.重新定位相机 4.完成剩下的工作。