游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2584|回复: 4

如何提高动画的显示速度?

[复制链接]

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2006-6-26 14:15:00 | 显示全部楼层 |阅读模式
我目前正在用OPENGL做一个动画,模型是这样的:
一个封闭的球形器皿,里面有20个小球在运动,当然运动是匀速的.20个小球都需要贴图,为了提高显示速度,球形器皿我用了list列表,但是小球我只能一个一个的画,所以运行后的效果不是很理想,也就是说形不成连续的运动轨迹.其中画小球的代码如下
void drawMovingBall(void)
{       
GLUquadricObj*        q[NUM_SPHERES];
glEnable(GL_TEXTURE_2D);       
  for(int i=0;i<NUM_SPHERES;i++)
  {
        glPushMatrix( );
                glTranslated ( sphere.xpos, sphere.ypos, sphere.zpos );
                q = gluNewQuadric ( );
                  gluQuadricDrawStyle ( q, GLU_FILL   );
                  gluQuadricNormals   ( q, GLU_SMOOTH );
                  gluQuadricTexture   ( q, GL_TRUE    );  
                glRotated(sphere.rotate,1,1,1);
                texture.SetActive();
                  gluSphere ( q, smallRadius, 20, 20 );          
            glPopMatrix ( );
  }
  glDisable(GL_TEXTURE_2D);
  for(i=0;i<NUM_SPHERES;i++)
          gluDeleteQuadric ( q );
}
在timerfunction中修改小球的中心坐标并且判断是否和球形器皿相碰撞
void TimerFunction (int value)
{
for (int i=0;i<NUM_SPHERES; i++)
{       
        double Add=sphere.inc/100.0;
        double time1,x,y,z;
   if(i==2)
   {
           if(!twoTerminated)
           {
           if(!twoBegin)
           {
         sphere.rotate+=rand()%10;
         sphere.times+=sphere.inc;
         sphere.vyo+=sphere.times*sphere.ay;//速度的变化
         sphere.ypos=sphere.yposo + sphere.vyo*sphere.times;
         sphere.xpos=sphere.xposo + sphere.vxo*sphere.times;
         sphere.zpos=sphere.zposo + sphere.vzo*sphere.times;

         TVector temp=TVector(sphere.xpos,sphere.ypos,sphere.zpos);
         TVector vel=TVector(sphere.vxo,sphere.vyo,sphere.vzo);
         if (temp.mag() >dis) //如果小球已经碰撞了
                 {
          
           time1=sphere.times;time1-=sphere.inc;//目前的时间到回到碰撞前的一个时间段
               x=sphere.xpos;y=sphere.ypos;z=sphere.zpos;
               while(!sphere.flag)
                   {
                    time1+=Add;
                    x=sphere.xposo + sphere.vxo*time1;
                    y=sphere.yposo + sphere.vyo*time1;
                    z=sphere.zposo + sphere.vzo*time1;
                   if(sqrt(x*x+y*y+z*z)>dis)
                   {
                          sphere.flag=true;time1-=Add;
                   }
               
                   }
               sphere.times=time1;
           sphere.ypos=sphere.yposo + sphere.vyo*sphere.times;
           sphere.xpos=sphere.xposo + sphere.vxo*sphere.times;
           sphere.zpos=sphere.zposo + sphere.vzo*sphere.times;
               TVector normal=TVector(-sphere.xpos,-sphere.ypos,-sphere.zpos);
               double mag=vel.mag();
               vel.unit();
                  normal.unit();
           vel=TVector::unit( (normal*(2*normal.dot(-vel))) +vel );
               vel=vel*mag;
           sphere.times=0;
               sphere.vxo=vel.X();sphere.vyo=vel.Y();sphere.vzo=vel.Z();
               sphere.xposo=sphere.xpos;
               sphere.yposo=sphere.ypos;
               sphere.zposo=sphere.zpos;
                 }
           }
           else
           {
          sphere.xpos=0;sphere.ypos=ystep2;sphere.zpos=0;//初始化小球刚开始下落的坐标
                  ystep2--;
                  if(ystep2==-10)
                   {
               thirteenBegin=true;
                           twoTerminated=true;
                   }

           }
           }
           else
           {
          sphere.xpos=0;sphere.ypos=ystep2;sphere.zpos=0;
           }
   }
.....
请问各位高手我该怎样才能提高小球的速度?

2

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-6-26 21:07:00 | 显示全部楼层

Re: 如何提高动画的显示速度?

你把小球的生成放在初始化中,或者其他地方,只生成一次,程序退出的时候再一次性删除.然后在timer函数中移动小球,这样可以省很多资源.否则要不每调用一次都生成和删除一次,是很浪废的.

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2006-6-27 10:51:00 | 显示全部楼层

Re:如何提高动画的显示速度?

感谢jouneyR的热心帮助。我思考了您说的问题,觉得按照您的说法还是有难度。我为了实现跨平台使用glut画图的。按照您的思路,我可以在初始化阶段把小球画出来,但据我现在所掌握的,即使i改变了小球的坐标,也得重新调用timer画一次,使得重新显示屏幕再画一次。我现在的难度就是在display()函数中不得不重新画,还是得每次都得画
glutDisplayFunc (display);      // 注册OpenGL绘图函数  
也许是我太驽钝了,望多多指教!

2

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-6-27 23:52:00 | 显示全部楼层

Re:如何提高动画的显示速度?

重画小球那是肯定的,就算你不移动小球,每秒小球也要重画很多次,你想想,电子是连续打出来生成图形的,每打出一次,桌面当然就重画了一次,移动后是要加上计算的,但在初始化中生成小球,就不用每次重画都生成,删除,关键是生成,删除上要花很多时间.这跟glut与跨平台没有关系.

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
 楼主| 发表于 2006-6-28 09:12:00 | 显示全部楼层

Re: 如何提高动画的显示速度?

多谢jorneyR的回答,明白了一些.看来学东西除了要知道其然还要知道其所以然
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 20:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表