C++ 如何使用左手坐标系进行渲染?

C++ 如何使用左手坐标系进行渲染?,c++,math,matrix,vulkan,C++,Math,Matrix,Vulkan,我正在尝试设置视图和投影矩阵,以使用我预期的世界坐标和惯用手。我要画一个左手坐标系,+X在你右边,+Y在你上面,+Z在你前面 Y坐标工作正常,但放置在摄影机前面(+Z)的对象显示在摄影机后面,因此我必须将摄影机旋转180度才能看到它们,这是一个简单的修复方法,因为翻转视图矩阵的Z可以做到这一点,但现在对象按X方向翻转(文本被视为在镜子中)。我尝试为每个对象的模型矩阵求反Z,这很好,但我觉得应该有另一个更干净的解决方案 我的问题与此类似,但我找不到合适的解决方案 这是投影矩阵代码 Matrix4

我正在尝试设置视图和投影矩阵,以使用我预期的世界坐标和惯用手。我要画一个左手坐标系,+X在你右边,+Y在你上面,+Z在你前面

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

我的问题与此类似,但我找不到合适的解决方案

这是投影矩阵代码

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个单位)


感谢您的帮助

Vulkan与非传统OpenGL和DX 11+一样,都独立于任何选择的“手工”,这是您正在使用的数学库(如果有的话)的人工制品


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

实际上,API与整个图形管道中选择的任何“右手”无关是不正确的。这一点只适用于NDC空间之前的所有事物。NDC空间有定义良好的惯用手,OpenGL是左手,Vulkan是右手。看这里:这里:这不是左手或右手的意思,这只是投影矩阵必须输出的东西。Vulkan的透视矩阵仍然有左右两个版本。根据这个博客,我将我的矩阵更新为左撇子。(交换Y和Z)现在Z是我所期望的,但每个对象都沿X轴反转。我可以翻转屏幕X,但那个轴就不能像我期望的那样工作了。不想显得粗鲁,你们的期望是站在你们这边的,我能告诉你们的就是代数就是代数。期望X轴为负数是完全可以的,但您需要自己将其写在变换矩阵链中。我给您的一个建议是,如果使用从建模应用程序导出的模型,可以在应用程序的“导出”对话框中预烘焙任何轴求反。否则,只需根据需要乘以矩阵,就足够了。