2013-11-14 4 views
0

enter image description hereОрбита объекта вокруг орбитального объекта

Как добраться до орбиты зеленый круга вокруг оранжевого и синих вокруг зеленого?

Я нашел много решений, которые отлично работают с поворотом вокруг статической точки (в этом случае оранжевый круг), но не нашли хорошего уравнения математики, которое будет работать как для статических, так и для движущихся точек.

angle += sunRot; 

if(angle > 360.0f) 
{ 
    angle = 0.0f; 
} 

float radian = glm::radians(angle); 

float radius = glm::distance(position, rotCenter); 

float x = rotCenter.x + (radius * cosf(radian)); 
float z = rotCenter.z + (radius * sinf(radian)); 

glm::vec3 newPos = glm::vec3(x, 0, z); 

setPosition(newPos); 

Here is, что я пытаюсь добиться (благодаря @George Profenza для связи общего доступа)

+1

Все, что вам нужно сделать, это преобразовать каждый из объектов в правильном порядке. Сначала вы будете вращать зеленый объект вокруг оранжевого объекта, чтобы получить его местоположение. Затем вы используете расположение зеленого объекта и вращаете вокруг него синий объект. У них идеальные круговые орбиты, поэтому вы можете перевести их на фиксированное расстояние от центра объекта, на котором они расположены. –

+0

Вам нужно что-то [подобное] (https://www.youtube.com/watch?v=QVuU2YCwHjw&feature=youtu.be&t=1m)? –

+0

@ peter-wood, нет, я просто пытаюсь имитировать Землю, вращающуюся вокруг Солнца и Луны, вращающихся вокруг Земли. – tvoloshyn

ответ

1

Основывайте все свои вычисления на радиус и угол текущего объекта, где это возможно, и сохраняйте радиус и угол с объектом.

В частности, не вычисляйте радиус на основе координат x/y на каждой итерации: если базовый объект перемещен между этапами, вычисленный радиус будет слегка отключен, и ошибка будет накапливаться.

+0

И это был вопрос :) Исправлено! Благодаря ! – tvoloshyn

0

Вы должны быть в состоянии гнезда координатных пространств с использованием OpenGL с использованием glPushMatrix(), glPopMatrix() звонков. Here - основной пример (нажмите мышь, чтобы увидеть координатные пространства). Синтаксис не C++, но легко понять, что я имею в виду.

Вы можете сделать это несколькими способами:

  1. полярная координатные формулу
  2. вручную множительной матрицы преобразования
  3. просто используя тяни/поп-матрица вызовов (наряду с перевести поворот, где требуется /), что делает матричное умножение для вас за кулисами.

Только в случае, если вы хотите попробовать полярные координаты формулу:

x = cos(angle) * radius 
y = sin(angle) * radius 

Где угол тока вращения окружности и радиус это расстояние от центра вращения.

+0

Это то, что я делал (формула полярной координаты), это работает, только для того, чтобы вращаться вокруг Солнца, но лунная орбита увеличивается с каждой итерацией. Проверьте мой код в ответе (я только что добавил). – tvoloshyn

Смежные вопросы