public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);
Vector3 fromDirection
기존 방향 벡터
Vector3 toDirection
목표 방향 벡터
fromDirection를 회전시켜 toDirection로 만들 때 필요한 "회전량"을 반환. 단 이 "회전량"은 "Global 좌표축" 기준임
Y축으로 180˚ 회전된 오브젝트가 있고
아래 그림처럼 회전 시키려고 한다
오브젝트의 transform.up를 -transform.right로 회전시키고 그 회전량을 적용시킨다고 한다면,
targetDir = -transform.right;
Quaternion rotation = Quaternion.FromToRotation(transform.up, targetDir);
transform.rotation *= rotation;
의도와 다르게 결과는 아래 그림처럼 된다.
Quaternion.FromToRotation 는 Global 좌표를 기준으로 하는 회전량이다.
transform.up(0, 1, 0)을 -transform.right(1, 0, 0)로 회전시킨다면,
(오브젝트의 정면에서 보면 반시계 방향으로 회전(-90˚))
회전량은 Z:-90˚ 이다. 따라서 아래 그림처럼 기존 상태 Y:180˚ 에서 Z축으로 -90˚회전한 결과가 된다.
fromDirection, toDirection를 Local 축으로 변환하여 계산한다
(Vector3.up은 transform.InverseTransformDirection(transform.up)과 같다.)
// targetDir은 global 좌표기준의 방향벡터
targetDir = -transform.right;
Vector3 localTargetDir = transform.InverseTransformDirection(targetDir);
Quaternion rotation = Quaternion.FromToRotation(Vector3.up, localTargetDir);
transform.rotation *= rotation;