Вращение по дорожке в opengl - PullRequest
1 голос
/ 18 мая 2019

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

Я пробовал этот код перед переводом, но он не работает.

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 Ответ

0 голосов
/ 19 мая 2019

Угол поворота зависит от вектора направления вдоль синусоидальной волны.

Вектор направления можно рассчитать путем вычитания из 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 / Pi :

float ang_deg = ang_rad * 180.0f / M_PI;
glRotatef( ang_deg, 0, 0, 1 );

В следующем фрагменте кода cde показано, как применять код.Имейте в виду, что нет проверки границ.Это означает, что 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();
}
...