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