我正在创建3D / 2D图形引擎,我写了一些花哨的Vector2,Vector3类,Window包装器和OpenGL上下文创建框架,有一段时间我在想如何切换坐标系轴。默认情况下,OpenGL就是这样的(据我所知):
+X axis stands for Right | -X for Left
+Y axis stands for Up | -Y stands for Down
-Z stands for Forward | -Z stands for Backward
我真的,真的不想有这样的坐标,它只是让我的坐标不可读。所以我想到了UE4风格的坐标:
+X axis stands for Forward
+Y axis stands for Right
+Z axis stands for Up
如何切换这些轴?
我读过“调整”视角,但只有反转轴没有切换它们。
我的第二个问题是我可以学习一些矩阵操作(直接用于计算机图形学)?我不想下载现成的源代码或扩展。我写这个引擎的主要目的是学习数学,现在对我来说最重要的是矩阵 - 投影矩阵,旋转矩阵,平移矩阵,比例等。
答案 0 :(得分:1)
您正在描述OpenGL的剪辑空间坐标,并将其与UE4的世界空间坐标进行比较。一般来说,剪辑空间和世界空间不需要彼此有任何关系,所以比较它们并没有多大意义。
您所要做的就是创建一个视图矩阵,将您的坐标从世界空间转换为相机空间。该矩阵通常与从模型空间到世界空间的转换以及从相机空间转换到剪辑空间的矩阵相结合。结合所有三个矩阵,您可以获得" modelviewprojection"基质
您的顶点着色器最终会看起来像这样:
// In model space
in vec3 Coords;
// Conversion from model space to clip space
uniform mat4 MVP;
void main() {
gl_Position = MVP * vec4(Coords, 1.0);
}
MVP将由可以协同工作的旋转,平移和缩放矩阵组合而成。结果矩阵可能看起来像这样:
MVP =投影矩阵*旋转矩阵*平移矩阵*比例矩阵
旋转矩阵是使你的轴正确的酱汁。它看起来像这样:
旋转矩阵=绕Z轴旋转(-roll)*绕X轴旋转(pitch + pi / 2)*绕Z轴旋转(yaw-pi / 2)
我建议你使用GLM库,它提供了在GLSL中为你提供的C ++基本向量和矩阵类型和操作。这使您可以非常轻松地进行线性代数。
我不建议您自己尝试编写这些功能。它主要是一个无聊和重复的编程任务,有很多机会进行拼写错误。从经验谈起。或者,让我这样说吧。制作自己的铅笔不会让你成为更好的作家。