首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

3D有关问题 求切磋探讨

2012-10-12 
3D问题 求切磋探讨glRotatef( dz,0.0,0.0,1.0 )这个函数我们都知道,是实现物体转动的函数而且一旦用过了

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不支持。。。

热点排行