Bezier eğrilerini uzay gemilerimin bir istasyonda kenetlendiklerinde seyahat edecekleri yollar olarak kullanıyorum.Kübik Bezier Eğrisi: Maksimum Gradyan ve Çarpışma Önleme?
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;
}
}
eğri başlangıç noktası uzay konumdur ve bitiş noktası yerleştirme bölmesine girişidir (kırmızı noktalar: Ben gemi kübik Bezier eğri boyunca t zamanında olması gereken yerde hesaplamak için basit bir algoritma var diyagram üzerinde). Uzay gemisi, yönüne göre normalleştirilmiş bir vektöre sahiptir ve yerleştirme bölmesi, geminin, geldiğinde yerleştirme yuvasına düz olarak hizalanacağı şekilde (şema üzerindeki sarı çizgiler) hareket etmesi gerektiğini gösteren bir başka normalleştirilmiş vektöre sahiptir.
Yeşil çizgi, uzay gemisinin olası bir yolu ve mor dairenin uzay aracının yarıçapıdır. Son olarak, kara kutu istasyonun sınırlayıcı kutusu.
Ben iki sorun var:
uzay sadece ikinciBunun şu anlama geldiğini varsayalım:
a). Geminin çok sıkı bir şekilde dönmesi gereken bir yol sağlayacak "eğri faktörlerini" (kontrol noktası uzunlukları) bulmak
b). İstasyonla çarpışmanın önlenemeyeceği uzay gemisi konumunu/yönünü bulma (ve bu durumdan dışarıya rehberlik edecek bir yol yaratma, böylece a bölümü ile başlayabilir))
Ancak, bunlarla birlikte Bir çözüm bulamadığım için çok şansım olmadı. Vektörler, kutular, noktalar ve küreler arasındaki kesişimleri saptamak için kodum var ama henüz bezier eğrileri değil. Ayrıca iki nokta arasındaki mesafeyi bulmama izin veren işlevlerim var.
Herhangi bir yardım çoğu 5 ya da 6 derece polinomu çözme içerir
sayesinde James
Teşekkürler! ve size geri dönmek için çok uzun sürdüğüm için üzgünüm. Soruyu doğru bir şekilde işaret ettim, ancak sonunda farklı bir yönteme gittim, bir de “yan nokta” kullandım, eğer istasyon yoldaysa, ilk önce geminin yanaşma noktasına kadar devam etmeden önce gemilere gidecektir. –