вращение — Как вращать объект вокруг другого объекта (C ++ и Ogre3D)?

В настоящее время я делаю солнечную систему в Ogre3D. Остальные планеты прекрасно вращаются вокруг Солнца, но когда я пытаюсь вращать Луну вокруг Земли, она вращается в определенной точке около Земли, а не вокруг Земли, что время от времени пересекает ее с Землей.

Это код для создания расстояния планеты от начала координат (0,0,0)

    Vector3 location = Vector3::ZERO;
float distance = revolverDistance;
location.x = distance; location.z = distance; location.y = 0;
planet->setPosition(location.x, location.y, location.z);

И это код для революции

Degree planetRevolution = Degree(revolution * evt.timeSinceLastFrame);
Vector3 location = Vector3::ZERO;
location.x = revolver->getPosition().x - revolve->getPosition().x;
location.z = revolver->getPosition().z - revolve->getPosition().z;
float oldX = location.x;
float oldZ = location.z;
float newX = (oldX*Math::Cos(planetRevolution)) + (oldZ*Math::Sin(planetRevolution));
float newZ = (oldX*-Math::Sin(planetRevolution)) + (oldZ*Math::Cos(planetRevolution));
mPlanet->setPosition(newX, mPlanet->getPosition().y, newZ);
  • Revolve = Планета (напр. Земля)
  • Revolver = Другая планета, которая вращается вокруг другой планеты (например, Луна)

Для переменных у меня есть sunDistance = 0, earthDistance = 150 и moonDistance = 155, все из которых являются числами с плавающей точкой. *

Я пробовал настройку float distance = revolveDistance + revolverDistanceи изменив расстояние Луны до 5, но точка, в которой она вращается, просто сместилась немного дальше.

Заранее спасибо!

НАПОМИНАНИЕ (Спасибо одному из людей, которые ответили, что напомнили мне):
Мне не разрешено использовать иерархию сцены.

2

Решение

Ваш вопрос является отличным примером того, для чего нужна иерархия графа сцены 🙂

  • Установите узел сцены Ogre в центральной точке Солнца.
  • Прикрепите солнечную сущность к солнечному узлу
  • Поместите другой узел сцены в положение солнца. Это будет центральный узел планеты, вокруг которого она вращается.
  • Сделайте опорный узел дочерним по отношению к солнечному узлу.
  • Поместите узел сцены в начальную позицию планеты
  • Прикрепить планету
  • сделать узел планеты дочерним по отношению к основному узлу
  • Создайте еще один узел сцены в положении планеты и сделайте его дочерним по отношению к центральному узлу планеты.
  • Создайте узел сцены в положении Луны, прикрепите к нему объект Луны и сделайте его дочерним в узле поворота Луны.

Теперь Ogre сделает все за вас, не балуясь жестко закодированными позициями. Вам просто нужно будет поворачивать узлы поворота, больше не нужно устанавливать позиции.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]