3D问题 求切磋探讨
glRotatef( dz,0.0,0.0,1.0 );
这个函数我们都知道,是实现物体转动的函数
而且一旦用过了这个函数
该函数以下所有的绘制的物体都将跟着转动。
我的绘图函数如下所示:
PaintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
drawcube000(); //画一个立方体
drawcube100(); //再画一个立方体
}
绘图里调用的函数如下所示
void magic_cube::drawcube000()
{
int i=0;
int j=0;
int k=0;
glRotatef( dx,1.0,0.0,0.0 ); //绕x轴转动dx的角度
glRotatef( dy,0.0,1.0,0.0);
glRotatef( dz,0.0,0.0,1.0 );
glBegin(GL_QUADS);
glColor3f( 1, 1, 0.0 ); //绘制正方体
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glColor3f( 1, 0.0, 1 );
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glColor3f( 0.0, 1, 0.0);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glColor3f( 0.0, 1, 1 );
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glColor3f( 1, 0, 0 );
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, +0.3+j*move_change, +0.3+k*move_change);
glColor3f( 0, 0, 1 );
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, +0.3+k*move_change);
glVertex3f(+0.3+i*move_change, -0.3+j*move_change, +0.3+k*move_change);
glVertex3f(+0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glEnd();
}
void magic_cube::drawcube100()
{
int i=1;
int j=0;
int k=0;
glRotatef( dx,1.0,0.0,0.0 );
glRotatef( dy,0.0,1.0,0.0);
glRotatef( dz,0.0,0.0,1.0 );
glBegin(GL_QUADS);
glColor3f( 1, 1, 0.0 ); //绘制正方体
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glColor3f( 1, 0.0, 1 );
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glColor3f( 0.0, 1, 0.0);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glColor3f( 0.0, 1, 1 );
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glColor3f( 1, 0, 0 );
glVertex3f(-0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, -0.3+k*move_change);
glVertex3f(0.3+i*move_change, 0.3+j*move_change, 0.3+k*move_change);
glVertex3f(-0.3+i*move_change, +0.3+j*move_change, +0.3+k*move_change);
glColor3f( 0, 0, 1 );
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, +0.3+k*move_change);
glVertex3f(+0.3+i*move_change, -0.3+j*move_change, +0.3+k*move_change);
glVertex3f(+0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glVertex3f(-0.3+i*move_change, -0.3+j*move_change, -0.3+k*move_change);
glEnd();
}
我们会发现 如果设置dx=90的话,那么实际上第二个立方体绕x轴已经转动了180度
void magic_cube::drawcube000()里面的旋转函数在void magic_cube::drawcube100()继续起作用,将和自己的旋转函数叠加
有一个方法
就是在void magic_cube::drawcube000()末尾加上:
glRotatef( -dx,1.0,0.0,0.0 );
glRotatef( -dy,0.0,1.0,0.0);
glRotatef( -dz,0.0,0.0,1.0 );
就是转过来的我们再转回去
那么我们就能实现2个立方体同样转90度。
我发现
glRotatef( );
实现的是绕窗口坐标系X轴的旋转和物体坐标系Y,Z轴的旋转,而且是一旦设置,整个paintGL函数全局有效
那么蛋疼的问题来了,非常蛋疼
我呢 在3D窗口中绘制了多个物体
而且要实现是其组合的转动,比如说物体1,2,3 同时左转,然后物体1,4,5同时下转90度等等
这样用glRotatef( )函数是很难实现的
那么有没有一个类似的旋转的函数
可以在magic_cube::drawcube()里单独实现对自身的旋转,而不影响其它的物体
真心求3D大神指导 感激不尽……
或者是对此有兴趣的朋友来探讨下……
[解决办法]
额。。。不用这么麻烦哈。。
在你要对坐标进行旋转的时候。可以用glPushMatrix()..对当前的坐标系进行保存
然后再glroate()....
然后 drawCube().....
最后glPopMatrix()......
这样你不管你如何旋转。。下次来。。x y z轴的方向都没变哈。。
类似QPainter::save();
QPainter::restore();
注意。。你glPushMatrix的时候要确定压的是ModelView.matrix而不是project matrix....
所以之前最好调用gl_selectMatrix(GL_MODELVIEW)..大概是这样写的。。
还有你的写法太老了。。。embedded不支持。。。