首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >现代OpenGL中如何使用GLM或JOML矩阵正确转换(平移、旋转、缩放)对象

现代OpenGL中如何使用GLM或JOML矩阵正确转换(平移、旋转、缩放)对象
EN

Stack Overflow用户
提问于 2018-06-09 03:54:49
回答 1查看 1.2K关注 0票数 1

我正在尝试使用矩阵来实现对象的转换,但它的工作方式很奇怪。对象中心坐标不是(0,0,0)。平移和缩放看起来不错,但旋转是围绕(0,0,0)坐标(而不是围绕着物体的中心)执行的。

我的Java代码:

代码语言:javascript
运行
复制
Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = new Vector3f(pickedObject.getCentroid().getX() + translationMatrix.m30(), pickedObject.getCentroid().getY() + translationMatrix.m31(), pickedObject.getCentroid().getZ() + translationMatrix.m32());
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.mul(xRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(translationMatrix);

我做错了什么?我需要把一个物体绕着自己的轴旋转,而不是绕着世界的中心旋转。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 07:31:14

解决方案:

代码语言:javascript
运行
复制
Matrix4f moveOriginMat = new Matrix4f();
Vector3d centroid = getPickedObjectLocalCentroid();
moveOriginMat.translation(-(float)centroid.x * (scaleMat.m00() - 1), -(float)centroid.y * (scaleMat.m11() - 1), -(float)centroid.z * (scaleMat.m22() - 1));
modelMatrix.set(moveOriginMat);
modelMatrix.mul(scaleMat);
modelMatrix.translate((float)centroid.x, (float)centroid.y, (float)centroid.z);
modelMatrix.mul(zRotationMatrix);
modelMatrix.mul(yRotationMatrix);
modelMatrix.mul(xRotationMatrix);
modelMatrix.translate(-(float)centroid.x, -(float)centroid.y, -(float)centroid.z);
modelMatrix.mul(translationMatrix);

我只需要在旋转之前加上原点的平移,在这一次之后再加上平移。另外,翻译的签名让我很困惑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50770765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档