[수학] 벡터의 내적

박민주·2022년 6월 6일
0

수학

목록 보기
1/1
post-thumbnail

왜 갑자기 수학이냐면,
프로젝트에서 뭐 구현할 때나, 컴퓨터 그래픽스 수업에서나 내적이 자주 나오는데
편입 때 찐하게 공부했음에도 불구하고 자꾸 개념을 헷갈리고 여기에서 내적을 왜 쓰는지 이해가 잘 되지 않는 상황들이 종종 있어서 정리해본다..

최근에 내적은 유니티에서 터치 스와이프 입력처리에 썼었는데,
화면에서 터치로 한 쪽 방향 스와이프 했을 때 생기는 벡터와
Vector3.up, Vector3.down 이런 벡터랑 비교했을 때 유사성이 어느 정도 이상이면
Up swipe, Down swipe 이런 식으로 처리했었다.

정의

  • a의 크기, b의 크기, 코사인 세타~ 이렇게 외우곤 했다.

내적으로 두 벡터간의 이루는 각도를 알 수 있다.

두 벡터를 내적하고 나면 스칼라 값이 남는데,
이 값을 통해 두 벡터가 얼마나 유사한지를 알 수 있다.

어떻게 두 벡터의 유사성을 알 수 있는지?

크기가 1인 두 벡터가 있을 때

1. 두 벡터가 평행한 경우,
두 벡터가 이루는 각도가 0도 이기 때문에
내적값은 1

2. 두 벡터가 수직인 경우,
두 벡터가 이루는 각도는 90도이기 때문에 내적값은 0 (내적의 정의에 cos이 있는데 cos90은 0이니까)

3. 두 벡터가 이루는 각도가 0도 보다 크고 90도 보다 작은 경우,
내적의 값은 0 ~ 1의 값

dot product는 내적 연산자로 좌변의 벡터를 우변의 벡터에 투영시켜 곱하는 연산자이다


내적은 예전에 드론이 플레이어 시야각 안에서만 공격하도록 할 때에도 사용했었다.

    public bool IsPlayerForward()
    {
        // Player로부터 나(Drone)까지의 '단위벡터'
        Vector3 playerTodroneDir = (transform.position - playerTr.position).normalized;
        // transform.forward와 dirToTarget은 모두 '단위벡터'이므로 내적값은 두 벡터가 이루는 각의 Cos값과 같다.
        //내적값(Cos(a))이  Cos(시야각/2)값보다 크면 시야에 들어온 것이다.
        // 만약 플레이어의 시야에 드론이 들어왔다면,
        if (Vector3.Dot(playerTr.forward, playerTodroneDir) > Mathf.Cos((droneViewAngle / 2) * Mathf.Deg2Rad)
            && Vector3.Distance(playerTr.position, transform.position) < attackDistance)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
// 전체코드 https://github.com/minjujuu/Unity_Project_Scripts/blob/main/3.HashWayVR/MJ_CityDrone.cs

코드 다시 보니 이해가 안되고, 나중에도 헷갈릴 것 같아서 이해하기 위해 그려본 그림 첨부..
변수명을 잘못 지은 것 같은데, droneViewAngle이 playerViewAngle로 바뀌어야 할 것 같다

Mathf.Deg2Rad 도 잘 쓰지 않아 헷갈렸는데, 이건 각도를 라디안으로 변환할 때 쓰는 거다.
근데 왜 변환해야 했더라? 싶어서 검색해보니까
사람에게 친숙한 건 degree이지만, 수학이나 컴퓨터에서 계산 시 잘 쓰이는 건 radian이라서 그렇다고 한다.

참고

Chapter 7-3. AI : 동물 AI 의 시야각

profile
Game Programmer

0개의 댓글