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 对我有用。