OpenGL 在模型视图中使用左手坐标系

OpenGL use left handed coordinate system in model view

在我的 OpenGL 中,我想为模型使用左手坐标系 space,而为视图使用右手坐标系 space。那是因为如果把我当成坐标系的原点:

我使用 android.OpenGL.Matrix 中的这些函数来创建我的视图和投影矩阵:

Matrix.setLookAtM(data, 0,     0, 0, 0,     0, 0, -1,     0, 1, 0);
Matrix.perspectiveM(projection, 45, width / height, 1f, 50f);

我能做什么/我必须更改什么才能获得上面描述的结果,以便模型的 z 轴指向屏幕,但相机的 z 轴指向屏幕外?

如果这两个矩阵无法做到这一点,我必须像现在这样接受它,因为由于时间原因,我不想每次渲染对象时都对每个 modelMatrix 应用新操作。

您可以使用任何您想要的坐标系。

如果你想要左手世界坐标系,但右手眼坐标系,这意味着你需要在视图变换中翻转惯用手。您可以将镜像变换作为视图矩阵的一部分来执行此操作。

唯一有点复杂的是 setLookAtM() 不支持它。它构建的矩阵是旋转和平移的组合,保持了惯用手性。您可以将结果与镜像变换结合起来。但是由于视图矩阵非常简单,你传递的参数,你自己构建视图矩阵也很容易。

事实上,您的 setLookAtM() 电话:

setLookAtM(data, 0,     0, 0, 0,     0, 0, -1,     0, 1, 0);

构建单位矩阵。所以如果你想翻转 z 坐标,使用这个镜像变换作为视图矩阵,而不是你现在拥有的单位矩阵:

[ 1  0  0  0 ]
[ 0  1  0  0 ]
[ 0  0 -1  0 ]
[ 0  0  0  1 ]