벡터의 정규화 예시 1
벡터의 방향을 계산해 정규화를 거친 코드는 아래와 같다
Vector3 dirVec = targert.position - transform.position;
dirVec.Normalize();
// dirVec = dirVec / dirVec.magnitude;
transform.position += dirVec * speed * Time.deltaTime;
유니티에서 제공하는 정규화 함수를 사용하면 되고
주석에 있는 것처럼 직접 구해도 상관은 없다
이처럼
Normalize를 해주면, 노란 공처럼
Normalize를 해주지 않으면, 빨간 공처럼
아래와 같은 결과물이 나타난다
벡터의 정규화 예시 2 (with. tangent)
tangent를 활용하여 아래의 결과물처럼
오브젝트가 해당하는 목표 오브젝트까지 각도를 꺾어 이동하게 만들고 싶다면
아래와 같이 코드를 작성하면 된다
Vecotr3 dirVec = (target.position - transform.position);
dirVec = dirVec.normalized;
transform.position += dirVec * 2f * Time.deltaTime;
float rot = Mathf.Atan(dirVec.y / dirVec.x);
float degree = rot * Mathf.Rad2Deg;
if(dirVec.x < 0)
degree += 180;
transform.rotation = Quaternion.Euler(0, 0, degree);
Atan을 통해 세타를 구했고
세타는 라디언 표기 상태이니 Rad2Deg를 이용한 것이다
또한, dirVec.x가 음수인 경우는
180을 더해서 방향을 제대로 바꿔주지 않으면
아래와 같은 결과물이 나온다
그 이유는 Atan의 그래프를 보면 쉽게 이해가 가능하다
Mathf.Atan() 함수는 -π/2 < angle < π/2 범위의 값을 반환한다
그러나 실제 방향 벡터의 x와 y 구성 요소를 사용하여 각도를 계산하면
어느 사분면에 있는지에 따라 부호가 바뀔 수 있다
만약 dirVec.x가 양수이고 dirVec.y가 음수인 경우, 3사분면에는 올바른 각도를 얻는다
그러나 dirVec.x가 음수이고 dirVec.y가 양수인 경우, 2사분면에는 올바른 각도를 얻지 못한다
따라서 이 경우에는 각도를 보정해야한다
그래서 dirVec.x가 음수인 경우, 즉 dirVec가 2사분면에 있는 경우에는 각도에 180도를 더하여 보정해야 한다
이렇게 하면 올바른 각도를 얻을 수 있습니다.
따라서,
특정 오브젝트의 방향으로 보내기 위해서는
단위벡터를 사용해야 하고 (의도적으로 정규화를 하지 않은 결과물을 도출해 내는 경우를 제외하고)
Atan를 사용하는 경우에는,
Rad2Deg를 사용해서 세타 각도를 알아낼 수 있다
그리고 그 값은 음수값이 나오지 않도록 주의해야 한다
'게임 수학 & 물리 > 게임 수학' 카테고리의 다른 글
[게임 수학] 벡터의 내적 (2) (0) | 2023.10.28 |
---|---|
[게임 수학] 벡터의 내적 (1) (0) | 2023.10.28 |
[게임 수학] 벡터의 기초 (1) (0) | 2023.10.17 |
[게임 수학] tangent (0) | 2023.10.16 |
[게임 수학] sin, cos (2) (0) | 2023.10.16 |