平行于全局轴的矩阵旋转

Posted

技术标签:

【中文标题】平行于全局轴的矩阵旋转【英文标题】:Rotation of the matrices parallel to the global axes 【发布时间】:2021-02-11 14:07:22 【问题描述】:

现在我正在对对象进行以下转换:

    沿 X 轴旋转 沿 Y 轴旋转 沿 Z 轴移动 -2.5
//create model matrix
model_matrix = glm::mat4(1.0f);
//create view matrix
view_matrix = glm::mat4(1.0f);
//create projection matrix
projection_matrix = glm::mat4(1.0f);

//setting up model
model_matrix = glm::translate(model_matrix, glm::vec3(0, 0, -2.5));
//x_rot and y_rot are global variables.
y_rot += y_rotation_speed_in_degrees;
x_rot += x_rotation_speed_in_degrees;
model_matrix = glm::rotate(model_matrix, glm::radians(y_rot), glm::vec3(0, 1, 0));
model_matrix = glm::rotate(model_matrix, glm::radians(x_rot), glm::vec3(1, 0, 0));

//setting up projection
projection_matrix = glm::perspective(45.0f, (float)window_width / (float)window_height, 0.1f, 100.0f);

replication_matrix = projection_matrix * view_matrix * model_matrix;

对于旋转,我设置 (x/y) _rotation_speed_in_degrees。

    我沿 X 轴旋转对象。 然后沿 Y 轴旋转。 然后通过沿 X 轴旋转,旋转沿局部 X 轴发生。

虽然绕 Y 轴 (2) 旋转,但在 3 上的旋转发生在局部 X 轴周围。

我希望看到这个

为什么会发生这种情况以及如何围绕全局轴进行所有旋转?


我正在尝试这样做: 我在头文件中声明模型和旋转矩阵

glm::mat4 model_matrix = glm::mat4(1.0f);
glm::mat4 rotation_matrix = glm::mat4(1.0f);

我在我的绘图周期中执行以下操作:

//create model matrix
model_matrix = glm::mat4(1.0f);
//create view matrix
view_matrix = glm::mat4(1.0f);
//create projection matrix
projection_matrix = glm::mat4(1.0f);

rotation_matrix = glm::rotate(rotation_matrix, glm::radians(y_rotation_speed_in_degrees), glm::vec3(0, 1, 0));
rotation_matrix = glm::rotate(rotation_matrix, glm::radians(x_rotation_speed_in_degrees), glm::vec3(1, 0, 0));

model_matrix = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -2.5)) * rotation_matrix;

//setting up projection
projection_matrix = glm::perspective(45.0f, (float)window_width / (float)window_height, 0.1f, 100.0f);

replication_matrix = projection_matrix * view_matrix * model_matrix;

这就是我得到的:

沿局部轴转 2 和 3 圈,但不沿全局轴转。

【问题讨论】:

【参考方案1】:

为什么会发生这种情况 [...]

矩阵乘法不是Commutative。顺序很重要。

如果要逐步旋转对象,则在之前的旋转的基础上,必须存储模型矩阵并将新的旋转应用于存储的模型矩阵。您需要将模型矩阵保持在帧之外,而不是汇总旋转角度。

在应用循环之前,创建一个初始旋转矩阵:

rotation_matrix = glm::mat4(1.0f);

在应用循环中应用新的旋转并计算模型矩阵:

glm::mat4 rm_x = glm::rotate(glm::mat4(1.0f), 
    glm::radians(y_rotation_speed_in_degrees), glm::vec3(0, 1, 0));
glm::mat4 rm_y = glm::rotate(glm::mat4(1.0f), 
    glm::radians(x_rotation_speed_in_degrees), glm::vec3(1, 0, 0));
glm::mat4 rotation_matrix = rm_x * rm_y * rotation_matrix;

model_matrix = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -2.5)) * rotation_matrix;

【讨论】:

太好了,这就是我需要的!非常感谢您的帮助,非常感谢。

以上是关于平行于全局轴的矩阵旋转的主要内容,如果未能解决你的问题,请参考以下文章

从旋转矩阵获取绕 y 轴的旋转

磁场、旋转矩阵和全局坐标

绕单轴的旋转矩阵

根据相机旋转矩阵求解三个轴的旋转角/欧拉角

矩阵乘法到仅 1 个轴的镜像平移和旋转?

分解旋转矩阵