在这种情况下,我强烈建议您使用四元数,因为它们更独立于 3D 空间中的旋转。
但是:由于您应该知道在屏幕上滑动的方向(一对 X、Y 屏幕坐标),因此您应该能够计算出表示手势的向量。
在 libgdx 中你可以通过调用相机的方法得到一个pickRay
.getPickRay(float screenX, float screenY)
我们需要 3D 空间中的两个点,它们位于相机和对象的旋转中心之间,它们代表两个屏幕坐标,以便计算该旋转的四元数:
// 你不需要标准化光线的方向,因为 libgdx 会为你做这些
final Ray ray1 = camera.getPickRay(oldScreenX, oldScreenY);
final Ray ray2 = camera.getPickRay(currentScreenX, currentScreenY);
// instead of 0.1 use some other values, preferably your camera.near value
// you can play with the scale value since it also represents how much of rotation you will get
final Vector3 screen1 = ray1.direction.cpy().scl(0.1).add(ray1.origin);
final Vector3 screen2 = ray2.direction.cpy().scl(0.1).add(ray2.origin);
现在您在 3D 空间中有了两个点,您可以通过涉及对象中心来计算两个表示要执行的旋转的向量:
final Vector3 cross1 = screen1.cpy().sub(myObjectsCenterPosition).nor();
final Vector3 cross2 = screen2.cpy().sub(myObjectsCenterPosition).nor();
final Quaternion rotation = new Quaternion();
rotation.setFromCross(cross1, cross2);
由于您的对象旋转应该有一个四元数,您可以将新的旋转应用于对象的四元数:
myObjectRotation.mulLeft(rotation);
然后根据对象的旋转四元数旋转你的对象:
myModelInstance.transform.set(myObjectRotation);
我希望我没有忘记任何重要的事情。