opengl中的动画

opengl中的动画,opengl,glut,Opengl,Glut,我从来没有把如何让动画在OpenGL中工作的概念记下来。我在做他的项目,试图让它工作,但从来没有让滑雪者移动。我正在想办法解决这个问题 #包括“./shared/gltools.h”//OpenGL工具包 #定义PI 3.14159265 浮动a=-5//大概 浮动b=29; 浮点数c=27; 浮点数d=28.25; 浮点数e=28.5; 布尔查找; 布尔挫折; 布尔俯视; 布尔左看; 布尔·洛基特; 布尔向前走; 布尔向后走; 布尔斜射; 布尔·斯特拉弗赖特; 浮动翻译; 浮动翻译; 浮动翻译

我从来没有把如何让动画在OpenGL中工作的概念记下来。我在做他的项目,试图让它工作,但从来没有让滑雪者移动。我正在想办法解决这个问题

#包括“./shared/gltools.h”//OpenGL工具包
#定义PI 3.14159265
浮动a=-5//大概
浮动b=29;
浮点数c=27;
浮点数d=28.25;
浮点数e=28.5;
布尔查找;
布尔挫折;
布尔俯视;
布尔左看;
布尔·洛基特;
布尔向前走;
布尔向后走;
布尔斜射;
布尔·斯特拉弗赖特;
浮动翻译;
浮动翻译;
浮动翻译;
浮动旋转角;
浮动旋转角;
浮动X旋转角;
int mouseLastx;
弹性;
浮动太阳旋转角度=0;
浮动半径=150.0;
浮动日=0;
漂浮黄昏=1;
//灯光值和坐标
GLfloat lightPos[]={0.0f,30.0f,0.0f,1.0f};
GLfloat lightPos2[]={0.0f,0.0f,40.0f,1.0f};
GLfloat镜面反射[]={1.0f,1.0f,1.0f,1.0f};
GLfloat镜面反射2[]={0.0f,1.0f,0.0f,1.0f};
GLfloat diffuse[]={1.0f,1.0f,1.0f,1.0f};
GLfloat diffuse2[]={0.0f,0.3f,0.0f,1.0f};
GLloat specref[]={1.0f,1.0f,1.0f,1.0f};
GLfloat环境光[]={0.5f,0.5f,0.5f,1.0f};
GLfloat spotDir[]={0.0f,0.0f,-1.0f};
无效鼠标移动(整数x,整数y)
{
int mouseDiffx=x-mouseLastx;
int mouseDiffy=y-鼠标弹性;
mouseLastx=x;
mouseLasty=y;//将lasty设置为当前的y位置
X旋转角度+=(GLfloat)鼠标移动;
yRotationAngle+=(GLfloat)mouseDiffx;
如果(X旋转角度>=90)
X旋转角度=90;

if(xRotationAngle我的一般方法是使用
GLUTIMERFUNC()
回调,每隔16毫秒左右(~60 FPS)发布一次重新显示事件

然后在
glutDisplayFunc()
回调中,您可以获取新的
GLUT\u已用时间
,以计算上一帧的增量时间(
dt

使用
dt
可以更新任意数量的变量,如角度或平移偏移。您需要使用
dt
而不是固定增量值来将动画速度与帧速率解耦

然后回到
glutDisplayFunc()
回调中,使用更新的状态变量绘制一个新帧

这是一个使用上述方法以每秒约30度的速度旋转正方形的示例:

#include <GL/glut.h>

float angle = 0;
void update( const double dt )
{
    // in degrees per second
    const float SPEED = 30.0f;

    // update angle
    angle += ( SPEED * dt );
}

void display()
{
    // GLUT_ELAPSED_TIME is in milliseconds
    static int prvMs = glutGet( GLUT_ELAPSED_TIME );
    const int curMs = glutGet( GLUT_ELAPSED_TIME );

    // dt is in seconds
    const double dt = ( curMs - prvMs ) / 1000.0;
    prvMs = curMs;

    // update world state
    update( dt );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // reset projection/modelview matrices each frame;
    // this makes sure we have a known-good matrix 
    // stack each time through display()
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( -2, 2, -2, 2, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    // draw rotated square
    glRotatef( angle, 0, 0, 1 );
    glBegin( GL_QUADS );
    glColor3ub( 255, 0, 0 );
    glVertex2i( -1, -1 );
    glVertex2i(  1, -1 );
    glVertex2i(  1,  1 );
    glVertex2i( -1,  1 );
    glEnd();

    glutSwapBuffers();
}

void timer( int value )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE );
    glutInitWindowSize( 600, 600 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
#包括
浮动角度=0;
无效更新(常数双dt)
{
//以度/秒为单位
恒浮速=30.0f;
//更新角度
角度+=(速度*dt);
}
无效显示()
{
//GLUT_已用时间以毫秒为单位
静态int prvMs=glutGet(GLUT运行时间);
const int curMs=glutGet(GLUT经过的时间);
//dt以秒为单位
常数双dt=(curMs-prvMs)/1000.0;
prvMs=凝乳;
//更新世界状态
更新(dt);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//重置每个帧的投影/模型视图矩阵;
//这确保我们有一个已知的好矩阵
//每次通过display()进行堆栈
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-2,2,-2,2,-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
//画旋转正方形
glRotatef(角度,0,0,1);
glBegin(GL_QUADS);
glColor3ub(255,0,0);
glVertex2i(-1,-1);
glVertex2i(1,-1);
glVertex2i(1,1);
glVertex2i(-1,1);
格伦德();
glutSwapBuffers();
}
无效计时器(int值)
{
再发现();
glutTimerFunc(16,定时器,0);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_深度| GLUT_双精度);
glutInitWindowSize(600600);
GLUT(GLUT);
glutDisplayFunc(显示器);
glutTimerFunc(0,定时器,0);
glutMainLoop();
返回0;
}

-1:格式不一致/随意。此外,今后请使用更具描述性的标题(就此而言,请使用问题)。您刚刚向我们发布了一些代码,告诉我们这是用于动画,而不是真正描述您的问题(例如,您实际尝试了什么,至少需要关注一些行/函数,而不是整个工作程序)。我试着用变量来填充画出滑雪者的位置,然后在更新感知函数中更新这些值。这不起作用。皮托基本上是一个带有球形头部的棒状图形,并在图片左上角为滑雪板调整角度。我只是试着让滑雪者向滑雪坡的中心移动基本上,我只是在问如何开始制作动画,我想一旦它开始工作,我就可以解决剩下的问题。