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
OpenGl局部坐标旋转_Opengl_Rotation_Glm Math - Fatal编程技术网

OpenGl局部坐标旋转

OpenGl局部坐标旋转,opengl,rotation,glm-math,Opengl,Rotation,Glm Math,我一直在尝试围绕对象的局部坐标旋转对象,然后根据旋转的坐标将其移动,但未能达到预期的结果, 为了更深入地解释这个问题,我在空间的某个点上有一个对象,我需要围绕它自己的原点而不是全局原点旋转它,然后根据新旋转的轴平移对象,经过多次实验,我发现我可以围绕原点旋转对象,但坐标不会随原点旋转,或者可以让对象局部坐标随原点变换,但它会围绕全局原点旋转 目前,我的旋转/平移/缩放代码如下所示 glm::mat4 myMatrix = glm::translate(glm::mat4(1.0f),trans)

我一直在尝试围绕对象的局部坐标旋转对象,然后根据旋转的坐标将其移动,但未能达到预期的结果, 为了更深入地解释这个问题,我在空间的某个点上有一个对象,我需要围绕它自己的原点而不是全局原点旋转它,然后根据新旋转的轴平移对象,经过多次实验,我发现我可以围绕原点旋转对象,但坐标不会随原点旋转,或者可以让对象局部坐标随原点变换,但它会围绕全局原点旋转

目前,我的旋转/平移/缩放代码如下所示

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;

您需要将旋转矩阵应用于平移向量trans

因此,假设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;
所以要完成这个答案,如果模型中心不是0,0,0,你必须计算 模型的边界,并将其平移一半减去模型左下角顶点

这里有很好的解释:


根据提供的代码,答案是最好的。。。如果您需要更多详细信息,请提供一些屏幕截图和投影和视图矩阵计算的详细信息

这是一个很小的问题,因此我无法编译代码,trans是一个vec3,很容易通过将其转换为vec4来解决,但显然vec4与glm Translate不兼容。如前3个组件:代码正常工作,但它会围绕全局原点而不是自身的局部原点旋转我的模型,然后根据旋转进行平移,因此平移是我的目标但旋转不是,它是围绕模型中心旋转的。如果它的顶点不以0,0,0为中心,则必须在旋转之前通过模型中心和0,0,0之间的差值对其进行平移。因此,你将有两个新的翻译和回来得到有效的模型中心在0,0,0来回对不起,我的英语泄漏