UNITY 개인과제를 제작한다.
솔직히 좀 게으름 피우다 급하게 하는 중이다.
UNITY에서 오브젝트의 물리적 정보(위치, 운동량, 회전값, 크기 등)를 표현하는 방법은 다양하다.
물론, 3D와 2D에서의 표현 방법도 약간은 달라진다.(2D의 표현값(평면 상)에 하나 이상의 데이터(입체화)가 추가되면 3D라고 지금은 이해하고 있다.)
이 글에서 아래의 내용을 작성한다.
월드 좌표계&로컬 좌표계
오브젝트의 회전
월드 좌표계&로컬 좌표계
UNITY 세상에는 하나의 절대적, 불변적 좌표계인 월드 좌표계와, 각각의 오브젝트가 가지는 가변적이고 의존적 좌표계인 로컬 좌표계가 있다.

위 그림에서 부모 오브젝트가 없는 Player오브젝트는 현재 월드 좌표계가 기준이 돼 그 물리 정보가 정해지고 있다.
반면, Player를 부모로 하는 FocusPivot오브젝트의 물리 정보를 정하는 기준 좌표는 Player오브젝트의 로컬 좌표계다.
즉, 계층 뷰에서 최상위 위치에 있는 오브젝트는 월드 좌표계를, 하위 오브젝트는 상위 오브젝드의 로컬 좌표계를 기준으로 물리 정보를 정하는 것이다. 하위 오브젝트에게 있어 월드 좌표계는 그 상위 오브젝트인 셈이다.
오브젝트의 회전
UNITY에서는 회전값을 표현하는 여러 방법이 있다. Euler, Radian, Quaternion 등등
대체 왜? 그냥 x축 90도, y축 120도, z축 277도 이렇게 하면 해결되는 것 아닌가?
3D공간에 같은 중심을 x,y,z축 고리가 있다고 하자. 마치 아래와 같은 그림이다.

현실 세계에서는 모든 입체 각도를 전부 표현할 수 있다. 이러한 현실세계의 각을 오일러Euler 각이라 한다.
하지만 UNITY에서는, 아래와 같이 2개 이상의 회전축이 일치해지는 경우,

중복되는 회전축 중 종속되는 축 하나가 사라지게 된다. 이로 인해 3개의 회전 값 중 하나를 잃게 된다.
이것을 짐벌 락"GIMBAL LOCK"이라고 한다.
UNITY에서 이를 방지하기 위해 나온 회전값 표현 방법이 쿼터니언Quaternion이다.
쿼터니언은 방향xyz와 회전w를 모두 표현할 수 있고, 0~180도 까지 표현할 수 있다. 180도를 넘어가면 다른 방향으로 측정한다.
무슨 말인지 모르겠다! 유니티 docx에서도 쿼터니언은 쓰기 어려우니 자기들이 쿼터니언을 이용해 만든 편의 함수를 사용하라고 나와 있다.
내가 지금 쿼터니언에 대해 알아야 할 것은 아래의 코드와 함께 작성한다.
void RotateWeapon(Vector2 direction)
{
float rotationZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// Debug.Log(rotationZ.ToString());
weaponRenderer.flipY = Mathf.Abs(rotationZ) > 90.0f;
characterRenderer.flipX = weaponRenderer.flipY;
weaponPivot.rotation = Quaternion.Euler(0, 0, rotationZ);
}
weaponPivot이라는 오브젝트가 있고, 이 오브젝트의 회전값을 구하는 코드다.
rotationZ는 direction이라는 vector2값을 y/x(삼각함수 tan로 값)해서 각도(radian값, 0~3.14로 나타낸다.)를 구하고, 이 radian값을 흔히 아는 Euler각(60도, 90도 이런거)으로 전환했다.
weaponPivot의 rotation은 단순히 이 Euler각만으로 할당되지 못하고, Quaternion으로 변환된 값만을 할당할 수 있다.
지금은 이 정도로만 이해해도.. 충분하다고 생각한다!
transform.rotation 값은 Euler각이 아닌 Quaternion으로 변조된 값을 받는다.
'UNITY' 카테고리의 다른 글
| UNITY_20230908[UNITY 팀 프로젝트 - 벽돌 부수기 게임] (0) | 2023.09.08 |
|---|---|
| UNITY_20230907[UNITY개인 프로젝트 회고] (0) | 2023.09.07 |
| UNITY_20230905[UNITY - 옵저버 패턴-Event] (0) | 2023.09.05 |
| UNITY_20230811[1주차 회고록] (0) | 2023.08.11 |
| UNITY_20230811[팀 프로젝트_4] (0) | 2023.08.11 |