将图形先按照X轴旋转rotatex度 ,绕Y轴旋转rotatey度 , 绕Z轴旋转rotatez度,代码如下:glRotatef( rotatex , 1.0f , 0.0f , 0.0f );
glRotatef( rotatey , 0.0f , 1.0f , 0.0f );
glRotatef( rotatez , 0.0f , 0.0f , 1.0f ); 运行起来发现和预期效果不符,后来得知旋转的时候,坐标系也被旋转了,比如在X轴旋转后可能会影响到Y,Z轴已经在CSDN搜索半天了,看了一些解决方法试了也没成功,于是求助大家怎样才能始终围绕固定坐标轴旋转?小菜初学OpenGL,最好能给出代码。。谢谢~~

解决方案 »

  1.   

    旋转有两种方式,一种是模型转换,也就是视点不变,物体旋转,也就是你这种。
    另外一种是视图转换,视点旋转,物体不变,也就相当于观察者自己在转动,这时用的是gluLookAt。
    看看《OpenGL编程指南》吧...
      

  2.   

    OpenGL里面的所有的平移,旋转,缩放操作都是针对于坐标系的,不是物体,我建议你再看看教材吧
      

  3.   


    glpushMatrix();
    glRotatef( rotatex , 1.0f , 0.0f , 0.0f );
    glRotatef( rotatey , 0.0f , 1.0f , 0.0f );
    glRotatef( rotatez , 0.0f , 0.0f , 1.0f );
    glpopMatrix();
      

  4.   

    你可能矩阵乘法的顺序错了,应该先乘Z轴,然后Y轴,然后X轴
      

  5.   

    要实现先绕X,再绕Y,再绕Z的话,代码应该是反过来写的,像这样:glRotatef( rotatez , 0.0f , 0.0f , 1.0f ); 
    glRotatef( rotatey , 0.0f , 1.0f , 0.0f ); 
    glRotatef( rotatex , 1.0f , 0.0f , 0.0f ); 
    比如,对于顶点P ,如果 OGL当前的矩阵是M,   绕三个轴旋转的矩阵分别是Mx,My,Mz
    那么,你的变换后顶点为 P‘ =Mx*My*Mz*M*P
    看到了吗?    虽然代码还是从上向下执行,但是真正生效的是先Z,再Y,再X因此,应该像我写的这样,那么 P' = Mz*My*Mx*M*P这就实现了,先X,再Y,再Z
      

  6.   

    在每一步旋转操作前后加glPushMatrix()和glPopMatrix(),这样前面的操作就不会对后面的操作产生影响~
      

  7.   

    一开始绘图坐标系和世界坐标系是相同的,你再怎么平移变换,绘图坐标系改变了,但世界坐标系是不会改变的,所有的OpengGL内的变换函数都是相对于世界坐标系的,不过我也碰到过“运行起来发现和预期效果不符”的情况的,比如说应该是绕Y轴顺时针的却绕Y轴逆时针转了。