【问题标题】:OpenGL/GLM - Switching coordinate system directionOpenGL/GLM - 切换坐标系方向
【发布时间】:2012-08-03 22:54:02
【问题描述】:

我正在转换一些旧软件以支持 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 坐标。我还尝试过乘以各种矩阵和向量的逆矩阵,并将相机矩阵乘以缩放向量。

【问题讨论】:

    标签: c++ math opengl


    【解决方案1】:

    不要过多考虑左右手习惯。确实,它们使用不同的约定,但您可以选择不使用它们,归结为两种 API 中几乎相同的东西。我的建议是在两个 API 中使用完全相同的矩阵和设置,但以下两点除外:

    从 DX 移植到 GL 所需要做的就是:

    1. 反转剔除面缠绕 - 默认情况下 DX 逆时针剔除,而 GL 则保留此设置。
    2. 针对不同的深度范围进行调整:DX 使用 0(近)到 1(远)的深度范围,而 GL 使用 -1 表示近,1 表示远的有符号范围。您可以将其作为投影矩阵中的“最后一步”。

    DX9 也存在像素坐标偏移问题,但这完全是另外一回事,DX10 以后不再是问题。

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

    【讨论】:

    • 我倒转了绕组,但没有运气。它将“内部”区域变为“外部”区域,反之亦然。您是否有任何代码可以使用 GLM 或着色器正确反转深度范围?这就是我所追求的。
    • 当然,只需将对角线为 1,1,2,1 且偏移列为 0,0,-1 的矩阵“左乘”到您在 DirectX 中使用的投影矩阵。除此之外,使用完全相同的矩阵!如果您使用 GL 中的 glm 和 DX 中的 DirectX 助手生成它们,您可能只是在做一些不同的事情
    • 这似乎奏效了。现在我还有一个问题。应该对我的视锥体做出什么改变?它不再正常工作。
    • 好的,解决了。现在有了我的投影矩阵,我所有的控件都被反转了。这正常吗?我应该扭转它们还是表明有问题。
    • 这表明您在两个 API 中没有使用相同的模型视图矩阵
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多