Vulkan右手坐标系变为左手

时间:2018-03-18 10:16:17

标签: graphics coordinate-systems vulkan

问题:

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)世界空间的方位置

结果如下:

enter image description here

正如你在上面的图片中看到的那样, 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();

1 个答案:

答案 0 :(得分:2)

我不使用或不知道Vulcan,但是透视投影矩阵(至少在 OpenGL 中)正在Z-方向看,它反转了你的一个轴坐标系。这反转了坐标系的缠绕规则。

如果您想保留原始绕组而不是仅仅在矩阵中反转Z轴向量以获取更多信息,请参阅:

所以只需将Z轴按-1缩放,或者类似于glScale(1.0,1.0,-1.0);或直接矩阵单元格访问。