Toon posts:

[alg] Steering Behaviors for Autonomous Characters)

Pagina: 1
Acties:

Verwijderd

Topicstarter

Iedereen die games heeft gemaakt is het probleem al wel tegengekomen: hoe moet ik mijn units verplaatsen met een bepaalde maximum snelheid, hoe moet ik dit laten afhangen van de masse etc. Ook hoe moet ik groepen aansturen en dergelijke.

Nu ben ik op een site gestoten (http://www.red3d.com/cwr/steer/) waarin de meeste zaken staan uitgelegd die ik zocht. Ter illustratie zijn er applets gemaakt. In dit topic kunnen jullie je bijdrage leveren naar het zoeken hoe deze applets juist zijn gemaakt.


Deze applets ga ik nummeren. Telkens wanneer je een antwoord post moet je dat nummer vermelden [x] op de eerste regel van je reply, zodoende dat we de discussie gestructureerd kunnen houden.[alg] voor een algemene reply.



Hier volgt nu de lijst van de applets
  1. Seek and Flee
  2. Pursue and Evade
  3. Wander
  4. Arrival
  5. Obstacle Avoidance
  6. Containment
  7. Wall Following
  8. Path Following
  9. Flow Field Following
  10. Crowd Path Following
  11. Leader Following
  12. Unaligned Collision Avoidance
  13. Queuing(at a doorway)
  14. Flocking
    (combining: separation, alignment, cohesion)
Ik ga er nog één aan toevoegen
0. Algemene klasse MovingObject

Op dit moment is er wel al een opersource implementatie in C++ geschreven (http://www.red3d.com/cwr/steer/) maar graag zou ik het implemteren in JAVA en daarbij: door de code en tips gescheiden te houden kan je zelf implementeren wat je nodig hebt.


Doel
Iedereen vaart bij kennis van een algemeen physics model en basic AI voor groepssturing. Je kan dus bijdragen door per applet verklaringen en technieken te geven, deze mogen eventueel geillustreerd zijn via java-code bvb. De bedoeling is wel dat we erover gaan discussieren en niet gewoon code neerdumpen.

Extra info
Op de site http://www.red3d.com/cwr/steer/ vind je een Paper waarin er al veel zaken staan uitgelegd. Sommige zaken verstond ik niet direct omdat de paper bijna niet of nauwelijks is geïllustreerd met code-voorbeelden.

Resultaat
Naar mate we samen meer en meer er over te weten komen ga ik dit allemaal coden en publiceren voor jullie!

[ Voor 4% gewijzigd door Verwijderd op 20-02-2004 05:31 ]


Verwijderd

Topicstarter
[0] Physics Model

een physics model bestaat uit een aantal velden
Java:
1
2
3
4
5
6
7
private double mass;
    private Vector2D position;
    private Vector2D velocity;
    private Vector2D maxVelocity = new Vector2D(1,1);
    //private double maxSpeed;
    private double turningSpeed;
    private double angle;


Zoals je ziet twijfel ik zelf hoe ik de maximum snelheid moet bijhouden.
Kan iemand daar een paar tips over geven?


Dit zijn de standaard zaken die je moet doen om je integratie te doen:
  • turningspeed verhogen met input/massa (F/m)
  • angle verhogen met turningspeed
  • steering force in de juiste hoek draaien (10 vooruit is niet 10 vooruit op x-as maar 10 vooruit in richting angle)
  • acceleratie = F/m >> steering_force/massa
  • acceleratie toevoegen aan velocity
  • EVENTUEEL velocity nog uitlijnen op basis van de huidige hoek (hierdoor verdwijnt het ruimteship gevoel en krijgen de unit grip in de bochten
Per stap moet je nu integreren, blijkbaar heb ik dat onbewust al geimplementeerd als Euler integratie.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//steering_direction:
        //x>0: acceleration;    x<0: brake
        //y>0: right            y<0:left
        double oldAngle = angle;
        turningSpeed +=steering_force.getY()/mass;
        angle += turningSpeed;

        //F = m * a
        //a = F/m

        double x = (steering_force.getX())*Math.cos(angle);
        double y = (steering_force.getX())*Math.sin(angle);

        steering_force.setX(x);
        steering_force.setY(y);

        steering_force.divide(mass);

        Vector2D acceleration = steering_force;

        

                x= velocity.getX()*Math.cos(turningSpeed) - velocity.getY()*Math.sin(turningSpeed);

        y = velocity.getY()*Math.cos(turningSpeed) + velocity.getX()*Math.sin(turningSpeed);
        velocity.setX(x);
        velocity.setY(y);


        position.add(velocity);


Commentaren mogen hieronder worden gepost met de vemelding [0] (zoals vermeld staat in de TS)

  • Juup
  • Registratie: Februari 2000
  • Niet online
Algemeen:

De maximale snelheid maxVelocity is een integer. Stel nu dat maxVelocity = 20 afstandseenheden/tijdseenheid, dan moet vx2 + vy2 < vmax2 zijn.

F = m . a
Kracht is massa maal versnelling dus als e een bepaalde kracht op een voertuig werkt dan moet je deze door de massa delen om de versnelling (= toename van de snelheid in 1 tijdsperiode) te krijgen.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Verwijderd

Topicstarter
kleine *kick*

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 24-11-2025

PommeFritz

...geen friet

Ik heb met grote belangstelling alle java applets bekeken.
Dat groepsgedrag is echt leuk om te zien.

Alleen mijn wiskunde is te roestig om iets over de implementatie te kunnen zeggen :-)

(maar enig snuffelwerk toonde wel al aan dat een boel van dit soort simulaties, met name ook kinetische dingen zoals autotjes incl. wielen, maar voor een deel gemodelleerd worden zodat het toch behoorlijk lijkt op de werkelijkheid. Beetje prutsen met wat parameters zodat de auto ongeveer doet wat je wilt)

FireFox - neem het web in eigen hand