有的時候我們希望相機可以慢慢的轉動去看向一個目標物體,官方的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,還是有些差異的,但是一般情況下用起來應該是沒什么問題的。而且兩個方法效果差異也很大,第二種有一種緩動的感覺,第一種是直接旋轉過去。