2013-01-21 141 views
3

我正在为对象旋转而挣扎。我想用这个小程序来说明我的AR Drone 2.0陀螺仪的读数。 也许你想先观看这部短片:http://youtu.be/HvrLS8Olr2cOpenGL相对于对象轴的旋转

滑块是X,Y,是与

glRotatef(rotationX, x_vect.x, x_vect.y, x_vect.z); 
glRotatef(rotationY, y_vect.x, y_vect.y, y_vect.z); 
glRotatef(rotationZ, z_vect.x, z_vect.y, z_vect.z); 

做Z轴旋转其中的值:

Vector x_vect = {1.0f, 0.0f, 0.0f}; 
Vector y_vect = {0.0f, 1.0f, 0.0f}; 
Vector z_vect = {0.0f, 0.0f, 1.0f}; 

你可以从这里下载这个小应用程序的完整源代码:http://ablage.stabentheiner.de/2013-01-21_openglimportmodel.zip

问题是,如果你旋转让我们说Y轴先然后尝试使用X滑块进行游戏,它不会旋转它应该执行的轴(请参阅C4D动画进行比较)。我认为这是因为我先进行X旋转,然后是Y旋转。交换的代码行,不解决问题,但它推到另一个轴..

回答

1

http://doc-snapshot.qt-project.org/4.8/opengl-grabber.html

http://doc-snapshot.qt-project.org/4.8/opengl-grabber-glwidget-cpp.html

我在做在Qt的OpenGL的旋转,抓取例如是非常有益的。这里有一点来自glwidget.cpp。

void GLWidget::paintGL() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 
// Here is the rotation code: 
glRotated(xRot/16.0, 1.0, 0.0, 0.0); 
glRotated(yRot/16.0, 0.0, 1.0, 0.0); 
glRotated(zRot/16.0, 0.0, 0.0, 1.0); 

drawGear(gear1, -3.0, -2.0, 0.0, gear1Rot/16.0); 
drawGear(gear2, +3.1, -2.0, 0.0, -2.0 * (gear1Rot/16.0) - 9.0); 

glRotated(+90.0, 1.0, 0.0, 0.0); 
drawGear(gear3, -3.1, -1.8, -2.2, +2.0 * (gear1Rot/16.0) - 2.0); 

glPopMatrix(); 
} 
2

发生这种情况的原因是,当您拨打glRotatef()时,对象的透视将旋转。看一看这个美丽模具:
awesome d6

想象x轴通过4和3运行(相对侧上的D6总是加起来7)至6和1运行z轴,并且y轴通过2和5
运行,如果您编写此代码:

glRotatef(90,1,0,0); 
glRotatef(90,0,1,0); 

模具将第一绕90度的x轴,使得6侧在顶部。但是,轴相对于模具保持不变,所以下一次调用将保持旋转模具围绕穿过2和5的轴线,从而有效地将边6以右旋转。当你打开这些电话,并且首先围绕它的y轴旋转模具时,带有6的那一边将首先在右边,然后在顶部。

现在,与此同时。你可以做的是围绕物体旋转相机,而不是旋转物体本身。我建议阅读关于实施一个弧球相机。 This seems like a good start.