내적
벡터 A와 벡터 B를 내적하면 벡터 A와 벡터 B가 이루는 각의 코사인 값이 나온다
여기서 |A|와 |B|는 단위벡터로 1이 될 것이기 때문에 cos θ 만 남게 된다
외적
벡터 A와 벡터 B를 외적하면 벡터 A와 벡터 B에 수직인 벡터가 나온다
공식은 이렇게 되고, 외적의 경우 내적과 달리 연산 순서에 따라 값이 달라진다
예를들어 A(1,2,0) B(2,1,0)이라는 벡터가 있을 때
A x B = (0-0, 0-0, 2 - 4) = (0, 0 ,-2)로 아래로 뻗는 벡터가 나오지만
B x A = (0-0, 0-0, 4 - 2) = (0, 0, 2)로 위쪽을 향하는 벡터가 나온다
벡터의 외적은 오른손 법칙을 따른다
A벡터에서 B벡터의 방향으로 오른손을 휘감고 엄지손가락이 외적한 결과값의 방향이 된다
이러한 특성을 사용하여 게임 프로그래밍에서는
적이 위치한 방향이 왼쪽인지 오른쪽인지를 외적값의 결과에 따라서 판별하도록 활용하기도 한다
투영 벡터
벡터 A를 벡터 B에 투영시켰을 때 투영벡터 H를 구하기
반사 벡터
위에서 구한 투영 벡터를 활용하여
입사 벡터가 주어졌을 때, 반사 벡터를 구할 수 있다
입사 벡터 v, 평면에 법선 벡터 n, 입사각 θ일 때 반사벡터 r을 구해보자
먼저 입사 벡터 v의 방향을 내적하기 쉽도록 방향을 바꿔주자
방향을 반대로 바꾼 -v벡터를 투영시킨다
오른쪽방향으로 90도 돌려서 보면 투영벡터의 이해가 더 쉽다
(투영벡터 구하기 공식의 분모는 |n| (법선벡터의 크기) 이 정규화된 벡터로 1이 된다)
투영 벡터를 구했다면 위의 그림처럼 그림을 그려본다
그림을 보면 이해가 쉽다
벡터의 특징에 따라서 v벡터에 투영 벡터를 두번 더해주면 반사 벡터 r이 나오게 된다
시야각 ( Field Of View )
시야각이란 말 그대로 캐릭터를 중심으로 어느 각도까지 볼 수 있게 할 것인가를 말한다
캐릭터가 적일 때, 플레이어를 어느 각도까지 인식할 것인지
또는 캐릭터가 플레이어일때, 어느 각도까지 방어로 인정할 것인지 등의 각도를 판단할 때 시야각을 계산해줘야한다
시야각을 60도라고 가정하고
플레이어의 전방벡터를 F, 적1과 플레이어가 이루는 벡터를 E1, 적2와 플레이어가 이루는 벡터를 E2라고 했을 때
F와 E1을 내적한 값은 F와 E1이 이루는 각 θ1의 cos값이 나온다
해당 값은 cos함수의 특성 상 cos (60/2)보다 큰 값이 나오게 된다
-> 플레이어를 기준으로 우측 30도, 좌측 30도가 시야각이므로 60/2
반면에 F와 E2를 내적한 값인 cos θ2는 cos(60/2)보다 작은 값이 나오게 된다
따라서 적1만 시야각 안에 있는 적으로 판별할 수 있다
적의 위치 판별 ( 좌우 판단 )
위와 동일하게 플레이어의 전방벡터 F, 적1과 플레이어가 이루는 벡터 E1, 적2와 플레이어가 이루는 벡터2
적1과 적2가 플레이어의 우측에 있는지 좌측에 있는지 어떻게 판별할까?
벡터의 외적을 사용하면 된다
예를들어
플레이어의 전방벡터 F 가 (0, 1, 0)
E1(-1, 1, 0)
E2(1, 1, 0) 일 때
F x E1 = (0, 0, 1)
F x E2 = (0, 0, -1) 이 나온다
플레이어의 up벡터가 (0, 0, 1)일 때
up벡터와 해당 결과들을 내적해보면 양수인지 음수인지에 따른 적의 위치를 알 수 있다
( -> 내적한 결과가 양수라면 up벡터와 외적한 결과 벡터가 같은 방향이라는 뜻으로, 적이 플레이어의 왼쪽에 있다는 의미, 음수라면 오른쪽에 있다는 의미가 된다)
이 값들은 왼손 좌표계를 사용하느냐, 오른손 좌표계를 사용하느냐에 따라서 결과가 달라지므로 주의해야한다
'> 개념' 카테고리의 다른 글
[C++] 가상 함수 (0) | 2024.02.05 |
---|---|
[C++] 생성자 (0) | 2023.12.01 |
[C++] 변수와 메모리 공간 (0) | 2023.11.24 |
[C++] #pragma pack (0) | 2023.06.24 |
[게임 수학] 사원수 (Quaternion) (0) | 2023.06.04 |