Estoy usando curvas de bezier como caminos para que mis naves espaciales viajen cuando llegan al muelle en una estación. Tengo un simple algoritmo para calcular donde el barco debe estar en el tiempo t a lo largo de una curva de Bezier:Curva de Curva cúbica: ¿Reducción máxima de gradiente y colisión?
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 de punto de partida es la ubicación de la nave espacial, y el punto final es la entrada a la bahía de acoplamiento (puntos rojos en el diagrama). La nave espacial tiene un vector normalizado para su dirección, y la bahía de acoplamiento tiene otro vector normalizado para indicar la dirección en la que la nave debe viajar para alinearse directamente con la bahía de acoplamiento cuando llega (las líneas amarillas en el diagrama)
La línea verde es una ruta posible de la nave espacial, y el círculo púrpura, el radio de la nave espacial. Finalmente, la caja negra es el cuadro delimitador de la estación.
que tienen dos problemas:
- La nave espacial se supone que sólo es capaz de convertir en radianes por segundo r
- La nave espacial no puede volar a través de la estación de
Supongo que esto se traduce en:
a). Encontrar los "factores de curva" (longitudes de punto de control) que darán un camino donde el barco no tiene que girar demasiado apretado
b). Encontrar la ubicación/dirección de la nave espacial desde la que no puede evitar colisionar con la estación (y crear una ruta para guiarla fuera de ese estado, para que pueda avanzar con la parte a))
Sin embargo, con ambos No he tenido mucha suerte para encontrar una solución. Ya tengo un código para detectar intersecciones entre vectores, cuadros, puntos y esferas, pero aún no hay curvas más curvas. También tengo funciones que me permiten encontrar la distancia entre dos puntos.
Cualquier ayuda sería muy apreciada
Gracias, James
Gracias! y disculpa por tomarte tanto tiempo para responderte. Marqué la pregunta correctamente, aunque al final opté por un método diferente, donde utilizo un 'punto lateral' para que los barcos vayan primero si la estación está en el camino, antes de continuar hacia el punto de atraque. –