画圆形运动轨迹我已经可以实现了,方法如下:
先设定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()函数。
那就是说我上面实现旋转的方法并不可取,那用它说的方法怎么实现呢?谢谢!
先设定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()函数。
那就是说我上面实现旋转的方法并不可取,那用它说的方法怎么实现呢?谢谢!
x = r coscita
y = r sincita
椭圆
x = r1 * coscita
y = r2 * sincita
对于旋转还是使用相同的方法
只要修改你的glTranslatef参数就可以在一个已经变化的物体上,再此变换是需要矩阵串连的,矩阵的乘法费时间
如果累积当前的角度,直接按照这个角度一次旋转到位就避免了乘法,当然效率高
而且还在连续性,控制方便性都方面都有好处代码大致应该是这样的
初始化单位矩阵
生成旋转角度,以及对应的旋转矩阵
直接修改该矩阵的移动分量
设置矩阵
渲染
而是算出每次rotation 的总和,然后画之前glLoadIdentity一下,然后一次性的旋转到这个角度
代码如下:
//画椭圆型轨迹
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();
但是画椭圆旋转轨迹的方法还是没有想出来,麻烦说详细些