关于WebGL的类似问题: 绕世界轴旋转物体。
我需要以用户拖动的方式旋转对象,但问题在于glRotatef
只是旋转对象而没有考虑其方向。对于WebGL,解决方案是使用四元数,但我想OpenGL中没有四元数。
现在我实现旋转的方法如下:
// rotation 2D GLfloat C-vector, posX, posY GLfloat's
void mouse(int button, int state, int x, int y) {
if(button== GLUT_LEFT_BUTTON) {
if(state== GLUT_DOWN)
{
posX=x;
posY= y;
onEvent= true;
}
else if(state== GLUT_UP)
{
GLfloat dx= x-posX;
GLfloat dy= y-posY;
rotation[0]= -dy/5;
rotation[1]= dx/5;
onEvent= false;
glutPostRedisplay();
}
}
}
然后,在显示函数中处理旋转:
glPushMatrix();
glRotatef(rotation[0],1,0,0);
glRotatef(rotation[1],0,1,0);
// Draw the object
glPopMatrix();
这种方法有点有效,但是像我说的,如果用户可以通过拖动对象来旋转它,那就更好了。例如,如果物体围绕X轴旋转90度,则当用户水平拖动鼠标使其围绕Y轴旋转时,它会以相反的方向旋转。我需要一个想法,怎样才能实现这个功能?
编辑
我尝试使用glMultMatrixf
,但是物体不能正确地旋转:它被缩放而不是旋转,这是我在鼠标函数中编辑的代码:
// Global variables:
// GLfloat xRotationMatrix[4][4];
// GLfloat yRotationMatrix[4][4];
else if(state== GLUT_UP && onEvent)
{
GLfloat dx= (x-posX)/(180.0*5)*2.0*M_PI;
GLfloat dy= (y-posY)/(180.0*5)*2.0*M_PI;
// Computing rotations
double cosX= cos(dx);
double sinX= sin(dy);
double cosY= cos(dy);
double sinY= sin(dy);
// x axis rotation
xRotationMatrix[1][1]+= cosY;
xRotationMatrix[1][2]+=-sinY;
xRotationMatrix[2][2]+= sinY;
xRotationMatrix[2][2]+= cosY;
// y axis rotation
yRotationMatrix[0][0]+= cosX;
yRotationMatrix[0][2]+= sinX;
yRotationMatrix[2][0]+= -sinX;
yRotationMatrix[2][2]+= cosX;
onEvent= false;
glutPostRedisplay();
}
在显示函数中:
glPushMatrix();
glMultMatrixf((const GLfloat*)xRotationMatrix);
glMultMatrixf((const GLfloat*)yRotationMatrix);
glutSolidTeapot(10);
glPopMatrix();
这是未旋转的茶壶:
如果我把鼠标水平拖动来围绕y轴旋转茶壶,而不是旋转,我得到的是这个结果:
rotation[1]= -dx/5;
吗? - Ashalyndrotation[4][4]
,将其初始化为单位矩阵,并在你的mouse
函数中预乘以正确的旋转矩阵。然后在你的draw
方法中,你调用glMultMatrixf(rotation)
而不是glRotate
相关的内容。 - sbabbi