Ik ben op dit moment bezig een simpel model te maken in java voor beweging van een unit op het laagste niveau (de locomotive).
De implementatie heb ik gebaseerd op een tutorial van "autonomous agents".
Hier wordt een unit voorgesteld als
*massa: scalar
*positie: vector
*velocity: vector
*max_force:scalar
*max_speed: scalar
*richting: 2 vectors
de richting zijn twee basis vectoren. Hier wringt nu net het schoentje.
ik heb één methode: integrate(Vector steering_direction)
x>0: stuwing
x<0: remmen
y>0: rechts
y<0: links
oproepen van de methode:
unit.integrate(new Vector2D(10,0)); // ga vooruit met 10
unit.integrate(new Vector2D(0,5));// ga rechts met 5
Je hebt eigenlijk twee assenstelsels: het externe en het interne.
Positie zorgt voor een plaats op het extern assenstelsel en velocity en richting zijn vectoren die zijn gedefinieerd in het intern assenstelsel.
Nu komt de steering_direction binnen in de vorm van een lokaal assenstelsel: 0,10 bijvoorbeeld.
Dit moet dan worden geconverteerd naar de echte positie. Dit doe ik door een rotatie toe te passsen.
Wat ik eigenlijk wil bereiken is dat wanneer mijn unit 30 graden staat gedraaid, en hij moet vooruitgaan, hij in de richting gaat van die 30 graden.
Hier volgt mijn methode:
Voor de code te begrijpen:
forward = basis vector in local space: in de richting die hij wijst.
up of side as heb ik niet meer nodig (want die staat er toch perpendicular op??? of niet?)
forward as wordt dan opnieuw berekend aan de hand van de genormalisseerde versie van de velocity.
zoals je ziet wordt mijn hoek berekend aan de hand van het dot product tussen de huidige x-as (extern assenstelsel) en foward-as (intern assenstel):
Nu heb ik een paar vragen: ten eerste werkt de code alleen maar wanneer ik beweeg naar het vierde kwadrant toe (eerste kwadrant in comuter graphics??)
ten tweede: is dit de juiste manier om het te doen? of maak ik het weeral veel te moeilijk?
(acceleration etc werkt wel perfect).
De implementatie heb ik gebaseerd op een tutorial van "autonomous agents".
Hier wordt een unit voorgesteld als
*massa: scalar
*positie: vector
*velocity: vector
*max_force:scalar
*max_speed: scalar
*richting: 2 vectors
de richting zijn twee basis vectoren. Hier wringt nu net het schoentje.
ik heb één methode: integrate(Vector steering_direction)
x>0: stuwing
x<0: remmen
y>0: rechts
y<0: links
oproepen van de methode:
unit.integrate(new Vector2D(10,0)); // ga vooruit met 10
unit.integrate(new Vector2D(0,5));// ga rechts met 5
Je hebt eigenlijk twee assenstelsels: het externe en het interne.
Positie zorgt voor een plaats op het extern assenstelsel en velocity en richting zijn vectoren die zijn gedefinieerd in het intern assenstelsel.
Nu komt de steering_direction binnen in de vorm van een lokaal assenstelsel: 0,10 bijvoorbeeld.
Dit moet dan worden geconverteerd naar de echte positie. Dit doe ik door een rotatie toe te passsen.
Wat ik eigenlijk wil bereiken is dat wanneer mijn unit 30 graden staat gedraaid, en hij moet vooruitgaan, hij in de richting gaat van die 30 graden.
Hier volgt mijn methode:
code:
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
| public void integrate(Vector2D steering_direction ){
//steering_direction:
//x>0: acceleration; x<0: brake
//y>0: right y<0:left
steering_direction.setX(steering_direction.getX()*Math.cos(angle)-steering_d
irection.getY()*Math.sin(angle));
steering_direction.setY(steering_direction.getX()*Math.sin(angle)+steering_d
irection.getY()*Math.cos(angle));
//x-velocity
double steering_force = Math.min(steering_direction.getX(),maxForce);
double acceleration = steering_force/mass;
velocity.setX(Math.min(velocity.getX()+acceleration,maxSpeed));
//y-velocity
steering_force = Math.min(steering_direction.getY(),maxForce);
acceleration = steering_force/mass;
velocity.setY(Math.min(velocity.getY()+acceleration,maxSpeed));
//new position
position.setX(position.getX()+velocity.getX());
position.setY(position.getY()+velocity.getY());
forward = velocity.getNormalizedVector();
angle = forward.dotProduct(x);
} |
Voor de code te begrijpen:
forward = basis vector in local space: in de richting die hij wijst.
up of side as heb ik niet meer nodig (want die staat er toch perpendicular op??? of niet?)
forward as wordt dan opnieuw berekend aan de hand van de genormalisseerde versie van de velocity.
zoals je ziet wordt mijn hoek berekend aan de hand van het dot product tussen de huidige x-as (extern assenstelsel) en foward-as (intern assenstel):
Nu heb ik een paar vragen: ten eerste werkt de code alleen maar wanneer ik beweeg naar het vierde kwadrant toe (eerste kwadrant in comuter graphics??)
ten tweede: is dit de juiste manier om het te doen? of maak ik het weeral veel te moeilijk?
(acceleration etc werkt wel perfect).
