OpenGL / GLM - 切换坐标系方向

时间:2012-08-03 22:54:03

标签: c++ math opengl

我正在转换一些旧软件以支持OpenGL。 DirectX和OpenGL有不同的坐标系(OpenGL是正确的,DirectX是左图)。我知道在旧的固定管道功能中,我会使用:

glScalef(1.0f, 1.0f, -1.0f);

这一次,我正在使用GLM和着色器,需要兼容的解决方案。我已经尝试将我的相机矩阵乘以缩放矢量而没有运气。

这是我的相机设置:

// Calculate the direction, right and up vectors
 direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
 right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
 up = glm::cross(right, direction);

 // Update our camera matrix, projection matrix and combine them into my view matrix
 cameraMatrix = glm::lookAt(position, position+direction, up);
 projectionMatrix = glm::perspective(50.0f, 4.0f / 3.0f, 0.1f, 1000.f);
 viewMatrix = projectionMatrix * cameraMatrix;

我尝试过许多方法,包括反转矢量和反转着色器中的z坐标。我还试过乘以各种矩阵和向量的倒数,并将相机矩阵乘以缩放矢量。

1 个答案:

答案 0 :(得分:5)

不要考虑那么多的手性。确实,他们使用不同的约定,但你可以选择不使用它们,它归结为两个API几乎相同的东西。我的建议是在两个API中使用完全相同的矩阵和设置,除了这两件事:

从DX到GL的所有操作都需要:

  1. 反转剔脸面圈 - 默认情况下DX逆时针剔除,而这就是GL保持的状态。
  2. 针对不同的深度范围进行调整:DX使用0(近)到1(远)的深度范围,而GL使用-1的近距离和1远的有符号范围。您可以将其作为投影矩阵中的“最后一步”。
  3. DX9也存在像素坐标偏移的问题,但这完全是另外一个问题,而且DX10以后不再是问题。

    根据您的描述,绕组可能是您的问题,因为您正在使用GLM函数生成对OpenGL来说应该没问题的矩阵。