|
|
我目前正在用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;
}
}
.....
请问各位高手我该怎样才能提高小球的速度? |
|