沿opengl中的路径旋转
Rotation along a path in opengl
我想沿着一条路径(正弦波)移动一个物体,让我们假设物体是一个过山车。
它通过翻译移动,但我的问题是我还想根据路径旋转该对象。
i tried this code before translate but its not working.
if (x = -4.8)
{
glRotatef(89, 1, 1, 0);
}
my code with only translation looks like this.
i want to add rotation here along sine waves
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();
}
旋转角度取决于沿正弦波的方向矢量。
方向向量可以通过减去2个位置来计算。当前位置之后的位置减去当前位置之前的位置,计算方向向量。下面的i
是对象的当前位置:
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
旋转的角度可以通过arcus tangent using atan2
来计算,其中returns一个角度的弧度:
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();
}
我想沿着一条路径(正弦波)移动一个物体,让我们假设物体是一个过山车。 它通过翻译移动,但我的问题是我还想根据路径旋转该对象。
i tried this code before translate but its not working.
if (x = -4.8)
{
glRotatef(89, 1, 1, 0);
}
my code with only translation looks like this. i want to add rotation here along sine waves
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();
}
旋转角度取决于沿正弦波的方向矢量。
方向向量可以通过减去2个位置来计算。当前位置之后的位置减去当前位置之前的位置,计算方向向量。下面的i
是对象的当前位置:
dx = sinex[i+1] - sinex[i-1];
dy = siney[i+1] - siney[i-1];
旋转的角度可以通过arcus tangent using atan2
来计算,其中returns一个角度的弧度:
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();
}