2009-02-26 15 views
5

Mam samochód, a przy przyspieszaniu chcę, żeby prędkość zwiększała się "powoli".XNA MathHelper.SmoothStep? Jak to działa?

Po obejrzeniu kilku stron doszedłem do wniosku, że można w tym celu zastosować metodę SmoothStep?

W zasadzie wiem, jak przenosić tekstury i inne rzeczy, więc przykład, w którym smoothstep służy do zwiększania wartości float lub czegoś podobnego, byłby niezwykle pomocny!

góry dzięki :)

myślę, że to nie smutne isnt przykłady dla wszystkich metod w bibliotece MSDN.

Odpowiedz

12

SmoothStep nie pomoże tutaj. SmoothStep jest funkcją interpolacji dwóch wartości. Robi coś podobnego do interpolacji zatok. Przyspieszy powoli, osiągając ostrą prędkość około x = 0,5, a następnie zwalniając do przybycia (x = 1,0).

tak:

smoothstep_approx

Jest to przybliżona, rzeczywista funkcja nie mają tych dokładnych liczb.

Tak, można użyć x = 0..0.5, aby uzyskać pożądany efekt, ale z bardzo małą kontrolą nad krzywą przyspieszenia.

Jeśli chcesz naprawdę przyspieszyć samochód lub inny obiekt, najlepiej byłoby śledzić przyspieszenie i prędkość.

class Car : GameComponent 
{ 
    public override void Update(GameTime time) 
    { 
     velocity += acceleration * time.ElapsedGameTime.TotalSeconds; 
     position += velocity * time.ElapsedGameTime.TotalSeconds; 
    } 

    Vector3 position; 
    Vector3 velocity; 
    Vector3 acceleration; 
} 

Pozycja, prędkość i przyspieszenie będące Vector2 lub Vector3 w zależności od tego, ile wymiarów używa twój stan gry. Należy również pamiętać, że ta forma integracji jest podatna na niewielkie błędy matematyczne.

5

Od this documentation wygląda jak SmoothStep trwa 3 argumenty - dwie wartości, które chcesz przenieść pomiędzy i wysokość między nimi, które prawdopodobnie musi być pomiędzy 0 a 1.
więc powiedzieć, że masz pływaka f sumujący liniowo od 0 do prędkości docelowej w określonym czasie. zamiast używać f bezpośrednio jak prędkość, używając SmoothStep będzie wyglądać następująco:

float speed = MathHelper.SmoothStep(0, destSpeed, f/destSpeed); 

To naprawdę niesamowite, jak źle to dokumentacja.

0

Bardzo przydatna strona znaleziona w międzyczasie. http://johnnygizmo.blogspot.com/2008/10/xna-series-basic-ai.html

+0

Gdy potrzebujesz interpolować dyskretne liczby na liczby rzeczywiste, a punkt klucza musi mieć wartość zero. powiedzmy, że chciałeś, aby twój samochód zaczął powoli w określonym momencie, a potem powoli zatrzymał się w bardzo precyzyjnym momencie, a wtedy SmootStep pomógłby ci w tym. – Coincoin

+0

Może to również być bardzo przydatne w przypadku wszystkich przejść animacji, takich jak menu. – Coincoin

+0

jeśli masz przykłady, proszę pisać :) – Moulde