Unity 하면서 항상 헷갈리던 것들 정리(Rotation, Position etc)

1. Rotation

Roation

먼저, transform.LookAt과 Quaternion.LookRotation의 차이점이 궁금했는데 직접 해보니 같은 결과가 나온다.

먼저 LookRotation같은 경우, 지정된 forward와 upwards 방향에 의해 rotation이 결정된다.

 

LookAt은 target의 현재 위치의 vector point을 향해 회전한다.

 

음, 두개의 문법을 살펴보니 차이점이 존재한다. 일단 LookAt같은 경우 타켓팅 되어야할 대상이 존재해야 한다는 것이다. 예를 들어, 유도 미사일 같은데에 사용하면 좋을 듯 싶다, LookRotation은 타켓 없이 회전될 때 사용되어야할 것 같다. 예를 들어, 캐릭터의 회전 같은 곳에 사용하면 될 듯 하다.

 

Z축을 기준으로 한다.

 

Z축을 중심으로 타켓을 바라본다.

 

 

+LookRotation(target, upward);

여기서 upward는 오브젝트의 머리방향이 향할 곳을 가리킨다.(Default -> Vector3.up)

예를 들어 Vector3.right이면

그림에서의 Vector3.up이 아닌 Vector3.right이다

이런 느낌이다(하.. 사실 헷갈린다 이게 맞는지, 실시간 테스트해보면서 하는중인데 up, right는 되는데 forward가 안된다..)

 

+ Quaternion.AngleAxis(각도, 축);

이 함수는 무엇이냐면 Vector.up축을 기준으로 t만큼 회전하는 거다

솔직히 말로 들으면 잘 이해가 안가서 움짤을 준비해봤다

 

Vector3.up을 기준으로
Vector3.right을 중심으로
Vector3.forward를 기준으로

 

회전방향이 많이 어렵죠? 저도 어려워서 저 나름대로의 방법을 찾아왔습니다

왼손을 들어봅시다! 따봉을 해봐요! 따봉이 하늘로 올라가게끔

그리고 축이 되는 방향으로 엄지로 가리키고 감싸봐요! 나머지 4손가락이 가리키는 방향이 오브젝트의 회전방향입니다!!올 개쩔죠? 저도 제가 생각하고 개쩐듯 ㄷㄷ

2. RigidBody, Transform

나는 캐릭터를 이동시킬 때 주로 2가지 방법을 사용한다.

 

첫 번째, transform

이렇게하면 wasd방향키로 캐릭터를 이동시킬 수 있다. nomalized를 사용하는 이유는 정규화를 위함인데, 대각선으로 갈 땐 피타고라파덕의 정리의 의해 루트2가 되어 더 빠르게 움직이는걸 방지하기 위함이다. Time.deltaTime은 이동과 관련된 곳에선 필수다.

이런 식으로, RigidBody 없이 이동할 수 있다. 즉, 물리법칙에서 벗어난 이동이 가능하다는 것이다.

 

다음으론 RigidBody를 활용한 움직임이다

먼저, RigidBody의 들어가 있는 요소들을 살펴보자, mass, drag 등이 있다

구글링 없이 내가 생각나는 대로 적어보겠다, 틀리면 내탓아님;;;;; 이 글을 보는 당신이 잘못...

 

먼저 Mass는 몸무게라고 생각하면 된다.

Drag는 공기의 저항(육상선수가 달릴 때 맞는 바람의 저항이라고 생각하면 될 듯)

Angular Drag는 회전 저항(일직선이 아닌 지그재그 돌 때 저항)

Use Gravity는 중력을 받을건지 안받을건지

Is Kinematic은 외부의 힘을 받지 않을 것인지, 즉 , rigidbody를 이용해서만 움직일 수 있는 존재임, 예를 들어 저게 켜져있으면 코끼리가 달려와 부딪혀도 움직이지 않음

Interpolate는 기억이 안나 구글링 살짝하고옴 ㄱㄷ..

http://egloos.zum.com/metashower/v/9660975 여기에 잘 설명이 나와있다.

Collision Detection은 이제 충돌감지를 하는건데, 

총 4개의 옵션이 있고, Discrete가 Default값이다

Discrete는 연산 속도가 빠르고, 모든 콜라이더에 대해 충돌을 감지한다

Continious는 정적 오브젝트와 충돌될 때 유리하다

Continious Dynamic은 두개를 번갈아 사용한다

맨 아래는 잘 모르겠다 

https://docs.unity3d.com/kr/2019.4/Manual/ContinuousCollisionDetection.html

여기를 참고해라

마지막 constration이다. 이건 고정한다는 의미다. 고정하면 움직이지 않거나 회전하지 않는다

Info를 이용해 이제 캐릭터를 움직일 예정이다...서론이 너무 길었다 후하

RigidBody컴포넌트를 사용하려면 다양한 키워드들이 나온다

position도 있고, rotation도 있고, velocity도 있고..

난 그중 항상 헷갈리는 (RigidBody의 position과 velocity의 차이) 및 (Transform Position)의 차이점을 보려고 한다.

먼저 position이다, 이놈을 사용하면 transform.position거ㅏ 똑같이 작동된다

position을 사용하면 transform이나 rigidbody나 똑같나 보다(사실 당연한 소리였다)

 

rb.velocity을 이용해 오브젝트를 움직여보겠다.

 

얘는 왜 이렇게 움직이냐? 힘을 받기 때문이다.

위에 position은 말그대로 외부의 힘 없이 그냥 Position의 수치만 변경해준 거지만, velocity는 외부의 힘을 받기 때문에 저렇게 굴러가는거다

 

즉, 외부의 힘이 있냐 없냐에 따라 rigidbody를 써주면 된다.

 

+ 구글링하면서 알게된 점

transform.position은 순간이동할 때마다 콜라이더들이 오브젝트의 위치를 재계산한다고 한다.

rigidbody.position같은 경우 마찬가지로 순간이동하지만 리지드바디를 이용해 오브젝트를 이동시키기 때문에 1번보다 퍼포먼스 면에서 좋다고 한다(재계싼X)

마지막으로 rigidbody.MovePosition()이라는 녀석이 있는데 이 녀석은 rigidbody.position의 순간이동하는 영역의 값들을 하나하나 계산해줘서 순간이동이 아닌, 매우 빠른 이동을 구현한다(무거운 녀석인듯)

 

+ velocity는 관성과 질량을 무시한다고 한다!

 

rotation과 position을 활용한 간단한 캐릭터 움직임 구현

더 헷갈리는게 있으면 이어서 쓰겠다