본문 바로가기

수학

[게임 개발] 왜 게임개발에서 벡터를 알아야하는가

왜 게임개발에서 벡터를 알아야하는가?

이 설명을 하기 이전에 벡터의 사전적 의미를 짚고 넘어가겠습니다.

 

벡터란?

벡터란 크기와 방향을 가지고있는것

이정도만의 정의는 개발을 위해서라도 반드시 외워두는편이 좋습니다.

제가 처음 게임개발 회사 면접에서 제게 물어본 질문이 벡터가 무엇이냐란 질문에 당황하여 대답을 못한적이 있었기에

여러분은 이런 질문에 당황하는일이 없기를 바랍니다.

 

수학적 벡터 기호

0,0을 기준점 A에서 4,3 좌표B를 향하는 벡터가 있으면

\(\vec{AB}\) = (4,3) 벡터라 말하며 이 벡터는 방향과 크기를 가지고있습니다.

 

저 짝대기에서 무엇이 크기이고 방향이냐 이해하기 어려우실수도 있습니다.

여러분의 이해를 위해 자료사진을 하나 더 보여드리겠습니다.

 

 

 

 

 

 

 

 

 

 

보잘적없는 짝대기에 이렇게 많은 의미 활용이 가능해집니다.

magnitude는 벡터를 빗변으로 기준하여 완성되는 직각삼각형의 길이입니다.

 

짝대기의 길이가 크기이고, 화살표가 가리키는 방향이 벡터의 방향입니다.

 

피타고라스 정리로 직접 벡터의 크기 값을 우리가 구할수도 있으며 유니티에서는 직접 계산할 필요없이 magnitude를

구할수있게 지원해줍니다.

magnitude는 기호의 표현과 힘의 크기라는것을 반드시 숙지하는 편이 좋습니다.

 

magnitude는 개발에서 정말 많이 사용됩니다.

몬스터가 플레이어간의 일정한 거리안에 가까워지면 공격한다.

위 로직에서 일정한 거리안을 구하는 방식이 바로 magnitude라는것입니다.

 

플레이어의 좌표 (0,0) 몬스터의 좌표 (4,5) 두 거리의 distance가 6보다 작으면 공격한다.

\sqrt{16 + 25 = 41}

\sqrt{41} < \sqrt{36}

조건 거리보다 약간 멀어서 아쉽게도 공격하지는 않겠네요

 

게임개발 환경은 모두 다양한 수학공식을 사용하여 완성되었습니다.

현실의 자연환경을 가상의 공간으로 표현하기위해서는

실제 현실을 구성하는데 사용된 수학을 이용해서 만들수밖에 없기 때문입니다.

 

벡터의 예시를 들기쉬운 상황이 바로 물체를 비추는 햇빛입니다.

물체에 비춰지는 크기와 방향이 물체를 향하고 있으며

물체에서도 수많은 방향벡터(normalVector)를 뻗어나가고있을때

햇빛과 물체의 방향벡터의 내각 외각을 계산함으로

 

어느부분에서 햇빛에 의해 가장 밝에 빛나고 빛에 가려지는 부분은 그림자가 생기는 음양을 만들내는 과정

이 또한 벡터를 활용하는 예시입니다.

 

또 다른 예시로 우리가 스킬을 개발해야하는 경우에서도 필요합니다.

플레이어가 부채꼴 모양의 범위 스킬을 시전했을 시

적 대상이 부채꼴안에 존재여부를 알기 위해서는 벡터를 활용한 내각 공식을 활용해야합니다.

 

이렇게 벡터를 알아야하는 이유 두가지를 알아봤지만

더욱 무수히 벡터를 사용하고 있습니다 여러분이 게임개발을 지속적으로 이어나가신다면

필요성을 자연스럽게 느끼게 되실거라 생각합니다.

 

오늘은 개발에 사용되는 수학적 벡터의 기본적인 벡터의 합, 방향 벡터 이 두가지만을 글로 정리해보겠습니다.

 

서로다른 벡터의 합

서로 다른 두 벡터는 합이 가능하고

x는 x끼리 y는 y끼리 더하는 값이 벡터의 합입니다 너무 쉽죠

 

벡터의 합은 교환법칙과 결합 법칙이 가능합니다.

위 두가지 벡터의 합의 성질은 게임 개발과는

크게 중요하지않다고 생각합니다.

 

단, 우리가 중요하게 봐야할것은

서로 다른 벡터의 합으로 만들어진 다음 백터는 무엇을 의미하는가 입니다.

0,0의 기준점 O에서 x축으로 5 y축으로 3인 방향의 벡터 A가 존재하며,

(5,-1)의 B 벡터가 존재합니다.

이 두 벡터의 합으로 완성된 다음 벡터는 빨간점중에 어디 일까요?

\(\vec{OA}\) = (5,3)

\(\vec{OB}\) = (5,-1)

(5+5,3-1) = (10,2)

직접 계산을 해보면 10,2라는 결과가 나옵니다.

좌표상으로 보면 가장 우측에 있는 좌표가 x축이 다른 좌표들과 다르게 증가한것을 볼수있고

y축도 3과 -1 사이에 있는것으로 봐서 2에 가까운것으로 볼수있습니다.

 

하지만 이렇게 합해서 만들어진 벡터의 의미는 두 벡터간의 무슨 연관 있는걸까요

새로 완성된 벡터는 두 서로다른 벡터들과 규칙이 존재합니다.

1. \(\vec{OB}\)의 시작점을 A의 머리로 시작하는 선을 하나 그어봅니다. 

 \(\vec{OB}\)의 머리 방향은 바뀌지 않으며 시작점만을 바꿉니다.

 

2. 이렇게 완성된 가상선의 끝점이 

\(\vec{OA}\) + \(\vec{OB}\) 합의 벡터라는것을 확인할수있습니다.

이렇게 서로다른 크기와 방향의 위치는 다음과 같이 완성되는 성질을 확인할수있습니다.

 

방향벡터

전 삼각함수의 필요성에서도 방향벡터의 설명이 처음 나오게 된 만큼

가장 중요한 성질을 가지고있는 방향벡터 입니다.

 

방향벡터의 다른 의미로는 단위벡터라 표현하며 이를 단순히 말로 설명하자면

크기의 값을 1로 정의했을때 바뀌는 값을 단위 벡터라 정의합니다.

 

Why?

왜 크기를 1로 정의하냐 어디에 사용하려고?

 

크기(빗변)가 1이면 이전 삼각수학에서도 활용했던

단위원으로 벡터의 표현이 가능해집니다.

단순 벡터에서 삼각수학을 활용할수있게끔 다리 역할을

해주는게 방향벡터(단위벡터)의 필요성입니다.

 

이렇게 완성된 방향벡터는 cos,sin을 활용해서 내각과 외각의 구하는 응용으로 사용할수있게됩니다.

 

우선 가장 만만한 벡터를 하나 만들어서 방향 벡터를 구해보겠습니다.

\(\vec{AB}\) (4,3)가 있다면

이 크기는 피타고라스 정리에 의해 16 + 9 = 25

5의 크기를 가지게됩니다.

 

방금 설명 드린것과 같이 단위원으로 표현하기 위해 빗변 밑변의 길이 높이를 모두 빗변의 길이만큼 나누어줍니다.

빗변 = 1

밑면 = 0.8

높이 = 0.6

 

결과 \(\vec{AB}\)  방향벡터는 (0.8,0.6)

이렇게 구해진 방향벡터를 이용해서 유니티에서 우리는 특정 객체를 오른쪽 기준으로

0.8,06.방향을 바라보게 하는 응용이 가능해집니다.

 

위처럼 구한 방햔벡터가 유니티에서 정상적으로 동작하는지 간단한 코드를 통해서 확인해보겠습니다.

 

using UnityEngine;

public class LookAt : MonoBehaviour
{
    [SerializeField]
    private Vector2 targetVector;

    void Update()
    {
        transform.right = targetVector.normalized;
        Debug.Log(targetVector.normalized);
    }
}

코드의 설명

회전할 벡터를 targetVector로 변수하였고 남자 얼굴 객체의 right를 기준으로 target의 방향벡터를 대입합니다.

방금까지는 우리가 직접 빗변의 길이를 전부 나눠줬다면 유니티에서는 normale벡터를 위 코드와 같이

지원해줍니다 코드의 가독성을 위해서 직접 구해줄 필요는 없습니다.

 

타겟벡터는 0.4,0.3이나 4,3 상관없습니다 왜냐

빗변은 1로 정규화 되어있습니다 그저 크기가 다를 뿐이고 방향벡터의 값의 영향은 존재하지않습니다.

 

다른 예시의 방향벡터의 응용은

fps게임의 파티클이나 이펙트가 출력되는 방향을 지정하게될수있습니다

 

총알의 방향벡터가 (0.4,0.3)이고 몬스터가 이 총알에 맞아서 피를 흘려야합니다.

그렇다면? 피가 나오는방향은 총알이 발사된 반대 방향일거고

(-0.4,-0.3) 피가 생성되고 나와야할 방향으로 정의할수있게됩니다.

 

자 오늘은 목표기준대로 방향벡터와 벡터간의 합을 알아보는 시간을 가졌습니다.

다음 시간에서는 이렇게 만든 방향벡터를 통해서 내각을 구하는 시간을 가져보겠습니다.

감사합니다.