C++ OpenGL/GLM-切换坐标系方向
我正在转换一些旧软件以支持OpenGL。DirectX和OpenGL有不同的坐标系(OpenGL在右边,DirectX在左边)。我知道在旧的固定管道功能中,我会使用:C++ OpenGL/GLM-切换坐标系方向,c++,math,opengl,C++,Math,Opengl,我正在转换一些旧软件以支持OpenGL。DirectX和OpenGL有不同的坐标系(OpenGL在右边,DirectX在左边)。我知道在旧的固定管道功能中,我会使用: glScalef(1.0f, 1.0f, -1.0f); 这一次,我正在使用GLM和着色器,需要一个兼容的解决方案。我试着用我的相机矩阵乘以一个缩放向量,但没有成功 这是我的相机设置: // Calculate the direction, right and up vectors direction = glm::vec3(
glScalef(1.0f, 1.0f, -1.0f);
这一次,我正在使用GLM和着色器,需要一个兼容的解决方案。我试着用我的相机矩阵乘以一个缩放向量,但没有成功
这是我的相机设置:
// Calculate the direction, right and up vectors
direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
up = glm::cross(right, direction);
// Update our camera matrix, projection matrix and combine them into my view matrix
cameraMatrix = glm::lookAt(position, position+direction, up);
projectionMatrix = glm::perspective(50.0f, 4.0f / 3.0f, 0.1f, 1000.f);
viewMatrix = projectionMatrix * cameraMatrix;
我尝试了很多方法,包括反转矢量和反转着色器中的z坐标。我还尝试过用各种矩阵和向量的倒数相乘,并用缩放向量乘以相机矩阵。不要过多考虑利手。的确,它们使用不同的约定,但是您可以选择不使用它们,这可以归结为两个API中几乎相同的事情。我的建议是在两个API中使用完全相同的矩阵和设置,除了以下两件事: 从DX到GL的端口连接只需执行以下操作:
从您描述的情况来看,缠绕可能是您的问题,因为您正在使用GLM函数生成矩阵,这对于OpenGL应该是正确的。不要过多地考虑利手。的确,它们使用不同的约定,但是您可以选择不使用它们,这可以归结为两个API中几乎相同的事情。我的建议是在两个API中使用完全相同的矩阵和设置,除了以下两件事: 从DX到GL的端口连接只需执行以下操作:
根据您的描述,缠绕可能是您的问题,因为您正在使用GLM函数生成矩阵,这对于OpenGL来说应该是正常的。我没有运气就反转了缠绕。它将“内部”区域变为“外部”区域,反之亦然。您是否有任何代码可以使用GLM或着色器正确反转深度范围?这正是我想要的。当然,只需将对角线上有1,1,2,1且偏移列中有0,0,-1的矩阵“左乘”到DirectX中使用的投影矩阵。除此之外,使用完全相同的矩阵!如果您使用GL中的glm和DX中的DirectX帮助程序生成它们,那么您可能只是在做一些看起来有效的不同的事情。现在我还有一个问题。我的视图截头体应该做什么更改?它不能正常工作了,好了,修好了。现在用我的投影矩阵,我所有的控件都反转了。这正常吗?我是否应该反转它们,或者这表明有什么问题。这表明您没有在两个APIsI中使用相同的modelview矩阵反转绕组,没有运气。它将“内部”区域变为“外部”区域,反之亦然。您是否有任何代码可以使用GLM或着色器正确反转深度范围?这正是我想要的。当然,只需将对角线上有1,1,2,1且偏移列中有0,0,-1的矩阵“左乘”到DirectX中使用的投影矩阵。除此之外,使用完全相同的矩阵!如果您使用GL中的glm和DX中的DirectX帮助程序生成它们,那么您可能只是在做一些看起来有效的不同的事情。现在我还有一个问题。我的视图截头体应该做什么更改?它不能正常工作了,好了,修好了。现在用我的投影矩阵,我所有的控件都反转了。这正常吗?我应该把它们颠倒过来,还是这表明出了问题。这表明您在两个API中没有使用相同的modelview矩阵