2014-12-04 4 views
0

У меня есть объект, который перемещается по кругу. Объект - рыба.
Подвижный:Объект трансляции и вращения OpenGL

mesh->objectModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(5.0f * sin(elapsedTime), initialY, 5.0f * cos(elapsedTime))); 

Мне нужно рассчитать вращение, чтобы переместить рыбу вперед (голова первого). Что-то вроде этого:

mesh->objectModelMatrix = glm::rotate(mesh->objectModelMatrix, elapsedTime, glm::vec3(0.0f, 0.0f, 1.0f)); 

нетрансформированной ориентация рыбы с головой, указывая вправо.

Я не могу найти правильную формулу.

+0

Какова первоначальная ориентация рыбы? Голова, направленная вправо (т. Е. В положительном x-направлении)? –

+0

Да, голова направлена ​​вправо. – davez

ответ

0

Как известно, основным параметрическое уравнение для окружности, с 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)); 
+0

Благодарим за отзыв. Я запрограммировал его, но перевод намного быстрее, чем вращение. Мне нужно ускорить скорость вращения как-то. Увеличивается время на 1 раз в секунду. – davez

+0

Может быть, 'glm :: rotate()' принимает угол в градусах?Умножьте аргумент угла в этих вызовах на (180.0f/M_PI) и посмотрите, работает ли это. –

+0

Отлично! Большое спасибо! – davez

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