【问题标题】:Rotation along a path in opengl沿opengl中的路径旋转
【发布时间】:2019-10-05 17:54:26
【问题描述】:

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

我在翻译之前尝试过这段代码,但它不起作用。

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();
} 

【问题讨论】:

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


    【解决方案1】:

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

    方向向量可以通过减去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 sn -p 显示如何应用代码。请注意,没有边界检查。这意味着i 必须大于或等于 1 并且小于点数 - 1 (1 &lt;= i &lt; 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();
    }
    

    【讨论】:

    • 非常感谢。请告诉我M_PI是什么??
    • @HooriaKhalid MI_PI3.1415926 参见 Pi。在#include &lt;math.h&gt;之前添加#define _USE_MATH_DEFINES
    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多