Как известно, основным параметрическое уравнение для окружности, с rad
быть радиус и phi
угол в диапазоне [0, 2 * PI]:
x = rad * cos(phi)
y = rad * sin(phi)
Как phi
свип от 0 до 2 * PI, это начинается справа (положительная ось x) и движется против часовой стрелки. Это означает, что начальное движение вверх, в направлении положительной оси y.
Точный расчет, который вам нужен, зависит от того, хотите ли вы, чтобы анимация двигалась по часовой стрелке или против часовой стрелки и где она начиналась. Поскольку это всего лишь небольшая вариация, я покрою их по порядку.
Для ориентации против часовой стрелки мы можем обобщить начальную точку, просто добавив начальный угол. Мы также будем выражать угол в зависимости от времени t
:
x = rad * cos(phiStart + speed * t)
y = rad * sin(phiStart + speed * t)
Это дает вам компоненты перевода. Для вращения рыбы, так как ее базовое положение указывает направо, но начальное движение кругового движения направлен вверх, нам нужно вращать его на 90 градусов, прежде чем применять круговое движение. Это означает, что 0.5 * PI
(90 градусов), добавляются в угол, используемый для перевода:
rotAng = 0.5 * PI + phiStart + speed * t
Не будучи знакомы с библиотекой матрицы вы используете, я надеюсь, что он использует стандартный порядок для матричных умножений. Так выражается в коде выше будет выглядеть примерно так:
float phiStart = 0.0f; // start at right, set different start angle if desired
float phi = phiStart + elapsedTime;
mesh->objectModelMatrix =
glm::translate(glm::mat4(1.0f),
glm::vec3(5.0f * cos(phi), initialY, 5.0f * sin(phi)));
mesh->objectModelMatrix =
glm::rotate(mesh->objectModelMatrix,
0.5f * M_PI + phi, glm::vec3(0.0f, 0.0f, 1.0f));
Для перемещения по часовой стрелке вместо этого, мы можем просто инвертировать знак угла. Единственным отличием является то, поскольку начальное движение вниз сейчас, начальное вращение рыбы также на 90 градусов по часовой стрелке, что соответствует -0.5 * PI
:
float phiStart = 0.5f * M_PI; // start at top, set different start angle if desired
float phi = phiStart - elapsedTime;
mesh->objectModelMatrix =
glm::translate(glm::mat4(1.0f),
glm::vec3(5.0f * cos(phi), initialY, 5.0f * sin(phi)));
mesh->objectModelMatrix =
glm::rotate(mesh->objectModelMatrix,
-0.5f * M_PI + phi, glm::vec3(0.0f, 0.0f, 1.0f));
Я не мог найти четкую документацию для библиотеки матрицы вы используются. Возможно, что второй аргумент glm::rotate()
- это угол в градусах вместо радианов. Если это так, то эти вызовы для двух случаев становятся:
glm::rotate(mesh->objectModelMatrix,
90.0f + phi * (180.0f/M_PI), glm::vec3(0.0f, 0.0f, 1.0f));
glm::rotate(mesh->objectModelMatrix,
-90.0f + phi * (180.0f/M_PI), glm::vec3(0.0f, 0.0f, 1.0f));
Какова первоначальная ориентация рыбы? Голова, направленная вправо (т. Е. В положительном x-направлении)? –
Да, голова направлена вправо. – davez