【发布时间】:2019-03-17 04:15:46
【问题描述】:
我正在尝试制作一个简单的动画,其中一个对象使用 glm lib 在 OpenGL 中围绕世界原点旋转。我的想法是:
将对象发送到原点
旋转它
回原位
让它看我想要的
这是我的实现:
// Rotates object around point p
void rotate_about(float deltaTime, glm::vec3 p, bool ended) {
glm::vec3 axis = glm::vec3(0,1,0); //rotation axis
glm::mat4 scale_m = glm::scale(glm::mat4(1.0f), glm::vec3(scale, scale, scale)); //scale matrix
glm::mat4 rotation = getMatrix(Right, Up, Front, Position); //builds rotation matrix
rotation = glm::translate(rotation, p - Position );
rotation = glm::rotate(rotation, ROTATION_SPEED * deltaTime, axis);
rotation = glm::translate(rotation, Position - p );
Matrix = rotation * scale_m;
//look at point P
Front = glm::normalize(p - start_Position);
Right = glm::normalize(glm::cross(WorldUp, Front));
Up = glm::normalize(glm::cross(Right, Front));
if (ended == true) { //if last iteration of my animation: saves position
Position.x = Matrix[3][0];
Position.y = Matrix[3][1];
Position.z = Matrix[3][2];
}
}
getMatrix() 只返回一个 4x4 矩阵:
| Right.x Right.y Right.z |
| Up.x Up.y Up.z |
| Front.x Front.y Front.z |
| Pos.x Pos.y Pos.z |
我使用这张图片作为参考:
当我开始动画时,我的模型就消失了。如果我删除下面的行"//look at point P" 它会围绕原点旋转,但每次我的动画重新启动时都会抽搐。我猜我正在丢失或混合我不应该在某处的信息。
如何存储我的模型前/右/上信息,以便我可以从头开始重建它的矩阵?
第一次编辑,这是我不尝试让我的模型看点 P 时的效果,在这种情况下是原点。当我尝试时,我的模型消失了。如何让它看起来我想要的位置,以及在我完成旋转后如何让我的模型获得新的 Front/Right/Up 向量?
This是我在上面的gif中运行的代码
【问题讨论】:
-
先绕外轴旋转(MR1矩阵)。然后平移模型 (MT)。然后绕其自身垂直轴 (MR2) 旋转。组合运动通过 MFInal = MR2 x MT x MR1 实现。矩阵的顺序很重要。
-
那会让我的模型直面问题?如果是这样,我应该在动画之后保留什么信息,以便我可以将它放置在另一个旋转的位置(从它停止的地方继续)?
-
用
angleE外旋后,你可以知道你模型的中心在哪里,一个简单的positionNew= matrix x positionOld乘法。使用这个新位置和angleE,您可以计算应用于自旋转的角度。只需存储下一个动作的位置和当前自身角度。 -
使用这种方法,我必须为每个轴 (x,y,z) 存储一个自角度,然后创建 3 个旋转矩阵?
-
@MatheusIanzer 在Right-handed 系统中,它必须是 [Right = glm::normalize(glm::cross(Front, WorldUp));]`。但目前还不清楚你想要实现什么。
标签: c++ opengl matrix rotation glm-math