【问题标题】:How do I use a left handed coordinate system for rendering?如何使用左手坐标系进行渲染?
【发布时间】:2021-07-14 23:05:20
【问题描述】:

我正在尝试设置视图和投影矩阵以使用我想要的世界坐标和惯用手。我要使用左手坐标系,+X 在您的右侧,+Y 在您上方,+Z 在您之前。

Y 坐标工作正常,但放置在相机前面的物体 (+Z) 显示在它后面,所以我必须将相机旋转 180 度才能看到它们,这是一个简单的修复,因为翻转视图矩阵' Z 做到了,但现在对象被 X 方向翻转(文本被视为在镜子中)。我尝试对每个对象 Z 的模型矩阵求反,效果很好,但我觉得应该有另一种更清洁的解决方案。

我的问题与此类似:Inverted X axis in OpenGL,但我找不到合适的解决方案。

这是投影矩阵代码。

Matrix4 BuildPerspectiveMatrix(const float32 fov, const float32 aspectRatio, const float32 nearPlane, const float32 farPlane)
{
    Matrix4 matrix;
            
    //Tangent of half the vertical view angle.
    const auto yScale = 1.0f / Tangent(fov * 0.5f);

    const auto far_m_near = farPlane - nearPlane;
    matrix[0][0] = yScale / aspectRatio; //xScale
    matrix[1][1] = -yScale; 
    matrix[2][2] = farPlane / (nearPlane - farPlane);
    matrix[2][3] = (farPlane * nearPlane) / (nearPlane - farPlane);
    matrix[3][2] = -1.0f;           
    matrix[3][3] = 0.0f;
    return matrix;
}

场景设置如下:

相机位于 (0, 0, 0)(世界中心),对象 1 位于 (0, 0, 2)(相机前方 2 个单位),对象 2 位于 (1, 0) , 2) (右侧 1 个单元,摄像机前方 2 个单元)。

感谢任何帮助!

【问题讨论】:

    标签: c++ math matrix vulkan


    【解决方案1】:

    Vulkan 与非旧版 OpenGL 和 DX 11+ 一样,都独立于任何选择的“惯用手”,这是您正在使用的数学库的产物(如果有的话)。

    至于您的实际问题,您正在构建的矩阵是右手的,因为您将-1 分配给matrix[3][2]。左手版本是相同的,只是它的位置有1

    【讨论】:

    • API 独立于图形管道中任何选择的“惯用手”实际上是不正确的。这一点只能适用于 NDC 空间之前的所有内容。 NDC 空间具有明确定义的惯用手,对于 OpenGL 是左手,对于 Vulkan 是右手。见这里:matthewwellings.com/blog/the-new-vulkan-coordinate-system 和这里:anki3d.org/vulkan-coordinate-system
    • 这不是左撇子或右撇子的意思,这正是投影矩阵必须输出的内容。 Vulkan 的透视矩阵仍然有左右两个版本。
    • 我根据此博客将我的矩阵更新为左撇子。 codersblock.org/blog/multiplayer-fps-part-7(交换 Y 和 Z)现在 Z 是我期望的样子,但是每个对象都沿 X 轴倒置。我可以翻转屏幕 X,但该轴无法按我的预期工作。
    • 不要试图听起来粗鲁,你的期望就在你身边,我只能告诉你代数就是代数。期望您的 X 轴被否定是完全可以的,但是您需要自己在变换矩阵链中写下来。我给你的一个建议是,如果你正在使用从建模应用程序导出的模型,你可以在应用程序的导出对话框中预烘焙任何轴否定。否则,只需根据需要将矩阵相乘,就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多