在OpenGL中沿路径旋转

时间:2019-05-18 20:39:13

标签: c++ opengl rotation translation opengl-compat

我想沿路径(正弦波)移动对象,假设对象是过山车。 它通过平移移动,但是我的问题是我也想根据路径旋转该对象。

  

我在翻译之前尝试了此代码,但无法正常工作。

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 :(得分:0)

旋转角度取决于正弦波的方向矢量。

可以通过减去2个位置来计算方向矢量。从当前位置之后的位置减去当前位置之前的位置,以计算方向向量。以下i是对象的当前位置:

dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];

arcus tangent使用atan2可以计算出旋转角度,它返回以弧度为单位的角度:

float ang_rad = atan2( dy, dx );

由于必须将角度以度为单位传递到glRotatef,因此必须先将角度从弧度转换为度,然后才能执行绕z轴的旋转。 一个完整的圆具有360度或2 * Pi弧度。因此比例从弧度到 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();
}