1

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

我正在使用 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 中的土地法则。

提前感谢您的回复:)

4

1 回答 1

1

存储您围绕每个轴(x 和 y)旋转的弹药,例如,当您尝试围绕 x 轴旋转时,反转围绕 y 的旋转,围绕 x 旋转,然后重新围绕 y 旋转。

我不确定我是否正确理解了您的第二个问题。由于查看器和模型变换是双重的,因此您可以通过变换世界本身来模拟相机移动。如果您不想平移正在旋转的 x 和 y 轴,只需将另一个 TransformGroup 添加到您正在使用的主 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); 

对于您进行的许多转换,它的工作原理类似:反转之前的操作,进行转换,重做旧的转换。我希望它有所帮助。

于 2011-04-14T11:16:15.967 回答