path_spline (ENTITY*,VECTOR* pos,var dist)
Die Bewegung entlang eines Pfades. Diese Funktion berechnet eine weiche Spline-Kurve entlang einer geschlossenen Pfadschleife
und setzt den pos-Vektor auf die berechnete Kurvenposition,
welche zur gegebenen Distanz auf dem Pfad passt. Damit lassen sich Actors, Fahrzeuge oder Kameras sanft einen Pfad entlang
bewegen.
Parameter:
ENTITY* - Pointer auf eine Entity, die mit dem Pfad verknüpft
ist.
pos - Vektor zum Erhalt der berechneten Kurvenposition.
dist - Abstand auf dem Pfad für den die Kurvenposition zu
berechnen ist.
Rückgabewerte:
Nummer des Knotens vor der berechneten Position.
Änderungen:
pos - wird auf eine Position auf der Spline-Kurve gesetzt.
Geschwindigkeit:
Mittel
Bemerkungen:
- Diese Funktion verwendet eine Hermite-Polynominterpolation
zum Berechnen einer sanften Kurve, die durch sämtliche Knoten
eines Pfads verläuft.
- Die Kurve verbindet alle Knoten in der Reihenfolge ihrer Nummerierung.
Wie sie durch Wegstrecken verbunden sind, spielt dabei keine Rolle.
- Der dist-Parameter entspricht dem Abstand direkter
Linienverbindungen zwischen den Knoten und nicht der tatsächlichen
Distanz der Kurve. Wird dem dist-Parameter eine
konstante Geschwindigkeit zugeordnet, kann die tatsächliche
Geschwindigkeit entlang der Kurve
variieren. Sie ist umso höher, je mehr die Kurve von den direkten
Knotenverbindungslinien abweicht. Ist dies unerwünscht, setzen
Sie mehr Knoten an scharfe Biegungen
des Pfades, um Abweichungen vorzubeugen.
- Die gesamte Länge des Pfads kann per path_length ermittelt werden.
- Aufgrund des Findens des nächstgelegenen Knotens, ist die Funktion
bei kleineren dist-Werten etwas schneller. Überragt
dist die Länge des Pfads, beginnt es eine neue Schleife auf dem
Pfad.
Beispiel:
(siehe auch path_create):
//call camera_path(""); to let the camera run along a path in the level
function camera_path(pathname)
{
// create a dummy path entity
me = ent_create(NULL,nullvector,NULL);
path_set(me,pathname);
var dist = 0;
var vLastPos[3];
var vDir[3];
while(1)
{
// place the camera on the path
path_spline(me,camera.x,dist);
dist += 5*time_step;
// let the camera look ahead
vec_diff(vDir,camera.x,vLastPos);
vec_to_angle(camera.pan,vDir);
vec_set(vLastPos,camera.x);
wait(1);
}
}
Siehe auch:
path_create, path_scan, path_nextnode, path_setedge, path_length
► Aktuelle Version Online