Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL/GLM-切换坐标系方向_C++_Math_Opengl - Fatal编程技术网

C++ OpenGL/GLM-切换坐标系方向

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(

我正在转换一些旧软件以支持OpenGL。DirectX和OpenGL有不同的坐标系(OpenGL在右边,DirectX在左边)。我知道在旧的固定管道功能中,我会使用:

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的端口连接只需执行以下操作:

  • 反转消隐面缠绕-默认情况下,DX消隐为逆时针方向,而GL保留该方向
  • 针对不同的深度范围进行调整:DX使用0(近)到1(远)的深度范围,而GL使用-1表示近,1表示远的有符号范围。您可以将此作为投影矩阵中的“最后一步”
  • DX9也有像素坐标偏移的问题,但这完全是另一回事,DX10以后不再有问题


    从您描述的情况来看,缠绕可能是您的问题,因为您正在使用GLM函数生成矩阵,这对于OpenGL应该是正确的。

    不要过多地考虑利手。的确,它们使用不同的约定,但是您可以选择不使用它们,这可以归结为两个API中几乎相同的事情。我的建议是在两个API中使用完全相同的矩阵和设置,除了以下两件事:

    从DX到GL的端口连接只需执行以下操作:

  • 反转消隐面缠绕-默认情况下,DX消隐为逆时针方向,而GL保留该方向
  • 针对不同的深度范围进行调整:DX使用0(近)到1(远)的深度范围,而GL使用-1表示近,1表示远的有符号范围。您可以将此作为投影矩阵中的“最后一步”
  • DX9也有像素坐标偏移的问题,但这完全是另一回事,DX10以后不再有问题


    根据您的描述,缠绕可能是您的问题,因为您正在使用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矩阵