Unity 用InverseTransformPoint方法计算两点之间的夹角
求两点的夹角方式很多,这里记录下用InverseTransformPoint的方法求两个点夹角的方法。
首先Vector3 relative = A.transform.InverseTransformPoint(B.transform.position) 是用来计算B相对于A坐标系下的坐标(相当于向量B-向量A? 其实不是,因为这个方法受到A缩放值的影响,如果A的缩放是1,那结果就是向量B减去向量A的差值)。
了解这个方法之后,可以通过反正切的方法计算两点夹角:mathf.atan2(y,x),这个方法返回【-pi,pi】比math.atan()方法稳定。
图画的很low,能看懂就行
得到这个角度为float angle = Mathf.atan2(relative.z,relative.x) * Mathf.Rad2Deg;
A到B需要旋转的角度即为angle,Unity宝典中就是这个例子。
实际用的时候遇到了一个很简单的问题:我想让A围绕一个轴旋转到B
A.transform.RotateAround(B.transform.position,Vector3.up,angle);
发现A没有朝向B,其实原因很简单,就是A自身也是有旋转的,A起始状态就是在y轴有270度的旋转,只要加上这个角度即可。
float eulerAngleY = A.transform.eulerAngles.y;
A.transform.RotateAround(B.transform.position,Vector3.up,angle+eulerAngleY);