用OpenGL绘制小球,按给定的坐标点沿直线运动。实现问题。

关于
http://zhidao.baidu.com/question/533503587?quesup2&oldq=1
问题的详细补充提问。
我程序中的部分代码
坐标数组,a[4][3]={{0,0,0},{20,0,0},{20,20,0},{40,40,0}};
定时函数,
void TimerFunction(int value)
{
k+=0.02;
if(k>1)
k=0;
glutPostRedisplay();
glutTimerFunc(33,TimerFunction,1);
}
3.过程绘制函数
void TransFunc(void)
{
int i=0;
glColor3f(0.0,0.5,0.5);
for(i=0;i<3;i++)
{
glPushMatrix();
tx=a[i+1][0]*k+a[i][0]*(1-k);//直线变化过程
ty=a[i+1][1]*k+a[i][1]*(1-k);
tz=a[i+1][2]*k+a[i][2]*(1-k);
glTranslatef(tx,ty,tz);
glutWireSphere(5.0f,10,10);
glPopMatrix();
}
glLoadIdentity();

}
4.运行结果,循环中的三个球同时画出了,并且三个小球同时运动!!!而我想要实现的是一个小球,按顺序(0,0)点到(20,0)点,再到(20,20)点,到(40,40)点的变化。怎么实现???求帮助
最新回答
梨花雨凉

2025-02-25 04:32:11

#include <GL/glut.h>
#include <stdlib.h>

void myinit(void)
{
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_FLAT);
  glDepthRange(0.0, 1.0);  /* The default z mapping */
}



GLfloat tx = 0.0f, ty = 0.0f, tz = 0.0f;

void drawsphere(GLenum mode)
{
glPushMatrix();
glTranslatef( tx, ty, tz-90.0f);
glutWireSphere(1.0,10,10);
glPopMatrix();
}

void idle(void)
{
if( tx < 20.0f )
tx += 0.2f;
else if( ty < 20.0f )
ty += 0.2f;
else if ( tx < 40.0f && ty < 40.0f )
{
tx += 0.2f;
ty += 0.2f;
}
else
{
tx = ty = 0.0f;
}
glutPostRedisplay();

}

void display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glColor3f(0.0f,1.0f,1.0f);
  glPushMatrix();
  glBegin(GL_LINES);
  glVertex3f( -50.0f,0.0f,-80.0f);
  glVertex3f( 50.0f, 0.0f, -80.0f);

  glVertex3f(0.0f, -50.0f,-80.0f);
  glVertex3f(0.0f,50.0f, -80.0f);
  glEnd();
  glPopMatrix();
  drawsphere(GL_RENDER);
  glutSwapBuffers();
}

void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat) 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (-3.0, -3.0, -8.0);
}

static void
key(unsigned char k, int x, int y)
{
  switch (k) {
  case 27:  /* Escape */
    exit(0);
    break;

  default:
    return;
  }
  glutPostRedisplay();
}


int
main(int argc, char **argv)
{
  glutInitWindowSize(200, 200);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInit(&argc, argv);
  glutCreateWindow(argv[0]);
  myinit();

  glutReshapeFunc(myReshape);
  glutDisplayFunc(display);
  glutIdleFunc(idle);
  glutKeyboardFunc(key);
  glutMainLoop();
  return 0;             /* ANSI C requires main to return int. */
}
追问
谢谢,这是一种思路了。如果我的轨迹点很多,怎么用循环写呢?
追答
你说的问题不是重复绘制吗,关键是每一帧获得新的位置,而不要把绘制放到循环里。就算你一下子算出所有的位置,也是每一帧取下一个位置用。