dynamisches finden von ("flüssigen") waypoints...
-
hi folks!
ich habe ein kleines problem: ich versuche in eine 3d-engine (FPS-engine) eine flycam einzubauen. dazu schalte ich einfach die gravity ab, laufe in meiner map einen weg ab, und kann auf diesem weg waypoints per testendruck definieren. diese werden einfach in eine text-datei geschrieben. später wird diese wieder ausgelesen und die waypoints werden einzeln abgelaufen.
das funktioniert auch recht gut, einziges problem ist: das ist fürchterlich eckig, so etwa wie die bewegung einer schwebenden fahrenden platte in quake 1....ich will also versuchen, die bewegung von einem waypoint zum nächsten harmonischer, flüssiger zu gestalten.
zur info: ich habe alle waypoint-koordinaten als float in einem struct-vektor, momentan wird einfach an waypoints[next_waypoint].x usw angepasst, wenn x/y/z den koordinaten der aktuellen position entsprechen, wird next_waypoint inkremeniert.
irgendeine idee, wie ich das jetzt besser machen könnte?
grundtheorie ist denke ich mal klar, ich muss einfach mehr waypoints zwischen den definierten errechnen.... und diese sollten nicht nur vom nächsten waypoint abhängen, sondern auch von "next_waypoint + 1" (vielleicht sogar noch weiter???)also, konkrete tips anyone?
gruss,
---loki
-
Such mal nach Splines, damit siehts viel besser aus
-
gibts zu dem thema irgendwo was gutes auf dumpfbacken-level? weil ich zu derartigen themen null ahnung habe, und bei der implementierung wahrscheinlich laut schreiend davonrennen werde
-
Speichere einfach sehr viele Waypoints auf sehr engem Raum musst halt dafür mehr Speicher opfern aber das dürfte ja egal sein... Für jeden Punkt hast du dann noch einen Angel für die Camera dann müsste eigentlich ne lineare Bewegung des Angel zum nächsten Punkt ausreichen.
-
Solltest du mit Direct3D arbeiten wäre das wohl was für dich:
http://www.mvps.org/directx/articles/catmull/Vorteil mit dem Algo ist: Auch wenn die Kurven weicher werden, werden die Punkte trotzdem immer exakt durchquert.
-
Hi,
Auszug aus meiner BSpline Klasse:
void CBSplines::PrecalcBSpline(BSplinePoint_t *Points, int numPoints, int level) { [...] m_numKeyPoints = 0; for (int k=1; k < numPoints-2; k++) { float t=0; while (t<1.0f) { float t2=t*t; float t3=t*t*t; float k1=1-3*t+3*t2-t3; float k2=4-6*t2+3*t3; float k3=1+3*t+3*t2-3*t3; m_KeyPoints[m_numKeyPoints].x = 1/6.0*(k1*Points[k-1].x+ k2*Points[k].x+ k3*Points[k+1].x+ t3*Points[k+2].x); m_KeyPoints[m_numKeyPoints].y = 1/6.0*(k1*Points[k-1].y+ k2*Points[k].y+ k3*Points[k+1].y+ t3*Points[k+2].y); m_KeyPoints[m_numKeyPoints].z = 1/6.0*(k1*Points[k-1].z+ k2*Points[k].z+ k3*Points[k+1].z+ t3*Points[k+2].z); m_numKeyPoints++; t+=1.0/level; } } [...] }
Nehm deine händisch erzeugten Stützpunkte, jage die mit 'level' 10 durch diese Funktion und sie erzeugt dir jede Menge neue Stützpunkte und legt diese in m_KeyPoints ab(vorher entsprechend Speicher besorgen). Zwischen denen dann zur Laufzeit einfach linear interpolieren. Wird Seidenweich...
Gruß,
Sebastian
-
loki1985 schrieb:
gibts zu dem thema irgendwo was gutes auf dumpfbacken-level? weil ich zu derartigen themen null ahnung habe, und bei der implementierung wahrscheinlich laut schreiend davonrennen werde
Ja, bei google.
Bye, TGGC (Ein Jahr Helden)
-
schau dich mal da um http://cvs.sourceforge.net/viewcvs.py/ogre/ogrenew/OgreMain/src/OgreSimpleSpline.cpp?rev=1.12&view=markup
-
so, habe das jetzt mal anhand von
http://www.gamedev.net/reference/programming/features/unrav_bezier/
implementiert. funktioniert auch gut, zumindest kann ich ein spline zwischen (currenposition) und (currenposition + 2) über (currenposition + 1) erzeugen. dadurch ist aber nur die bewegung innerhalb dieses splines geglättet, wenn ich am endpunkt angekommen bin und ein neues spline erzeuge, ist dieses nicht harmonisch zum vorigen, d.h. es führt es nicht fort.
wie kann ich ein spline mit mehr als 3 checkpoints bauen? geht so IMHO aus dem tutorial-link nicht hervor...@illuminator: ne, ich arbeite nicht mit DX/D3D sondern SDL/OGL...
@IIX: sieht so aus als würde deine klasse nicht nur 3 punkte sondern beliebig viele punkte bearbeiten.... right?
verstehe die nicht so 100%ig, muss die mal ausprobieren...
und, ähm, wie interpoliere ich linear *doofguck*vielen dank für die hilfe!
gruß,
---loki
-
@IIX: habe die klasse mal etwas umgebaut und ausprobiert, und funktioniert perfekt! danke!