Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Drganie obiektu po przemieszczeniu do celu

Ostatnio zmodyfikowano 2016-03-02 19:44
Autor Wiadomość
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:
C/C++
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:
C/C++
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 );
P-145454
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).
P-145458
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.
P-145461
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:
C/C++
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
C/C++
while( window.isOpen() )
P-145467
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.
P-145468
michal11
» 2016-03-01 22:14:36
Chyba raczej 3.f powinno być jak już.
P-145469
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.
P-145471
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.
P-145473
« 1 » 2
  Strona 1 z 2 Następna strona