我有3D场景,场景中存在多个对象。我想围绕场景中的选定对象旋转场景中的所有对象。我不希望选定对象改变其在屏幕上的位置,它应该只绕自己的轴旋转,所有其他对象应该只绕该轴旋转,就像Revit应用程序中发生的那样。我是通过旋转场景中所有的物体来实现的。下面是这个的伪代码。
glm::vec3 axis = glm::vec3{0.0f, 1.0f, 0.0f};
float angle = glm::half_pi<float>();
glm::quat rotation = glm::angleAxis(angle, axis);
glm::vec3 rotation_point = glm::vec3{1.0f, 2.0f, 3.0f};
// Precompute common transformation matrix
glm::mat4 translate = glm::translate(glm::mat4{1.0f}, -rotation_point);
glm::mat4 untranslate = glm::translate(glm::mat4{1.0f}, rotation_point);
glm::mat4 rotate_around_center = untranslate * glm::mat4_cast(rotation) * translate;
// For each node
world_from_node_after = rotate_around_center * world_from_node_before;
字符串
但是,对场景中的每个对象应用旋转矩阵似乎需要大量的计算,所以我想调整相机矩阵,而不是对每个对象应用旋转。我应该如何更改相机矩阵以达到所需的效果?
1条答案
按热度按时间tv6aics11#
我想明白了,我们可以在同一个轴上以相反的方向(实际旋转的负Angular )旋转相机,而不是围绕一个轴旋转每个对象,并且只改变它的视图矩阵,所以现在我们不必更新每个对象的模型矩阵。