[SFML] Drganie obiektu po przemieszczeniu do celu
Ostatnio zmodyfikowano 2016-03-02 19:44
dameg Temat założony przez niniejszego użytkownika |
[SFML] Drganie obiektu po przemieszczeniu do celu » 2016-03-01 16:44:33 Witam szanowne grono z okazji pierwszego postu. Mój problem jest następujący, tworzę mały symulator pracy robota z systemem lokalizacji na podstawie triangulacji, koncept jest dosyć prosty, trzy znaczniki na podstawie których będzie wyliczana pozycja na dole porównanie odczytu współrzędnych z funkcji getPosition() oraz wyliczonej poprzez algorytm. System poruszania robota jest zbudowany na podstawie kliknięć myszą która wyznacza punkt, następnie jest liczony wektor przemieszczenia i obiekt porusza się do punktu, w momencie kiedy osiąga go zaczyna drgać w miejscu co powoduje zmiany we współrzędnych. Jak mogę uniknąć tego drgania po osiągnięciu zadanych współrzędnych? Funkcja do obliczenia wektora: Vector2f Object::moveObject( Vector2f from, Vector2f to, float t ) { if( from == to ) return Vector2f( 0, 0 ); Vector2f offset = Vector2f( to.x - from.x, to.y - from.y ); float length = sqrtf( offset.x * offset.x + offset.y * offset.y ); offset = Vector2f( offset.x / length, offset.y / length ); offset.x *= t; offset.y *= t; return offset; }
Wykonanie: if( Mouse::isButtonPressed( Mouse::Right ) ) { target.setPosition(( Vector2f ) Mouse::getPosition( window ) ); target.setFillColor( Color::White ); Vector2f lastTarget = target.getPosition(); } else
Event event;
Vector2f offset = object.moveObject( object.objectPosition(), target.getPosition(), delta * speed ); object.object.move( offset );
|
|
michal11 |
» 2016-03-01 17:30:21 Pewnie chodzi o niedokładności float, spróbuj sprawdzać czy obiekt po dotarciu do celu nie znajduje się w jakimś przedziale wartości ( może być nawet mały). |
|
Gibas11 |
» 2016-03-01 19:01:26 Prosta sprawa, masz przykład: - Obiekt jest 0.5px od celu; - Różnica współrzędnych dzielona przez odległość jest większa od odległości; - Po wykonaniu ruchu obiekt dalej jest minimalnie za daleko, tylko po drugiej stronie.
Na twoim miejscu sprawdzałbym czy dystans jest mniejszy od prędkości i jeżeli tak, ustawiał obiekt na docelowych współrzędnych. |
|
dameg Temat założony przez niniejszego użytkownika |
» 2016-03-01 21:56:11 Dodałem sobie zmienną epsilon = 0.3f aby podciągała mi obiekt kiedy jego dystans od celu będzie mniejszy od epsilona: if( object.getDistance( target.getPosition() ) <= epsilon ) { object.object.setPosition( target.getPosition().x, target.getPosition().y ); }
Ale niestety zjawisko nadal występuje, wszystko znajduję się w sekcji |
|
Gibas11 |
» 2016-03-01 22:09:55 0.3f to nie za mało? Przy prędkości rzędu 3-4px/klatkę szanse na trafienie ładnie w odległość 0.3f (lub mniej) są raczej nikłe. |
|
michal11 |
» 2016-03-01 22:14:36 Chyba raczej 3.f powinno być jak już. |
|
dameg Temat założony przez niniejszego użytkownika |
» 2016-03-01 22:22:18 Mimo wszystko przy prędkości 100-150.f i epsilonie od 3-100.f drganie nadal występuje. |
|
1aam2am1 |
» 2016-03-01 22:58:03 Możesz jeszcze zrobić np tak, że jeżeli odległość (do punktu końcowego) jest mniejsza od trasy do przebycia (od czasu, prędkość itd...) To w ogóle nie poruszasz i zwracasz (0,0) tak jakby już był w tym punkcie. |
|
« 1 » 2 |