1. 场景 中创建一个不均匀的方块。 然后创建小球。 我需要通过控制小球的相对位置来让方块跟随旋转。 不过这样的话如果小球是随意移动,物体也会在三个轴进行旋转。我想让它旋转的时候只沿着角度变化比较大的轴进行旋转。
这样控制的话,会。。。稳一些吧。。。 因为假设实在手势交互中,两个小球是通过两个手控制,会很随意,,从而让旋转很乱。 这样贴近主要的旋转轴向进行旋转,我只要多旋转几次,就能保证准确度。
2.如图,通过调整2的位置,让中间的方块角度随着 1和2的相对角度变化而变化。
实现代码如下
public Transform Point01;
public Transform Point02;
public Transform Traget;
private Quaternion _orgRotation;
private Vector3 _orgPosition;
private Vector3 _orgPoint01;
private Vector3 _orgPoint02;
void Start()
{
_orgRotation = Traget.rotation;
_orgPosition = Traget.position;
_orgPoint01 = Point01.position;
_orgPoint02 = Point02.position;
}
void Update()
{
Vector3 direction = Point02.position - Point01.position;
Vector3 orgDirection = _orgPoint02 - _orgPoint01;
Vector3 normal = Vector3.Cross(orgDirection, direction).normalized;
normal = CalculateZeroedVector(normal);
Vector3 plane_direction01 = Vector3.ProjectOnPlane(direction, normal);
Vector3 plane_direction02 = Vector3.ProjectOnPlane(orgDirection, normal);
Quaternion temp = Quaternion.FromToRotation(plane_direction02, plane_direction01);
Traget.rotation = temp * _orgRotation;
}
/**Finds nearest cardinal vector to a vector */
public Vector3 CalculateZeroedVector(Vector3 vectorToZero)
{
var zeroed = new Vector3();
float max = Mathf.Max(Mathf.Abs(vectorToZero.x), Mathf.Abs(vectorToZero.y), Mathf.Abs(vectorToZero.z));
if (Mathf.Abs(vectorToZero.x) == max)
{
zeroed = (vectorToZero.x < 0) ? new Vector3(1, 0, 0) : new Vector3(-1, 0, 0);
}
if (Mathf.Abs(vectorToZero.y) == max)
{
zeroed = (vectorToZero.y < 0) ? new Vector3(0, 1, 0) : new Vector3(0, -1, 0);
}
if (Mathf.Abs(vectorToZero.z) == max)
{
zeroed = (vectorToZero.z < 0) ? new Vector3(0, 0, 1) : new Vector3(0, 0, -1);
}
return zeroed;
}
3.思路是在计算旋转之前先对1 和2 的方向变化做投影。这样就可以投影到 X Y Z 中变化最大的轴。然后在这个投影面上计算旋转角。
中间需要计算哪个轴是变化最大的轴,就通过前后两次 方向,做 叉乘,就能得到 两个方向所在平面的法线。 将法线贴近 最近的轴,即CalculateZeroedVector 方法。就可以得到要旋转的平面了,,只要把前后的方向投影过来,,计算旋转,就OK啦。
4.开始做这个功能是直接计算了前后两个方向 做的旋转,然后让对象做相同的旋转,,旋转之后准备通过欧拉角得到变化最大的轴,然后贴过去。。结果不行。。欧拉角 变化,,0和360是一个位置,,比较大小实在是不准呀。。。。