问题:

应用投影矩阵后,Vulkan右手坐标系变为左手坐标系。如何使其与Vulkan坐标系一致?

细节:

我知道Vulkan是右手坐标系


X +指向右侧
Y +指向下方
Z +指向屏幕内部


我在顶点着色器中有这行:https://github.com/AndreaCatania/HelloVulkan/blob/master/shaders/shader.vert#L23

gl_Position = scene.cameraProjection * scene.cameraView * meshUBO.model * vec4(vertexPosition, 1.0);


此时:https://github.com/AndreaCatania/HelloVulkan/blob/master/main.cpp#L62-L68我正在定义摄像机在场景中心的位置以及框在(4,4,-10)世界空间的位置

结果是这样的:

graphics - Vulkan右手坐标系变为左手-LMLPHP

如您在上图中所看到的,我在屏幕内获得Z点,但它应该是正数。

是预期的,我需要添加更多内容还是做错了什么?

代码的有用部分:

投影计算:https://github.com/AndreaCatania/HelloVulkan/blob/master/VisualServer.cpp#L88-L98

void Camera::reloadProjection(){
    projection = glm::perspectiveRH_ZO(FOV, aspect, near, far);
    isProjectionDirty = false;
}


相机UBO填充:https://github.com/AndreaCatania/HelloVulkan/blob/master/VisualServer.cpp#L403-L414

    SceneUniformBufferObject sceneUBO = {};
    sceneUBO.cameraView = camera.transform;
    sceneUBO.cameraProjection = camera.getProjection();

最佳答案

我不使用也不知道Vulcan,但是透视投影矩阵(至少在OpenGL中)是在Z-方向上看的,该方向会使坐标系的一个轴反转。这会颠倒坐标系的缠绕规则。

如果要保留原始绕组,而不仅仅是在矩阵中反转Z轴矢量,请参见:


Understanding 4x4 homogenous transform matrices


因此,可以按照与Z相似的方式或通过直接矩阵单元格访问来按-1缩放glScale(1.0,1.0,-1.0);轴。

关于graphics - Vulkan右手坐标系变为左手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49346732/

10-09 04:09