画圆形运动轨迹我已经可以实现了,方法如下:
先设定setTimer函数glPushAttrib(GL_ALL_ATTRIB_BITS);//GL_CURRENT_BIT
glPushMatrix();
    glRotatef(rotation,0.0,1.0,0.0);
    glTranslatef(r,0.0,0.0);//r即圆形轨道半径
    glMyDrawObject();
glPopMatrix();
glPopAttrib();rotation = (rotation   + 1)   % 360;
用该方法可以画出轨道平面在视平面上以轨道半径r绕中心点运动物体。
我想通过修改以上代码画出在视平面倾角为i,轨道长半轴为a,短半轴为b的椭圆轨道上运行的物体,并画出该轨道。这该怎么实现呢?
PS:我看OpenGL红宝书上面说,OpenGL正确的编程技巧里:不要频繁第改变某些 矩阵。例如,实现旋转时最好不要以一个不断增加的角度反复调用glRotate函数,正确的方法是用glLoadIdentity()函数初始化每帧画面给定的矩阵,然后用给定的角度调用glRotate()函数。
那就是说我上面实现旋转的方法并不可取,那用它说的方法怎么实现呢?谢谢!

解决方案 »

  1.   

    圆:
       x = r coscita
       y = r sincita
    椭圆
       x = r1 * coscita
       y = r2 * sincita
    对于旋转还是使用相同的方法
    只要修改你的glTranslatef参数就可以在一个已经变化的物体上,再此变换是需要矩阵串连的,矩阵的乘法费时间
    如果累积当前的角度,直接按照这个角度一次旋转到位就避免了乘法,当然效率高
    而且还在连续性,控制方便性都方面都有好处代码大致应该是这样的
      初始化单位矩阵
      生成旋转角度,以及对应的旋转矩阵
      直接修改该矩阵的移动分量
      设置矩阵
      渲染
      

  2.   

    恩恩根据椭圆公式改一下就好了你的PS说的就是不要每次只增加rotation,然后在原来的基础上旋转
    而是算出每次rotation 的总和,然后画之前glLoadIdentity一下,然后一次性的旋转到这个角度
      

  3.   

    恩 画椭圆的问题解决了
    代码如下:
             //画椭圆型轨迹
    glPushAttrib(GL_ALL_ATTRIB_BITS);
    glDisable(GL_TEXTURE_2D);/*关闭纹理设置*/
    glLoadIdentity();
    double circle_center[3]={0.0,0.0,0.0};//设置圆心,数值暂定
    double PI=3.1415926535897932384626;
    double m_vertex[3];
    double aa=0.8;//长半轴a
    double bb=0.8;//短半轴b
    glBegin(GL_LINE_STRIP);
    for(int i=0;i<=90;i++)

    m_vertex[0]=circle_center[0]+aa*cos(PI*i*4/180.0);
    m_vertex[1]=circle_center[1]+bb*sin(PI*i*4/180.0);
    m_vertex[2]=circle_center[2];
    glVertex3dv(m_vertex);
    }
    glEnd();
    glPopAttrib();
    但是画椭圆旋转轨迹的方法还是没有想出来,麻烦说详细些
      

  4.   

    只要修改你的glTranslatef参数就可以