Java3D:世界坐标中的旋转对象?

时间:2010-11-21 02:57:50

标签: rotation java-3d

我整晚都在搜索,但找不到我正在寻找的信息,或者即使它有可能,这也很令人痛苦;)

我正在使用Java3D,无法弄清楚如何在世界空间中旋转相机。

我的左/右,上/下旋转都发生在本地空间。 这意味着如果我向左和向右移动,一切看起来都很好。 然而,如果我向下看90度,那么看起来向右90度,一切看起来都在它的侧面。

目前,我正在做以下事情。这将产生上述效果:

TransformGroup cam = universe.getViewingPlatform().getViewPlatformTransform();
Transform3D trfcam = new Transform3D();
cam.getTransform(trfcam);

trfcam.mul(Camera.GetT3D()); //Gets a Transform3D containing how far to rotate left/right and how far to move left/right/forward/back

trfcam.mul(Camera.GetRot()); //Gets a t3d containing how far to rotate up/down

cam.setTransform(trfcam);

或者,我试过的一件事就是旋转根部,但旋转的角度大约为0,所以如果我将摄像机从0移开,它就会变坏。 网上有什么可以告诉我如何实现这种事情吗? 我已经尝试了很多不同的东西,但似乎根本无法理解它。 我熟悉这个概念,因为我已经在Ogre3D中实现了它,只是不熟悉J3D中的土地法则。

提前感谢您的回复:)

1 个答案:

答案 0 :(得分:1)

存储围绕每个轴旋转的声音(x和y),当您尝试围绕x轴旋转时,反转围绕y的旋转,围绕x旋转,然后围绕y重新旋转

我不确定我是否理解你的第二个问题。由于观察者和模型转换是双重的,您可以通过改变世界本身来模拟相机移动。如果您不想转换正在旋转的x和y轴,只需将另一个TransformGroup添加到您正在使用的主TransformGroup中,并在新的转换组中进行转换。

编辑:第一个解决方案很慢,所以你可以从你必须做的3变换中创建一个Transform3D:

假设您已绕x轴旋转(Translate3D xrot),现在需要围绕y旋转:

Translate3D yrot = new Translate3D();  
yrot.rotY(angle); 

Translate3D temp = xot; 
xrot.mul(yrot);  // Dont forget the reverse order. xrot is the previous translate 
xrot.mul(yrot);  // xrot = xrot * yrot * xrot^-1
temp.transpose();  // Get the reverse transform of the old transform
xrot.mul(temp);

yrot = xrot;  // Store it for future rotation around x axis
cam.setTransform(yrot); 

对于您所做的许多转换,它的工作方式类似:反转先前的转换,执行转换,重做旧的转换。我希望它有所帮助。