2017-11-30 16 views
-1

개체가 따라야 할 직선 세그먼트의 경로를 정의하는 벡터 점 목록이 있습니다. 현재,이 같은 경로를 따라 움직임을 애니메이션하기 위해 선형 보간을 수행합니다일정한 속도로 직선 세그먼트의 경로를 따라 이동

public class Demo 
{ 
    public float speed = 1; 
    private List<Vector3> points; 

    private float t; // [0..1] 

    private Vector3 Evaluate(float t) 
    { 
     // Find out in between which points we currently are 
     int lastPointIndex = GetLast(t); 
     int nextPointIndex = GetNext(t); 

     // Obviously, I need to somehow transform parameter t 
     // to adjust for the individual length of each segment. 

     float segmentLength = GetLength(lastPointIndex, nextPointIndex); 

     // But how would I do this? 
     return Vector3.Lerp(points[lastPointIndex], points[nextPointIndex], t); 
    } 

    public void Update() 
    { 
     // Curve parameter t moves between 0 and 1 at constant speed. 
     t = Mathf.PingPong(Time.time * speed, 1); 

     // Then just get the evaluated position for the curve time, but 
     // this gives variant speed if points are not evenly spaced. 
     Vector3 position = Evaluate(t); 
     SetObjectPosition(position); 
    } 
} 

내가, 내가 각 세그먼트의 길이를 고려하여 매개 변수 t을 재조정 할 필요가 일정하게 속도를 달성하기 위해 실현을,하지만 난 것 정확하게 어떻게 찾을 수 없는지.

나는 또한 내가 원하는 속도로 다음 지점으로 이동하여 방향을 바꿀 수 있음을 알고있다. 가까운 거리에 있거나 한 번 이동하면 방향을 바꿀 수있다. 다음 세그먼트,하지만 이것은 실제로 각 세그먼트의 정확한 길이를 알고 정확히 이것을 보간 할 수 있어야 해키처럼 보입니다.

답변

0

실제로 조용합니다. 먼저, 개체에 대해 원하는 속도를 정의하십시오. 예를 들어 초당 6 개입니다. 즉, 선분의 길이가 6 단위이면 객체의 시작부터 끝점까지 1 초가 걸립니다. 즉, 길이가 절반 인 선분 (예 : 3 단위)이 있으면 교차하는 데 0.5 초가 걸릴 것입니다. 그래서, 당신이해야 할 일은 모든 라인 세그먼트의 길이를 계산하고 그것을 원하는 속도로 나누는 것입니다. (3/6 = 0.5 = scaleFactor). 0과 1 사이를 보간하는 대신 0과 1*scaleFactor 사이를 보간하십시오. 코드는 다음과 같이됩니다.

public class Demo 
{ 
public float speed = 1; 
private List<Vector3> points; 

private float t; // [0..1] 

private Vector3 Evaluate(float t) 
{ 
    // Find out in between which points we currently are 
    int lastPointIndex = GetLast(t); 
    int nextPointIndex = GetNext(t); 

    float segmentLength = GetLength(lastPointIndex, nextPointIndex); 
    float scaleFactor = segmentLength/speed; 

    // note that I divided t by scaleFactor instead of multiplication. 
    // That's because Lerp always takes an interval of [0..1]. So, we 
    // adjust the curve parameter instead. 
    return Vector3.Lerp(points[lastPointIndex], points[nextPointIndex], t/scaleFactor); 
} 

public void Update() 
{ 
    // Curve parameter t moves between 0 and 1 at constant speed. 
    t = Mathf.PingPong(Time.time * speed, 1); 

    // Then just get the evaluated position for the curve time, but 
    // this gives variant speed if points are not evenly spaced. 
    Vector3 position = Evaluate(t); 
    SetObjectPosition(position); 
} 
}