Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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_C++_Opengl - Fatal编程技术网

C++ 使用局部旋转的Opengl

C++ 使用局部旋转的Opengl,c++,opengl,C++,Opengl,我一直在尝试使旋转工作,它似乎工作,我的问题发生在我尝试移动对象时,我希望对象的轴与网格一起旋转,但它保持全局轴,并继续在该轴上移动对象。 我对旋转的理解有缺陷吗?或者是代码导致了这种情况的发生,如果我的理解是问题的话,是否有一种方法可以用对象平移对象轴。我的代码如下 Projection= glm::perspective(45.f, 4.0f / 3.0f, 0.1f, 100.0f); //position and direction are calculated based on mo

我一直在尝试使旋转工作,它似乎工作,我的问题发生在我尝试移动对象时,我希望对象的轴与网格一起旋转,但它保持全局轴,并继续在该轴上移动对象。 我对旋转的理解有缺陷吗?或者是代码导致了这种情况的发生,如果我的理解是问题的话,是否有一种方法可以用对象平移对象轴。我的代码如下

Projection= glm::perspective(45.f, 4.0f / 3.0f, 0.1f, 100.0f);

//position and direction are calculated based on mouse position
View      = glm::lookAt(
position,
position+direction,
up
);
glm::mat4 myMatrix = glm::translate(x,y,z);
glm::mat4 myScalingMatrix = glm::scale(0.2f, 0.2f ,0.2f);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 tempModel = glm::mat4(1.f);
glm::mat4 myRotationMatrix =glm::rotate( tempModel,45.f, myRotationAxis );

glm::mat4 Model= myMatrix* myRotationMatrix *myScalingMatrix;

glm::mat4 MVP = Projection* View * Model;

查看矩阵乘法顺序,因为顺序很重要。在本例中,首先缩放对象,然后旋转对象,最后根据全局轴移动对象。通过切换乘法,您可以先移动,然后按所需的角度旋转整个局部坐标系,不仅会导致obejct旋转,还会导致运动轴旋转

glm::mat4 Model= myRotationMatrix * myMatrix *myScalingMatrix;

查找矩阵乘法顺序,因为顺序很重要。在本例中,首先缩放对象,然后旋转对象,最后根据全局轴移动对象。通过切换乘法,您可以先移动,然后按所需的角度旋转整个局部坐标系,不仅会导致obejct旋转,还会导致运动轴旋转

glm::mat4 Model= myRotationMatrix * myMatrix *myScalingMatrix;

由于旋转矩阵仅适用于以原点为中心的旋转(即(0,0,0)),因此您需要前后将原点切换到对象的中心

假设您的对象位于(X,Y,Z)。然后,如果要以该对象为中心旋转,则需要首先平移(-X,-Y,-Z),然后进行旋转,然后将(X,Y,Z)平移回原始位置,以便对对象执行旋转中心

此图显示了它的实际工作原理:


以下是包含上述图片的示例,其中还包括一些有关旋转的基础知识。

由于旋转矩阵仅适用于以原点为中心的旋转(即,(0,0,0)),因此需要以来回方式将原点切换到对象的中心

假设您的对象位于(X,Y,Z)。然后,如果要以该对象为中心旋转,则需要首先平移(-X,-Y,-Z),然后进行旋转,然后将(X,Y,Z)平移回原始位置,以便对对象执行旋转中心

此图显示了它的实际工作原理:


这是包含上述图片的图片,其中还包括一些关于旋转的基本知识。

在我的例子中,我只是画了一个简单的三角形,并在玩变换。当我的三角形有坐标时:

{0.0,2.0,-10.0,
-2.0,-2.0,-10.0,
2.0,-2.0,-10.0};
缩放如您所说,因为它相对于中心0.0、0.0、0.0进行缩放。沿y轴的旋转也搞砸了。显而易见的解决办法是将相机向后移动,并将对象置于中心

{0.0,2.0,0.0,
-2.0,-2.0,0.0,
2.0,-2.0,0.0};

这是一个很小的例子,在关注所有的数学问题时很容易被忽略。所以确保你的物体在中心。

在我的例子中,我只是画了一个简单的三角形,并在玩变换。当我的三角形有坐标时:

{0.0,2.0,-10.0,
-2.0,-2.0,-10.0,
2.0,-2.0,-10.0};
{0.0,2.0,0.0,
-2.0,-2.0,0.0,
2.0,-2.0,0.0};
缩放如您所说,因为它相对于中心0.0、0.0、0.0进行缩放。沿y轴的旋转也搞砸了。显而易见的解决办法是将相机向后移动,并将对象置于中心

{0.0,2.0,0.0,
-2.0,-2.0,0.0,
2.0,-2.0,0.0};

这是一个很小的例子,在关注所有的数学问题时很容易被忽略。因此,请确保您的对象位于中心。

漂亮的数字。你在哪里/怎么做的?@axon:至于如何找到它们,我在google images中使用关键字
计算机图形旋转平移(以位置为中心)
。嗯,有趣的是,我需要将平移应用到中心渲染一个帧,然后将其发送回去吗?我按照Matzi的回答做了,但现在我的翻译位置不对,我猜这就是原因。@IPhantasmI是的,你需要应用翻译两次。如图所示,第一个用于旋转,第二个用于恢复原始位置。@IPhantasmI不客气!谢谢你接受我的回答!好数字。你在哪里/怎么做的?@axon:至于如何找到它们,我在google images中使用关键字
计算机图形旋转平移(以位置为中心)
。嗯,有趣的是,我需要将平移应用到中心渲染一个帧,然后将其发送回去吗?我按照Matzi的回答做了,但现在我的翻译位置不对,我猜这就是原因。@IPhantasmI是的,你需要应用翻译两次。如图所示,第一个用于旋转,第二个用于恢复原始位置。@IPhantasmI不客气!谢谢你接受我的回答!这似乎起到了作用,但由于某种原因它打乱了我的翻译。这似乎起到了作用,但由于某种原因它打乱了我的翻译。你进行转换的顺序决定了最终结果,拥有一个强大的心理模型来描述它是如何工作的非常重要:你进行转换的顺序决定了最终结果,拥有一个强大的心理模型来描述它是如何工作的非常重要:
{0.0,2.0,0.0,
-2.0,-2.0,0.0,
2.0,-2.0,0.0};