내일배움캠프 56일차 TIL

김정환·2024년 12월 3일
0

키워드

  • 내적 사용하기

오늘은 캐릭터가 씬에 배치된 장애물과 상호작용하는 작업을 진행했다.

문제는 이 장애물과 상호작용 할 때, 이 장애물과 캐릭터의 각도에 따라서
상호작용 가능 여부가 달라져야했다.


위의 이미지를 보면 캡슐 형태의 캐릭터가 아래쪽을 바라보고 있다.
그리고 캐릭터의 앞에는 큐브 형태의 장애물이 있는 상태이다.

캐릭터의 오른쪽에는 장애물이 열린(?) 형태로 배치되어있다.

게임상에서 장애물에 숨을 수 있어야하기 때문에
아래쪽 장애물과 같이 캐릭터를 가릴 수 있는 배치라면 상호작용을 할 수 있다.

캐릭터의 위치와 장애물이 배치된 위치 및 방향에 따라 상호작용 가능 여부를 결정해주어야 한다.

벡터 내적 사용하기

여러 고민을 해보다가 방향에 따라서 결정되어야 한다면 내적을 이용해보기로 했다.

내적

영(0) 벡터가 아닌 벡터 A, B가 있을 때, 각도 θ에 대한 두 벡터의 내적은 다음과 같다.

수학식

수학식 : A ⋅ B = ∥A∥∥B∥cosθ

코드

Vector3 dir = (player.position - point.position).normalized;
float dot = Vector3.Dot(dir, point.forward);

Debug.Log($"내적 구하기 : {dot}");

이게 무슨 소리인가
결과물이 float 형태의 숫자 하나가 나온다.

내적의 의미

저 낯선 수식이 중요하기보다는 내적을 쓰는 이유가 이번에는 더 중요했다.
(물론 수식의 의미도 중요하다)

두 벡터에 대한 내적값을 통해서 두 벡터의 각도를 알 수 있다.
각도를 알 수 있다면 두 벡터가 서로 수직인지 수평인지 알 수 있다.


다시 이미지를 보면 두 오브젝트는 서로 마주보고 있다.

계산 적용 1

Vector3 dir = (player.position - point.position).normalized;
float dot = Vector3.Dot(dir, point.forward);
  • 계산한 코드를 보면 어떤 지점으로부터 플레이어로 향하는 방향 벡터를 구한다. (point -> 플레이어)
  • 이 방향 벡터와 어떤 지점이 바라보는 방향의 내적을 구하면 다음 결과가 나온다.

point -> 플레이어를 바라본 방향과 point가 향하는 방향이 일치했다는 의미다.

계산 적용 2

그렇다면 이미지들처럼 point가 아예 다른 곳을 바라보고 있다면 어떤 값이 나올까 계산했다.

내적 구하기 : 0.6768759

내적 구하기 : 0

내적 구하기 : -1

정리

작성된 코드대로 계산을 적용하면 다음 결과가 나온다.

  • 두 벡터의 방향이 일치하면 1
  • 두 벡터의 방향이 수직이되면 0
  • 두 벡터의 방향이 정반대라면 -1

내적의 값이 두 벡터의 각도에 따라 1~-1 사이의 값을 갖고
이를 통해서 두 벡터가 어떤 배치 상태인지 알 수 있는 것이다.

그래서 이 값을 바탕으로 현재 캐릭터의 위치에서
상호작용할 오브젝트의 방향이 1이나 -1에 가까울수록 장애물에 몸을 숨기기 적합해지는 것이다.

이를 위해서 오브젝트의 방향을 미리 위의 이미지들과 같이 설정해두고
필요할 때 각 캐릭터에 대한 장애물의 내적을 구해서 약 0.95이상 값을 가질 때
상호작용 가능하도록 작업을 해두었다.

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글

관련 채용 정보