OpenGl局部坐标旋转

时间:2014-03-19 03:10:10

标签: opengl rotation glm-math

我一直试图围绕其局部坐标旋转一个物体,然后根据旋转的坐标基于它移动它,但我无法达到预期的效果, 以更深入的方式解释问题我在空间的某个点有一个物体,我需要围绕它自己的原点(不是全局原点)旋转它,然后根据新旋转的轴转换对象,之后很多实验我发现我可以旋转对象周围是原点,但坐标不会随之旋转,或者我可以让对象局部坐标随​​之变换,但它会围绕全局原点旋转。

目前我的轮播/翻译/缩放代码如下所示

glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f),trans);
glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

Model= myScalingMatrix* myRotationMatrix*myMatrix;
glm::mat4 MVP = Projection* View * Model;

我认为这是问题代码,特别是底部的第二行,但我可能错了,如果需要的话会发布更多代码。

我还尝试创建一个逆矩阵,并在计算开始时使用它,但似乎什么都不做(我可以添加我试图在需要时执行此操作的代码) 如果需要对此问题进行任何详细说明,请随时提出,我将扩展该问题 感谢。

编辑1: 在答案部分中建议稍微修改过的代码,但仍会给出相同的错误。

glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

glm::vec4 trans(x,y,z,1);
glm::vec4 vTrans = myRotationMatrix* trans ;
glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f),vTrans.x,vTrans.y,vTrans.z);
Model= myScalingMatrix* myRotationMatrix*myMatrix;

1 个答案:

答案 0 :(得分:-1)

您需要将旋转矩阵应用于平移向量(反式)。

因此,假设trans是vec4,您的代码将是:

glm::mat4 Model = glm::mat4(1.f);
glm::mat4 myScalingMatrix = glm::scale(sx, sy ,sz);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 myRotationMatrix =glm::rotate(glm::mat4(1.0f),rot, myRotationAxis);

glm::vec4 vTrans = myRotationMatrix * trans;


glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f), vTrans.xyz);

Model= myScalingMatrix* myRotationMatrix*myMatrix;
glm::mat4 MVP = Projection* View * Model;

convert vec4 to vec3

因此,要完成答案,如果模型中心不是(0,0,0),则必须进行计算 模型的边界,并将其转换为模型左下顶点的一半。

这里有很好的说明: model local origin

根据提供的代码,答案是最好的...如果您想了解更多详细信息,请提供有关投影的一些屏幕截图和详细信息以及查看矩阵计算