我想将一个物体旋转到一个我有点麻烦的地方。
所以我从一个基数为零的对象开始,并在y轴上对齐。
我想旋转它以使对象的顶部朝向目的地
到目前为止我的流程是: 给定轴A
这是代码表示。我不确定这究竟是什么问题我已经在纸上进行了解决,据我所知,这种方法应该有效,但结果在绘制时完全不正确。如果有人看到任何瑕疵并且可以指出我正确的方向,那就太好了。
Vector3 distance = new Vector3(from.x, from.y, from.z).sub(to.x, to.y, to.z);
final Vector3 axis = new Vector3(0, 1, 0);
final Vector3 direction = distance.clone().normalize();
final Vector3 right = (axis.clone().cross(direction));
final Vector3 up = (distance.clone().cross(right));
float angle = (float) Math.acos((up.dot(direction)/ (up.length() * direction.length())));
bondObject.rotateLocal(angle, direction.x , direction.y, direction.z);
答案 0 :(得分:11)
这里的基本思路如下。
directionA
directionB
rotationAngle
rotationAxis
这是修改后的代码。
Vector3 distance = new Vector3(from.x, from.y, from.z).sub(to.x, to.y, to.z);
if (distance.length() < DISTANCE_EPSILON)
{
//exit - don't do any rotation
//distance is too small for rotation to be numerically stable
}
//Don't actually need to call normalize for directionA - just doing it to indicate
//that this vector must be normalized.
final Vector3 directionA = new Vector3(0, 1, 0).normalize();
final Vector3 directionB = distance.clone().normalize();
float rotationAngle = (float)Math.acos(directionA.dot(directionB));
if (Math.abs(rotationAngle) < ANGLE_EPSILON)
{
//exit - don't do any rotation
//angle is too small for rotation to be numerically stable
}
final Vector3 rotationAxis = directionA.clone().cross(directionB).normalize();
//rotate object about rotationAxis by rotationAngle