Quaterion.FromToRotation

jkjkbk·2023년 4월 21일
0

Unity

목록 보기
2/16

Quaterion.FromToRotation

1. Declaration

public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);

2. Parameters

Vector3 fromDirection

기존 방향 벡터

Vector3 toDirection

목표 방향 벡터

3. Returns

fromDirection를 회전시켜 toDirection로 만들 때 필요한 "회전량"을 반환. 단 이 "회전량"은 "Global 좌표축" 기준임

4. Example

1) 문제

Y축으로 180˚ 회전된 오브젝트가 있고

아래 그림처럼 회전 시키려고 한다

오브젝트의 transform.up를 -transform.right로 회전시키고 그 회전량을 적용시킨다고 한다면,

targetDir = -transform.right;
Quaternion rotation = Quaternion.FromToRotation(transform.up, targetDir);
transform.rotation *= rotation;

의도와 다르게 결과는 아래 그림처럼 된다.

2) 원인

Quaternion.FromToRotation 는 Global 좌표를 기준으로 하는 회전량이다.

transform.up(0, 1, 0)을 -transform.right(1, 0, 0)로 회전시킨다면,
(오브젝트의 정면에서 보면 반시계 방향으로 회전(-90˚))

회전량은 Z:-90˚ 이다. 따라서 아래 그림처럼 기존 상태 Y:180˚ 에서 Z축으로 -90˚회전한 결과가 된다.

3) 해결

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;


0개의 댓글