问题:
应用投影矩阵后,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)世界空间的位置
结果是这样的:
如您在上图中所看到的,我在屏幕内获得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/