我使用bezier曲線作爲我的太空飛船沿着它們進入碼頭的路徑。我有一個簡單的算法來計算,由船舶應在時間t沿三次Bezier曲線:立方貝塞爾曲線:最大梯度和避免碰撞?
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;
}
}
曲線起點是飛船的位置,終點是入口處停靠站(紅點在圖上)。飛船的方向有一個歸一化的矢量,而對接艙有另一個歸一化的矢量,用於指示船隻必須駛入的方向,以便當它到達時直接對準塢站(圖中的黃線)
綠線是宇宙飛船的可能路徑,紫色圓圈是宇宙飛船的半徑。最後,黑匣子是該站的邊框。
我有兩個問題:
- 的飛船應該只能夠把以每秒
- 飛船不能通過站飛[R弧度
我認爲這可以翻譯爲:
a)。找到將給出船舶不必轉得太緊的路徑的「曲線因素」(控制點長度)
b)。找到無法避免與車站碰撞的太空船位置/方向(並創建一條路徑指引它離開該狀態,因此它可以與a部分相連))
但是,對於這兩者,我沒有多少運氣找到解決方案。我已經有了檢測向量,方框,點和球體之間交點的代碼,但是還沒有貝塞爾曲線。我也有功能讓我找到兩點之間的距離。
任何幫助將非常感激
謝謝, 詹姆斯
謝謝!並抱歉花了這麼久回到你身邊。我將問題標記爲正確的,儘管最終我採用了不同的方法,在繼續進入停靠點之前,我使用了一個'側點',如果車站在路上,那麼它將首先進入船舶。 – 2012-07-19 12:47:54