Movimento 2D di un oggetto basato sulla velocità e sul nuovo vettore

0

Sto scrivendo un piccolo gioco in cui una nave marittima (come una nave da guerra) può essere spostata in un posto 2D in base agli ordini che riceve. Volevo sapere se qualcuno può aiutarmi a indirizzarmi a un post o codice di esempio che mi aiuterà a spostare una nave da una posizione all'altra in base alla velocità e al nuovo vettore.

Quindi, se avessi una nave che si muove in direzione sud-ovest (diciamo 120 gradi) e riceve nuovi ordini per passare a un nuovo vettore di 020 gradi, come posso calcolare il turno. Non voglio che si accenda una monetina e si diriga nella nuova direzione. Voglio che faccia il giro largo (come se fosse in acqua) e poi quando raggiunge il nuovo vettore, inizia a dirigersi in quella direzione.

Qualsiasi aiuto sarebbe apprezzato.

    
posta user121125 24.02.2014 - 23:16
fonte

3 risposte

1

Stai viaggiando in una particolare direzione a una particolare velocità. Quindi in un sistema di coordinate xy, probabilmente stai facendo qualcosa del tipo:

velocity_x = speed*cos(angle)
velocity_y = -speed*sin(angle)
x += velocity_x*t
y += velocity_y*t

Ora vuoi andare ad una diversa angolazione, cioè una velocità diversa. Una differenza di velocità è un acceleration . Potrebbe essere più facile considerarlo come un radiante / s 2 costante piuttosto che qualcosa di più "realistico". Quindi forse qualcosa come il followng:

acceleration = a_constant // for simplicity
angle = start_angle
while angle < end_angle // depending on clockwise or anticlockwise turn
    angle += acceleration*t
    velocity_x = speed*cos(angle)
    velocity_y = -speed*sin(angle)
    x += velocity_x*t
    y += velocity_y*t
    
risposta data 25.02.2014 - 04:41
fonte
1

Questo è un approccio standard; tracciare la nave usando è la velocità e la direzione e cambiare quelli necessari. Rendi le velocità xey una funzione di quelle.

class Ship
{
    double x = 0;
    double y = 0;
    double speed = 15; // m/s;
    double heading = 120;
    double plannedHeading = 0;
    double turnRate = 3; // deg /s
    public Ship()
    {
        plannedHeading = heading;
    }
    void update(double dt)
    {
        x += dt * getVx();
        y += dt * getVy();
        if (heading != plannedHeading)
        {
            computeTurn(dt);
        }

    }
    void computeTurn(double dt)
    {
        double dh = plannedHeading - heading;
        if (dh < -180)
            dh += 360;
        if (dh > 180)
            dh -= 360;
        if (Math.Abs(dh) < turnRate * dt)
            heading = plannedHeading;
        else
        {
            int dir = 1;
            if (dh < 0)
                dir = -1;
            heading += turnRate * dt* dir;
        }
    }

    public void turnTo(double newHeading)
    {
        plannedHeading = newHeading;
    }
    public double getVx()
    {
        return speed * Math.Acos(heading * Math.PI / 180);
    }
    public double getVy()
    {
        return speed * Math.Asin(heading * Math.PI / 180);
    }

}
    
risposta data 25.02.2014 - 05:46
fonte
-1

Mantieni la direzione in un vettore angolare e aumenta l'angolo nel tempo fino a raggiungere la nuova angolazione. Un vettore angolare è semplicemente un vettore mantenuto in forma angolare. Quindi tieni un campo che contiene l'angolo della nave. Nel tempo (a intervalli regolari, con modifiche in funzione del tempo trascorso), modifica questo angolo fino a raggiungere la nuova intestazione.

Non memorizzare il vettore angolare come un vettore normale usando i componenti x e y, poiché si degraderebbe a causa di inaccuratezze in virgola mobile nel tempo.

    
risposta data 24.02.2014 - 23:30
fonte

Leggi altre domande sui tag