Android OpenGL-ES:对象显示错误的手性
Android OpenGL-ES: Object is showing up with wrong Chirality
我在 Nexus 9 上 Android OpenGL ES 3.0 中渲染了一个对象。该对象有大约 80000 个顶点和几十万个三角形。
我知道这些顶点在右手坐标系中。当我使用我的电脑查看对象时(使用像 Paraview 这样的程序),我在右手坐标系中看到了该对象。但是,一旦我在 OpenGL 中的应用程序上渲染该对象,该对象就会出现错误的手性。
正如我上面提到的,我很确定我的顶点是正确的。因此,在坐标转换过程中一定发生了错误。有谁知道哪个矩阵(视图、模型、投影)可能是我问题的根源?我需要保持顶点的完整性并且不对顶点数据本身执行任何转换(如手动翻转值)。
编辑: 有人问我的代码:我不能 post 一切,因为它是一个非常大的项目,但我会告诉你行在哪里我的矩阵已设置:
在 onSurfaceCreated() 中:
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = -3.0f;
final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = 0.0f;
final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix2, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix3, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix4, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); `
在 onSurfaceChanged(GL10 glUnused, int width, int height):
GLES30.glViewport(0, 0, width, height);
viewport[0] = 0;
viewport[1] = 0;
viewport[2] = width;
viewport[3] = height;
final float ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = 1.0f;
final float far = 500.0f;
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix2, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix3, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix4, 0, left, right, bottom, top, near, far);
澄清一下,我指的对象使用 mViewMatrix 和 mProjectionMatrix,而不是其他视图矩阵和投影矩阵。如果此代码没有问题,我可以 post 更多地显示我操作这些矩阵的地方。
EDIT2: 我根本不明白为什么,但是通过更改顶点数据或应用比例矩阵手动翻转坐标(例如,翻转 z 坐标)到模型视图,并没有解决我的手性问题。我完全不知道如何解决这个问题。
终于解决了我的问题(经过 16 小时的尝试)。事实证明我剔除了错误的一面。从 GL_BACK 切换到 GL_FRONT 对我有用。
我在 Nexus 9 上 Android OpenGL ES 3.0 中渲染了一个对象。该对象有大约 80000 个顶点和几十万个三角形。
我知道这些顶点在右手坐标系中。当我使用我的电脑查看对象时(使用像 Paraview 这样的程序),我在右手坐标系中看到了该对象。但是,一旦我在 OpenGL 中的应用程序上渲染该对象,该对象就会出现错误的手性。
正如我上面提到的,我很确定我的顶点是正确的。因此,在坐标转换过程中一定发生了错误。有谁知道哪个矩阵(视图、模型、投影)可能是我问题的根源?我需要保持顶点的完整性并且不对顶点数据本身执行任何转换(如手动翻转值)。
编辑: 有人问我的代码:我不能 post 一切,因为它是一个非常大的项目,但我会告诉你行在哪里我的矩阵已设置:
在 onSurfaceCreated() 中:
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = -3.0f;
final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = 0.0f;
final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;
Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix2, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix3, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);
Matrix.setLookAtM(mViewMatrix4, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); `
在 onSurfaceChanged(GL10 glUnused, int width, int height):
GLES30.glViewport(0, 0, width, height);
viewport[0] = 0;
viewport[1] = 0;
viewport[2] = width;
viewport[3] = height;
final float ratio = (float) width / height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1.0f;
final float top = 1.0f;
final float near = 1.0f;
final float far = 500.0f;
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix2, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix3, 0, left, right, bottom, top, near, far);
Matrix.frustumM(mProjectionMatrix4, 0, left, right, bottom, top, near, far);
澄清一下,我指的对象使用 mViewMatrix 和 mProjectionMatrix,而不是其他视图矩阵和投影矩阵。如果此代码没有问题,我可以 post 更多地显示我操作这些矩阵的地方。
EDIT2: 我根本不明白为什么,但是通过更改顶点数据或应用比例矩阵手动翻转坐标(例如,翻转 z 坐标)到模型视图,并没有解决我的手性问题。我完全不知道如何解决这个问题。
终于解决了我的问题(经过 16 小时的尝试)。事实证明我剔除了错误的一面。从 GL_BACK 切换到 GL_FRONT 对我有用。