Sto usando le curve di Bezier come percorsi per le mie astronavi che viaggiano quando arrivano al molo di una stazione. Ho un semplice algoritmo per calcolare dove la nave dovrebbe essere al tempo t lungo una curva di Bézier cubica:Curva Bezier cubica: massima pendenza e prevenzione delle collisioni?
public class BezierMovement{
public BezierMovement(){
// start docking straight away in this test version
initDocking();
}
private Vector3 p0;
private Vector3 p1;
private Vector3 p2;
private Vector3 p3;
private double tInc = 0.001d;
private double t = tInc;
protected void initDocking(){
// get current location
Vector3 location = getCurrentLocation();
// get docking point
Vector3 dockingPoint = getDockingPoint();
// ship's normalised direction vector
Vector3 direction = getDirection();
// docking point's normalised direction vector
Vector3 dockingDirection = getDockingDirection();
// scalars to multiply normalised vectors by
// The higher the number, the "curvier" the curve
float curveFactorShip = 10000.0f;
float curveFactorDock = 2000.0f;
p0 = new Vector3(location.x,location.y,location.z);
p1 = new Vector3(location.x + (direction.x * curveFactorShip),
location.y + (direction.y * curveFactorShip),
location.z + (direction.z * curveFactorShip));
p2 = new Vector3(dockingPoint.x + (dockingDirection.x * curveFactorDock),
dockingPoint.y + (dockingDirection.y * curveFactorDock),
dockingPoint.z + (dockingDirection.z * curveFactorDock));
p3 = new Vector3(dockingPoint.x, dockingPoint.y, dockingPoint.z);
}
public void incrementPosition() {
bezier(p0, p1, p2, p3, t, getCurrentLocation());
// make ship go back and forth along curve for testing
t += tInc;
if(t>=1){
tInc = 0-tInc;
} else if(t<0){
tInc = 0-tInc;
}
}
protected void bezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, double t, Vector3 outputVector){
double a = (1-t)*(1-t)*(1-t);
double b = 3*((1-t)*(1-t))*t;
double c = 3*(1-t)*(t*t);
double d = t*t*t;
outputVector.x = a*p0.x + b*p1.x + c*p2.x + d*p3.x;
outputVector.y = a*p0.y + b*p1.y + c*p2.y + d*p3.y;
outputVector.z = a*p0.z + b*p1.z + c*p2.z + d*p3.z;
}
}
La curva punto di partenza è la posizione nave spaziale, e il punto finale è l'ingresso alla baia di attracco (punti rossi sullo schema). L'astronave ha un vettore normalizzato per la sua direzione e la baia di attracco ha un altro vettore normalizzato per indicare la direzione in cui la nave deve viaggiare in modo da essere allineata direttamente all'alloggiamento di attracco quando arriva (le linee gialle sullo schema)
La linea verde è un possibile percorso dell'astronave e il cerchio viola, il raggio dell'astronave. Infine, la scatola nera è il riquadro di delimitazione della stazione.
ho due problemi:
- L'astronave dovrebbe essere solo in grado di girare a r radianti al secondo
- L'astronave non può volare attraverso la stazione di
Presumo che ciò si traduca in:
a). Individuazione dei "fattori di curva" (lunghezze dei punti di controllo) che daranno un percorso in cui la nave non deve girare troppo stretto
b). Trovare la posizione/direzione dell'astronave da cui non può evitare di entrare in collisione con la stazione (e creare un percorso per guidarlo da quello stato, in modo che possa andare avanti con la parte a))
Tuttavia, con entrambi questi , Non ho avuto molta fortuna nel trovare una soluzione. Ho già il codice per rilevare le intersezioni tra vettori, riquadri, punti e sfere, ma non ancora curve più precise. Ho anche funzioni per farmi trovare la distanza tra due punti.
Qualsiasi aiuto sarebbe apprezzato
Grazie, James
Grazie! e mi dispiace per aver impiegato così tanto tempo a tornare da te. Ho corretto la domanda, anche se alla fine ho optato per un metodo diverso, in cui utilizzo un "punto laterale" che le navi vanno in primo piano se la stazione è nel modo, prima di proseguire fino al punto di aggancio. –