Вращение по дорожке в opengl
Я хочу переместить объект вдоль пути (синусоида), давайте предположим, что объект - американские горки. он перемещается через перевод, но моя проблема в том, что я также хочу повернуть этот объект в соответствии с путем.
Я попробовал этот код перед переводом, но он не работает.
if (x = -4.8)
{
glRotatef(89, 1, 1, 0);
}
мой код только с переводом выглядит следующим образом. я хочу добавить вращение здесь по синусоидальным волнам
void object()
{ glPushMatrix();
glTranslatef(x, y, 0);
glColor3f(0.0f, 0.0f, 0.0f);//Set drawing color
glBegin(GL_QUADS);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glVertex2f(0.3, -0.1);
glVertex2f(-0.3, -0.1);
glEnd();
glFlush();
glPopMatrix();
glFlush();
}
void drawsine()
{
glBegin(GL_LINE_STRIP);//Primitive
glColor3f(255, 0, 0);//Set drawing color
int i = 0;
float x = 0, y = 0;
for (x = -5; x < 6; x = x + 0.1)
{
y = (sin(3.142*x)) / 3.142*x;
glVertex2f(x, y);
//int j= 0;
sinex[i] = x;
siney[i] = y;
i++;
}
glEnd();
glFlush();
}
1 ответ
Угол поворота зависит от вектора направления по синусоиде.
Вектор направления можно рассчитать вычитанием из 2 позиций. Вычтите позицию перед текущей позицией из позиций после текущей позиции, чтобы вычислить вектор направления. В следующих i
текущая позиция объекта:
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
Угол поворота можно рассчитать по арктангенсу с помощью atan2
, который возвращает угол в радианах:
float ang_rad = atan2( dy, dx );
Поскольку угол должен быть передан glRotatef
в градусах угол необходимо преобразовать из радианов в градусы, прежде чем можно будет выполнить вращение вокруг оси z. Полный круг имеет 360 градусов или 2* Пи радианы. Итак, масштаб от радианов до градусов 180/ Пи:
float ang_deg = ang_rad * 180.0f / M_PI;
glRotatef( ang_deg, 0, 0, 1 );
Следующий фрагмент кода показывает, как применить код. Имейте в виду, что нет проверки границ. Это означает i
должно быть больше или равно 1 и меньше количества баллов - 1 (1 <= i < 110
):
#define _USE_MATH_DEFINES
#include <math.h>
{
// [...]
drawsine();
x = sinex[i];
y = siney[i];
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
object();
// [...]
}
void object()
{
glPushMatrix();
glTranslatef(x, y, 0);
float ang_rad = atan2( dy, dx );
float ang_deg = ang_rad * 180.0f / M_PI;
glRotatef( ang_deg, 0, 0, 1 );
glColor3f(0.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glVertex2f(-0.3, 0.1);
glVertex2f(0.3, 0.1);
glVertex2f(0.3, -0.1);
glVertex2f(-0.3, -0.1);
glEnd();
glPopMatrix();
}