是否有可能轮换世界的轴而不是物体?
我需要做一些物体的旋转,但是在第一次旋转后,我不能像我想的那样做其他旋转.
如果无法在世界轴上进行旋转,我的第二个选择是在第一次旋转后重置轴.这有什么功能吗?
我无法使用,object.eulerOrder因为它在我object.eulerOrder="YZX"进行一些旋转后设置时会改变对象的方向.
更新:添加了一个jsfiddle来说明:
我有一个放置在场景中的对象(立方体).我的目标是提供3个角度,代表物体在现实世界中的方向.角度将根据实际的X,Y和Z轴进行测量.我失败(悲惨)是如何给对象这些角度,然后随着数据的变化,设置对象以接收新的三角形.我似乎发现的是,当我设置一组初始角度时,一切都很好,但是当我设置一组新角度时,它们似乎相对于局部对象空间方向而不是世界空间进行设置.我试图理解在这个领域提出的一些类似问题,但这些问题似乎是关于围绕轴旋转对象而不是明确地将对象的角度设置为世界轴.
当我的x,y或z角度的值发生变化时,我正在调用:
cube.rotation.set(x, y , z, 'XYZ');
Run Code Online (Sandbox Code Playgroud)
为了进一步说明,这里是我的立方体的屏幕截图...没有改变X或Y,我绕Z旋转90 ...看到之前和之后的两个图像
和
注意旋转是如何围绕紫色面的法线方向发生的,而不是围绕世界Z轴...
我很难过:-(
类似的问题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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在显示功能中处理旋转:
glPushMatrix();
glRotatef(rotation[0],1,0,0);
glRotatef(rotation[1],0,1,0);
// Draw the object
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
它有点工作,但就像我说它应该是如果用户能够拖动对象旋转它.相反,例如,如果对象围绕X轴旋转90度,当用户水平拖动鼠标以使其围绕Y轴旋转时,它以相反的方向旋转.我在这里需要一个想法,我怎么能这样做?
编辑
我尝试使用glMultMatrixf,但对象没有正确旋转:它被缩放而不是旋转,这是我在鼠标功能中编辑的代码:
// Global variables:
// GLfloat xRotationMatrix[4][4];
// GLfloat yRotationMatrix[4][4]; …Run Code Online (Sandbox Code Playgroud)