OpenGL 在模型视图中使用左手坐标系
OpenGL use left handed coordinate system in model view
在我的 OpenGL 中,我想为模型使用左手坐标系 space,而为视图使用右手坐标系 space。那是因为如果把我当成坐标系的原点:
- 对我来说,很远的东西在我面前有一个正 z 坐标,所以我必须在模型视图中使用左手坐标系
- 如果我往回走,我可以将
z -= 1
放入创建我的视图矩阵的 setLookAtM
方法中,通常如果我往回走,我必须在向后走时减去 z 值
我使用 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 ]
在我的 OpenGL 中,我想为模型使用左手坐标系 space,而为视图使用右手坐标系 space。那是因为如果把我当成坐标系的原点:
- 对我来说,很远的东西在我面前有一个正 z 坐标,所以我必须在模型视图中使用左手坐标系
- 如果我往回走,我可以将
z -= 1
放入创建我的视图矩阵的setLookAtM
方法中,通常如果我往回走,我必须在向后走时减去 z 值
我使用 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 ]