В настоящее время я делаю солнечную систему в 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);
Для переменных у меня есть sunDistance = 0, earthDistance = 150 и moonDistance = 155, все из которых являются числами с плавающей точкой. *
Я пробовал настройку float distance = revolveDistance + revolverDistance
и изменив расстояние Луны до 5, но точка, в которой она вращается, просто сместилась немного дальше.
Заранее спасибо!
НАПОМИНАНИЕ (Спасибо одному из людей, которые ответили, что напомнили мне):
Мне не разрешено использовать иерархию сцены.
Ваш вопрос является отличным примером того, для чего нужна иерархия графа сцены 🙂
Теперь Ogre сделает все за вас, не балуясь жестко закодированными позициями. Вам просто нужно будет поворачивать узлы поворота, больше не нужно устанавливать позиции.
Других решений пока нет …