Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Atas

Frischling

  • »Atas« ist der Autor dieses Themas
  • Private Nachricht senden

1

18.02.2016, 16:28

[Python] Weiche Kurve durch Punkte im dreidimensionalen Raum

Guten Tag,

ich versuche derzeit ein kleines Script zu schreiben, welches mir eine Kurve in einem dreidimensionalen Raum durch vorgegebene Punkte erstellt und mir die Position eines unbekannten Punktes anhand eines prozentualen Fortschritts auf dieser Kurve gibt, wobei der erste Punkt der Kurve 0% und der letzte Punkt 100%.

Ich habe also eine Liste mit Punkten (welche durch Objekte einer zu der untenstehenden Klasse ähnlichen Klasse repräsentiert werden) und möchte nun das ganze soweit bringen, dass ich eine Funktion habe, an die ich einen Wert zwischen 0 und 1 (float) gebe (0% und 100%), welcher mi wiederum eine x-, y- und z-Koordinate zurückgibt, wo der unbekannte Punkt auf der Kurve liegt.

Leider reicht mein derzeitiges schulisches Wissen dazu nicht aus. Ich habe mich also versucht per Google ein wenig schlau zu machen und bin dabei auf Splines und die SciPy Bibliothek (SciPy - Interpolation) gestossen, dies hat mir bisher aber noch nichts gebracht, da ich, nach dem, was ich dazu gesehen habe, immer etwas über meinen gesuchten Punkt wissen musste (bspw. x-, y-Koordinaten).

Um das ganze ersteinmal hinzubekommen, habe ich meine eigentliche Klasse auf die dafür nötigen Sachen reduziert:

Quellcode

1
2
3
4
5
class Point(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z


Kann mir vlt. jemand einen Tipp geben, was ich mir dazu ansehen sollte?

Vielen Dank im Voraus!

MfG

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

18.02.2016, 16:43

Das ganze hängt ein wenig davon ab was du unter deiner Kurve verstehst. Möchtest du einfach die direkte Strecke zwischen den einzelnen Punkten haben? Falls ja könntest du am Anfang ein mal bestimmt wie lang die gesamte Strecke ist. Dafür addierst du die Längen der Teilstücke. Die Teilstücke sind dann jeweils Punkt0 bis Punkt1, Punkt1 bis Punkt2 und so weiter. Danach kannst du vorne bei Punkt0 anfangen und prüfen ob der gesuchte Punkt zwischen Punkt0 und Punkt1 liegen sollte. Falls nicht iterierst du weiter und testest das selbe für Punkt1 und Punkt2. Das machst du so lange bis du weißt zwischen welchen beiden Punkten dein gesuchter Punkt liegt. Danach berechnest du den genauen Punkt.
Hiermit hast du ja schon mal ein paar Hinweise. Mit dem Ansatz kommst du ja denke ich schon mal weiter. Falls nicht, versuch mal zu gucken wie weit du kommst. Wenn dann konkrete Probleme dabei entstehen kannst du hier ja noch mal fragen.

Ansonsten müsstest du noch mal genauer darauf eingehen was du dir unter deiner Kurve vorstellst. Da gibt es verschiedene Ansätze. Je nachdem was du dir vorstellst müsste man eben einen anderen wählen. Falls du dir da selbst nicht sicher bist kannst du das ganze ja mal skizzieren und vielleicht können wir dir weiter helfen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Atas

Frischling

  • »Atas« ist der Autor dieses Themas
  • Private Nachricht senden

3

18.02.2016, 16:54

Oh, tut mir leid, ich habe vergessen zu erwähnen, was ich machen will.

Ich möchte damit einige Fahrten mit einer Kamera simulieren. Diese soll sich natürlich weich bewegen, das heisst, dass es keine linearen Verbindungen der Punkte sein sollen (@Schorsch).

Auch Beziér-Kurven habe ich bereits gesehen, jedoch sind diese (meines Wissens nach) nur Annäherungen und gehen nicht direkt durch die vorgegebenen Punkte sondern teilweise daran vorbei, was bei meinem Verwendungszweck leider nicht sein darf.

Vielen Dank bisher!

MfG

Edit:
Beispiel, was ich meine:
Bild

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

18.02.2016, 17:34

Bézierkurven sind approximierende und keine interpolierenden Splines. Für das gegebene Problem will man aber interpolierende Splines verwenden; in der Regel bedient man sich dabei einer Variante von kubisch-hermiteschen Splines wie die oben verlinkten Catmull-Rom Splines...

Atas

Frischling

  • »Atas« ist der Autor dieses Themas
  • Private Nachricht senden

6

18.02.2016, 17:50

Nun, mein größtes Problem besteht hauptsächlich darin, dass ich nicht genau weiss, wie ich es bewerkstelligen soll, dass sich die Kamera nicht unterschiedlich schnell bewegt.
Dafür müsste ich eine Länge des interpolierten Splines haben und müsste dann auf den Punkt bei length * (time / duration) bekommen, aber wie?

MfG

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

18.02.2016, 17:52

Bogenlängenparametrisierung von Splines geht im Allgemeinen leider nicht. Was ich normalerweise einfach mache, ist, die Länge der lokalen Ableitung als Maß für die Momentangeschwindigkeit zu nehmen und das Parameterinkrement daran anzupassen, damit lässt sich in der Regel ein schön gleichmäßiger Flug erreichen...

Atas

Frischling

  • »Atas« ist der Autor dieses Themas
  • Private Nachricht senden

8

18.02.2016, 18:18

Könnte man denn nicht das ganze so machen, dass man noch t dazu nimmt und dann x-t, y-t und z-t interpoliert, dass man dann 3 Funktionen hat, die in Abhängigkeit von t jeweils x, y und z ausgeben, sodass ich daraus dann meinen 3 dimensionalen Punkt bilden kann?

MfG

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

18.02.2016, 18:20

Sry, kapier nicht auf was genau du hinaus willst...

Atas

Frischling

  • »Atas« ist der Autor dieses Themas
  • Private Nachricht senden

10

18.02.2016, 18:47

Nun, aktuell dachte ich immer, ich muss das so machen, dass ich 3 dimensional interpoliere und irgendwie noch ein t (Zeit / Prozent) mit rein bringe.

Ich habe eine unbestimmte Anzahl von 3D-Punkten (x, y und z) und immer einen bestimmten Wert t.
Ich kann doch nun die Punkte in 3 Sachen aufteilen: x, y und z
Diese interpoliere ich jeweils mit t und würde somit grafisch gesehen 3 Graphen erhalten: x-t-Graph, y-t-Graph und einen z-t-Graph
Wenn ich nun die Kamerafahrt abspiele, ändert sich immer t und mithilfe von SciPy hätte ich diese Funktionen: fx(t), fy(t) und fz(t)

MfG

Werbeanzeige