有的时候我们希望相机可以慢慢的转动去看向一个目标物体,官方的API里有个方法是LookAt,但是LookAt是直接看过去,少了一个旋转的过程。
void CameraRotateToLookAt(Transform target,float rotateSpeed) { //取得目标物体相对于相机的法向量 Vector3 normalize = Vector3.Cross(myCamera.transform.forward,target.transform.position-myCamera.transform.position); float angles = Vector3.Angle(myCamera.transform.position,target.transform.position); //以该法向量为轴进行旋转 myCamera.transform.Rotate(normalize,Time.deltaTime*rotateSpeed,Space.Self); Debug.Log(angles); if(angles == 0) { rotateSpeed = 0; } }
其实这个可以引申到很多方面,比如说怪物的AI,怪物转向Player,又或者其它的一些物体或者游戏的角色控制等。只需要替换一下myCamera即可,另外这个原理就是取得两个物体之间的相对法向量,然后相对该法向量进行旋转。不过还有一些其它办法可以实现,例如:
Quaternion rotation = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation,rotation,damping*Time.deltaTime);
不过这个方法并不是很准确的LookAt,还是有些差异的,但是一般情况下用起来应该是没什么问题的。而且两个方法效果差异也很大,第二种有一种缓动的感觉,第一种是直接旋转过去。