[使用GLM在OpenGL中旋转和旋转旋转

问题描述 投票:2回答:2

我正在OpenGL中制作一个太阳系,我希望这些行星能够绕其他行星旋转并绕其自身的中心旋转。

这是我当前用于使行星绕特定点运动的代码:

Model = glm::translate(Model, glm::vec3(-orbit_radius_, 0.0f, 0.0f));
Model = glm::rotate(Model, glm::radians(orbit_speed_) / 100.0f, glm::vec3(0.0f, 1.0f, 0.0f));
Model = glm::translate(Model, glm::vec3(orbit_radius_, 0.0f, 0.0f));

我如何将其与使对象围绕自身旋转的变换结合在一起?

c++ opengl rotation transformation glm-math
2个回答
0
投票

我通过拆分然后进行转换,然后在最后将它们组合在一起来使它起作用。

rotate_ = glm::translate(rotate_, glm::vec3(-orbit_radius_, 0.0f, 0.0f));
rotate_ = glm::rotate(rotate_, glm::radians(orbit_speed_) / 100.0f, glm::vec3(0.0f, 1.0f, 0.0f));
rotate_ = glm::translate(rotate_, glm::vec3(orbit_radius_, 0.0f, 0.0f));

spin_ = glm::rotate(spin_, glm::radians(spin_speed_) / 100.0f, glm::vec3(0.0f, 1.0f, 0.0f));

final_ = rotate_ * spin_;

0
投票

如果要旋转和旋转对象,我建议创建一个以(0,0,0)为中心的对象必须先进行对象的自旋。然后平移并旋转对象:

Model = rotate * translate * spinn

例如:

rot_angle  += glm::radians(orbit_speed_) / 100.0f;
spin_angle += glm::radians(orbit_speed_) / 100.0f;

glm::vec3 tvec    = glm::vec3(orbit_radius_, 0.0f, 0.0f);
glm::vec3 axis    = glm::vec3(0.0f, 1.0f, 0.0f)

glm::mat4 translate = glm::translate(glm::mat(1.0f), tvec);
glm::mat4 rotate    = glm::rotate(glm::mat(1.0f), rot_angle,   axis);
glm::mat4 spin      = glm::rotate(glm::mat(1.0f), spin_angle , axis);

Model = rotate * translate * spin;

使用这种解决方案,rot_anglespin_angle必须在每帧中以恒定的步长递增。


如果您不想增加角度,则必须存储2个矩阵,而不是角度。 1表示旋转,而on表示旋转:

mat4 rotate(1.0f);
mat4 spin(1.0f);
glm::vec3 tvec   = glm::vec3(-orbit_radius_, 0.0f, 0.0f);
glm::vec3 axis   = glm::vec3(0.0f, 1.0f, 0.0f)
float rot_angle  = glm::radians(orbit_speed_) / 100.0f;
float spin_angle = glm::radians(spin_speed_) / 100.0f;

rotate = glm::translate(rotate, tvec);
rotate = glm::rotate(rotate, rot_angle, axis );
rotate = glm::translate(rotate, -tvec);

spin = glm::rotate(spin, spin_angle, axis);

Model = rotate * spin;
© www.soinside.com 2019 - 2024. All rights reserved.