7-1 내적을 활용한 목표물 감지
2023. 6. 7. 00:35ㆍ개인공부/게임수학
코드
플레이어의 시야벡터와 playerToTarget을 각각 단위벡터로 만들고 둘을 내적한 결과값이 시야 범위 안에 있는지 계산하고 플레이어 탐지 범위안에 있으면 목표물을 감지한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
// 플레이어 이동
Vector2 inputVector = Vector2(input.GetAxis(InputAxis::XAxis), input.GetAxis(InputAxis::YAxis)).GetNormalize();
Vector2 deltaPosition = inputVector * moveSpeed * InDeltaSeconds;
// 플레이어 시선방향 입력
float deltaRadian = input.GetAxis(InputAxis::WAxis);
playerGazeRadian += deltaRadian * rotateSpeed * InDeltaSeconds;
// 각도 조정
if (playerGazeRadian >= Math::TwoPI)
{
playerGazeRadian -= Math::TwoPI;
}
else if (playerGazeRadian < 0.f)
{
playerGazeRadian += Math::TwoPI;
}
// 플레이어 시야각 벡터를 구한다.
float sin = 0.f, cos = 0.f;
Math::GetSinCosRad(sin, cos, playerGazeRadian);
Vector2 playerFov(cos, sin);
// 단위백터로 만든다.
playerFov.Normalize();
Vector2 playerToTarget = (targetPosition - playerPosition).GetNormalize();
// 시야각의 cos 값은 최초 1회만 계산해 보관한다.
// 여기서 const보다는 static이 맞을까? const float halfFovCos = cosf(Math::Deg2Rad(fovAngle * 0.5f));
// 플레이어와 목표와의 거리
float distance = Vector2(playerPosition - targetPosition).Size();
// 시야각 안
if (playerToTarget.Dot(playerFov) >= halfFovCos && distance <= playerDetectLength)
{
playerColor = LinearColor::Red;
targetColor = LinearColor::Red;
}
// 시야각 밖
else
{
playerColor = LinearColor::Gray;
targetColor = LinearColor::Blue;
}
playerPosition += deltaPosition;
|
cs |
'개인공부 > 게임수학' 카테고리의 다른 글
7-3 내적을 활용한 벡터의 투영 (0) | 2023.06.07 |
---|---|
6.4 선 그리기 알고리즘 (0) | 2023.06.06 |
6-1 행렬 곱셈으로 이동 구현하기 (0) | 2023.06.05 |
5-2 역행렬을 사용해 원래 형태로 되돌리기 (0) | 2023.06.03 |