Орбитальное и вращающееся вращение в OpenGL с использованием GLM - PullRequest
2 голосов
/ 15 января 2020

Я создаю солнечную систему в OpenGL и хочу, чтобы планеты могли вращаться вокруг других планет, а также вращаться вокруг своих собственных центров.

Это код, который я сейчас использую для создания планеты вращаются вокруг заданной c точки:

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));

Как бы я совместил это с преобразованием, которое вращает объект вокруг себя?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я заставил его работать, просто разделив затем преобразования и затем объединив их в конце.

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 голосов
/ 15 января 2020

Если вы хотите вращать и вращать объект, я рекомендую создать объект, центр которого находится в точке (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_angle и spin_angle должны увеличиваться в каждом кадре с постоянным шагом.


Если вы не хотите увеличивать углы, вам нужно хранить 2 матрицы вместо углов. 1 для вращения и включения для вращения:

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;
...