Je code un algorithme de flocage en Java mais je suis bloqué à un certain point (en utilisant les bibliothèques Ardor3D, en un plan 2D).Trouver l'angle delta à utiliser pour la rotation donnée avec la position, la rotation initiale et le point cible à 'face vers'
Fondamentalement, j'ai besoin de trouver la différence d'angle à ajouter à la rotation actuelle. Si vous ne pouvez obtenir que le point avec des coordonnées polaires avec 0 degs au nord et pas la différence, ne vous inquiétez pas - j'ai une méthode qui retourne la différence d'angle en tenant compte du bouclage sur l'angle et les angles négatifs.
En ce moment, je le code suivant, qui clairement ne pas fonctionner puisque l'algorithme n'a pas de référence à la rotation initiale:
long tpf = currUpdateTimeMS - lastUpdateTimeMS;
Vector2 pos = new Vector2();
rt.getPosition(pos);
double rot = pos.angleBetween(app.getAvgBoidPos(new Vector2()).normalizeLocal());
rt.setRotation(rot);
pos.addLocal(
Math.cos((rot - MathUtils.HALF_PI)) * (tpf/10f),
Math.sin((rot - MathUtils.HALF_PI)) * (tpf/10f)
);
rt.setPosition(pos);
super.updateLogic();
code mis à jour (ne fonctionne pas, de première réponse):
long tpf = currUpdateTimeMS - lastUpdateTimeMS;
//rt.setRotation(rt.getRotation() + ((tpf/(ROT_SPEED/2f)) % 360));
Vector2 avgpos = app.getAvgBoidPos(new Vector2());
Vector2 pos = rt.getPosition(new Vector2());
avgpos.subtractLocal(pos);
double angleRads = rt.getRotation() * FastMath.DEG_TO_RAD;
double rot = MathUtils.acos((
(avgpos.getX() * MathUtils.sin(angleRads)
) +
(avgpos.getY() * MathUtils.cos(angleRads)
))/((Math.pow(avgpos.getX(), 2) + Math.pow(avgpos.getY(), 2)) * 0.5));
double adegdiff = rot * FastMath.RAD_TO_DEG;
rt.setRotation(rt.getRotation() - adegdiff);
double newrot = rt.getRotation();
pos.addLocal(
Math.cos((newrot - MathUtils.HALF_PI)) * (tpf/10f),
Math.sin((newrot - MathUtils.HALF_PI)) * (tpf/10f)
);
rt.setPosition(pos);
super.updateLogic();
Une autre modification en fonction de l'autre réponse:
long tpf = currUpdateTimeMS - lastUpdateTimeMS;
//rt.setRotation(rt.getRotation() + ((tpf/(ROT_SPEED/2f)) % 360));
Vector2 avgpos = app.getAvgBoidPos(new Vector2());
Vector2 pos = rt.getPosition(new Vector2());
avgpos.subtractLocal(pos);
double rot = pos.angleBetween(
app.getAvgBoidPos(new Vector2()).normalizeLocal()
) - (rt.getRotation() * MathUtils.DEG_TO_RAD);
rt.setRotation(rt.getRotation() - (rot * MathUtils.RAD_TO_DEG));
double newrot = rt.getRotation();
pos.addLocal(
Math.cos((newrot - MathUtils.HALF_PI)) * (tpf/10f),
Math.sin((newrot - MathUtils.HALF_PI)) * (tpf/10f)
);
rt.setPosition(pos);
super.updateLogic();
Je ne suis pas vraiment trop bon à des problèmes mathématiques, donc le code serait utile plutôt que des formules :)
Entrées
- Position actuelle de l'entité
- rotation actuelle de l'entité (polaire à orientation) en degrés
sortie
- degrés ou radians pour ajouter ou soustraire à la rotation actuelle
- ... ou degrés ou radians exprimés en angle polaire orienté
Merci à l'avance si vous pouvez aider :)
Chris
Alors 'rt.getPosition' donne la position de l'entité et' app.getAvgBOIDPos' donne la position cible, est ce droit ? Et qu'est-ce qui donne l'orientation de l'entité? – Beta
Ce serait rt.getRotation(), qui est exprimé en degrés polaires :) –
Oups, vous avez oublié de dire que vous avez raison à propos de l'application, getAvgBoidPos() donnant l'emplacement moyen des entités pour que l'entité se déplace vers . –