Чтобы лучше понять, как работают векторы, я пытаюсь создать очень простую симуляцию вращения Земли вокруг Солнца. В настоящее время все, чего я хочу, — это чтобы Земля вращалась вокруг Солнца. Никакие законы физики не принимаются во внимание.
Я думал, что то, что я делаю, сработает, однако оно создает какое-то движение в спираль Фибоначчи.
// initial positions
vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);
while(true) {
vec2 earthToSun = normalize(sun - earth); // this is the vector 'pointing from the earth towards the sun'
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x); // this is the vector perpendicular to the earthToSun vector
earth = earth + earthToSun + speedVector; // move the earth along the resulting vector
}
Что не так в моих расчетах?
Почему бы просто не сделать это с помощью тригонометрии:
#define PI 3.1415926
float r = 10.0;
for (int theta=0; theta<2*PI; theta += 0.01)
{
float x = r*cos(theta),
y = r*sin(theta);
earth = vec2(x, y);
}
Очевидно, изменить период, начальное значение theta
, приращение и т. д. по вашему усмотрению.
Ваши начальные условия должны быть
vec2 sun(0.0,0.0);
vec2 earth(10.0,0.0);
vec2 speedVector = vec2(-earthToSun.y, earthToSun.x);
Выглядит хорошо. Однако есть две проблемы с вашими уравнениями.
Положение вашей земли должно меняться со временем так:
vec2 earthToSun = normalize(sun - earth);
earth = earth + earthToSun; // no speedVector added here
Обратите внимание, что я сделал не добавлять speedVector
на землю в коде обновления. То, что вы сделали, — это ускорение вашей земли на протяжении всего симуляции.
Ваш normalize
функция должна будет нормализовать в квадрате расстояние. Я не уверен, как ты это реализовал. F знак равно г m1 м2 / р ^ 2. Я подозреваю, что ваш normalize
только делится на р, не р ^ 2. Проверьте https://en.wikipedia.org/wiki/Gravitational_constant для справки
Ваша земля не обязательно пойдет по кругу. Скорее всего, это будет эллиптическая орбита. Также обязательно выберите достаточно маленький размер шага. За итерацию, earth
должно меняться лишь на небольшую долю от его расстояния до Солнца, иначе вы будете накапливать очевидные ошибки интеграции.