Arrive는 찾기와 동일한 로직을 사용한다.

다른점이라 한다면 목표지점에 도착할 때 속도를 감속시켜 멈추는 로직이 추가된다는 것이다.

감속을 위한 계산법으로는 이미 사용하고 있는 Speed 값을 거리로 나누는 방법을 사용하였다.

공식은 다음과 같다.

Speed = Dist / ( Deceleration * 0.3 ) ( 거리 / (감속정도 * 0.3) )
DeceleratedVelocity = TargetVelocity * Speed / Dist  감속된속력 = 원하는속력 * 속도 / 거리 )

위의 공식으로 생각해보면 속도와 거리가 줄어들수록 감속된 속력을 얻을 수 있다. 

원리는 거리가 줄어들면 Speed가 줄어들고 Speed와 거리가 줄어들면 결국 멈추도록 계산된다.

이렇게 얻은 감속된 속력에서 현재속도를 빼면 찾기때와 마찬가지로 조종힘 (D)을 얻을 수 있다. 

D = DV - C


코드

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
// 매개변수 1. 목표지점, 2. 감속정도
Vector2D SteeringBehavior::Arrive(Vector2D TargetPos, Deceleration deceleration)
{
    Vector2D TargetVelocity = TargetPos - m_pVehicle->Pos();
 
    // 거리구하기
    double dist = TargetVelocity.Length();
 
    // 거리가 0보다 크면 이동
    if (dist > 0)
    {
        // 속도 감속의 미세한 조종을 위한 상수
        const double DecelerationTweaker = 0.3;
 
        // 속도 = 거리 / (감속정도 * 미세조종상수)
        // 거리가 줄어들수록 속도가 줄어든다. (분자가 작아질수록 값은 작아진다.)
        double speed = dist / ((double)deceleration * DecelerationTweaker);
 
        // 계산된 속도가 최대속도를 넘는지 확인한다.
        speed = min(speed, m_pVehicle->MaxSpeed());
 
        // 감속된 속력 = 원하는 속력 * 속도 / 거리 
        Vector2D DeceleratedVelocity = TargetVelocity * speed / dist;
 
        // 조종힘 = 감속된 속력 - 현재속력
        return (DeceleratedVelocity - m_pVehicle->Velocity());
    }
 
    return Vector2D(00);
}
cs


+ 후에 동영상을 올릴 수 있으면 추가하겠다.

'All > Algorithm' 카테고리의 다른 글

큰 수 구하기  (0) 2016.03.15
삼각함수를 이용한 원 그리기  (0) 2016.03.15
자동적에이전트 - Flee  (0) 2016.02.21
피벗설정에 따른 퀵정렬의 속도  (0) 2016.01.18
자동적에이전트 - Seek  (0) 2016.01.17

+ Recent posts