我正在做一个编辑三维模型动作的程序,现在已经完成三维模型的导入(.3ds格式的,一个人形模型,有关节的,),想通过OpenGL来控制关节的动作,比如说我用鼠标拖动胳膊,胳膊就跟着鼠标动,而且手臂也要跟着动,如果拖动手臂,只有手臂动就可以了,现在的问题是,胳膊如何绕着肩膀转,
     glPushMatrix();
    glRotatef ();
    glPopMatrix();用这几个函数吗?如何找到旋转点,手臂如何跟着动,还有就是如何保存当前的状态(只保存相对于初始转过的角度吗),来进入编辑下一个动作(通过树形控件切换不同的动作),我还是个初学者,各位高手,请教了!!谢谢了!!!

解决方案 »

  1.   


    #include <GL/glut.h>
    #include <stdlib.h>static int shoulder = 0, elbow = 0;void init(void) 
    {
       glClearColor (0.0, 0.0, 0.0, 0.0);
       glShadeModel (GL_FLAT);
    }void display(void)
    {
       glClear (GL_COLOR_BUFFER_BIT);
       glPushMatrix();
       glTranslatef (-1.0, 0.0, 0.0);
       glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
       glTranslatef (1.0, 0.0, 0.0);
       glPushMatrix();
       glScalef (2.0, 0.4, 1.0);
       glutWireCube (1.0);
       glPopMatrix();   glTranslatef (1.0, 0.0, 0.0);
       glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
       glTranslatef (1.0, 0.0, 0.0);
       glPushMatrix();
       glScalef (2.0, 0.4, 1.0);
       glutWireCube (1.0);
       glPopMatrix();   glPopMatrix();
       glutSwapBuffers();
    }void reshape (int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
       gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
       glTranslatef (0.0, 0.0, -5.0);
    }void keyboard (unsigned char key, int x, int y)
    {
       switch (key) {
          case 's':
             shoulder = (shoulder + 5) % 360;
             glutPostRedisplay();
             break;
          case 'S':
             shoulder = (shoulder - 5) % 360;
             glutPostRedisplay();
             break;
          case 'e':
             elbow = (elbow + 5) % 360;
             glutPostRedisplay();
             break;
          case 'E':
             elbow = (elbow - 5) % 360;
             glutPostRedisplay();
             break;
          case 27:
             exit(0);
             break;
          default:
             break;
       }
    }int main(int argc, char** argv)
    {
       glutInit(&argc, argv);
       glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
       glutInitWindowSize (500, 500); 
       glutInitWindowPosition (100, 100);
       glutCreateWindow (argv[0]);
       init ();
       glutDisplayFunc(display); 
       glutReshapeFunc(reshape);
       glutKeyboardFunc(keyboard);
       glutMainLoop();
       return 0;
    }一个简单的例子,书上有的,点击S或E图像就旋转