Tôi đang sử dụng các đường cong bezier làm đường dẫn cho các phi thuyền không gian của tôi để di chuyển dọc theo khi chúng đến bến tàu tại một trạm. Tôi có một thuật toán đơn giản để tính toán nơi tàu phải có ít thời gian t dọc theo một đường cong Bezier khối:Đường cong Bezier khối: Độ dốc tối đa và tránh va chạm?
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;
}
}
Đường cong khởi điểm là vị trí con tàu vũ trụ, và điểm kết thúc là lối vào vịnh docking (chấm đỏ trên sơ đồ). Tàu vũ trụ có véc tơ chuẩn hóa theo hướng của nó, và vịnh nối có một véc tơ chuẩn hóa khác để biểu thị hướng mà con tàu phải di chuyển để được căn thẳng vào vịnh nối khi nó đến (các vạch màu vàng trên sơ đồ)
Đường màu xanh lá cây là đường dẫn có thể có của tàu vũ trụ và vòng tròn màu tím, bán kính của tàu vũ trụ. Cuối cùng, hộp đen là hộp giới hạn cho trạm.
Tôi có hai vấn đề:
- Các tàu vũ trụ được cho là chỉ có thể lần lượt tại radian r mỗi giây
- Các tàu vũ trụ không thể bay qua trạm
Tôi giả định rằng điều này được dịch thành:
a). Tìm "các yếu tố đường cong" (độ dài điểm kiểm soát) sẽ cho một con đường mà con tàu không phải quay quá chặt.
b). Tìm vị trí/hướng tàu vũ trụ mà từ đó nó không thể tránh va chạm với trạm (và tạo đường dẫn để hướng dẫn nó ra khỏi trạng thái đó, để nó có thể tiếp tục với phần a))
Tuy nhiên, với cả hai , Tôi đã không có nhiều may mắn tìm một giải pháp. Tôi đã có mã để phát hiện giao lộ giữa vectơ, hộp, điểm và hình cầu, nhưng vẫn chưa có đường cong. Tôi cũng có chức năng để tôi tìm khoảng cách giữa hai điểm.
Bất kỳ trợ giúp sẽ được đánh giá cao nhất
Cảm ơn, James
Cảm ơn! và xin lỗi vì mất quá nhiều thời gian để lấy lại cho bạn. Tôi đánh dấu câu hỏi đúng, mặc dù cuối cùng tôi đã đi cho một phương pháp khác nhau, nơi tôi sử dụng một 'điểm phụ' mà tàu đi đến đầu tiên nếu trạm là trong cách, trước khi tiếp tục vào điểm nối. –