1

我一直在尝试让旋转工作,它似乎工作,当我尝试移动对象时出现我的问题,我期待对象的轴与网格一起旋转,但它保持全局轴并继续移动该轴上的对象。我对轮换的理解有缺陷吗?或者是导致这种情况发生的代码,如果我的理解是问题是否有办法用对象转换对象轴。我的代码如下。

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;
4

3 回答 3

2

查找矩阵乘法顺序,因为顺序很重要。在您的情况下,您首先缩放,然后旋转对象,最后根据全局轴移动它。通过切换乘法,您可以先移动,然后将整个局部坐标系旋转您想要的角度,不仅会产生对象旋转,还会产生运动轴旋转。

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

关于这个问题的一些参考。

于 2013-06-11T23:13:23.087 回答
2

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

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

这张图片显示了它的实际工作原理: 在此处输入图像描述

这是包含上图的链接,其中还包括一些关于旋转的基础知识。

于 2013-06-11T23:14:23.113 回答
0

就我而言,我只是画了一个简单的三角形并进行了转换。当我的三角形有坐标时:

{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};

这是一个微不足道的案例,在专注于所有数学时很容易被忽略。因此,请确保您的对象位于中心。

于 2014-03-17T02:01:14.140 回答