1

我正在使用 Decals 开发 Libdx 应用程序。贴花是 3d 世界中的 2d 精灵。

当我说:

decal.setRotationX(angle)

一切正常,但是当我说:

decal.setRotationX(angle);
decal.setRotationY(angle2);

贴花仅在 Y 轴上旋转。

如何管理这个问题?我发现源代码中的 Decal 使用四元数进行旋转,但目前我不知道如何自定义它以满足我的要求。

提前Tnx!

编辑:

我设法通过以下方式围绕多个轴旋转贴花:

decal.getRotation().setEulerAngles(偏航、俯仰、滚动);

现在我的问题是如何使用 TweenEngine 制作动画?

在获取值方法中,我有:

returnValues[0] = target.getRotation().getYaw();
returnValues[1] = target.getRotation().getPitch();
returnValues[2] = target.getRotation().getRoll();

在设置值方法中,我有:

target.getRotation().setEulerAngles(newValues[0], newValues[1],
                newValues[2]);

但是贴花没有移动或动画,它被卡在一个位置(在 XYZ 轴上稍微旋转)。

任何想法,TweenEngine 中的值都是正确的,但不知何故贴花不会刷新和旋转。

4

1 回答 1

2

如果你只想做一次,你可以这样做:

decal.rotateX(angleX);
decal.rotateY(angleY);
decal.rotateZ(angleZ);

不过,这会将给定角度“添加”到当前角度。

另一种方法是使用 的Quaternion旋转Decal

decal.getRotation().setEulerAngles(yaw, pitch, roll);

下图显示了“yaw”、“pitch”和“roll”的含义:

滚动、俯仰、偏航 http://i.msdn.microsoft.com/dynimg/IC79189.gif

编辑:我刚刚看到了 JavaDoc,Decal.getRotation()它说返回的四元数不应该被修改!我还检查了代码和Decal设置内部update标志的所有其他方法,这将导致贴花在下次渲染时发生变化。Decal.getRotation()不设置此标志,因此对它的更改将不会被识别。

似乎目前没有真正干净和简单的方法来同时设置所有三个轴的旋转。解决方法可能如下所示:

decal.setRotationX(0);
decal.setRotationY(0);
decal.setRotationZ(0);
decal.rotateX(angleX);
decal.rotateY(angleY);
decal.rotateZ(angleZ);

它首先将所有角度重置为 0,然后在每个轴上旋转,同时不覆盖任何其他轴。

于 2014-07-08T12:48:51.467 回答