Wie dreht / transformiert man einen Vektor so, dass er parallel zu einer Ebene ist?

Mein Hintergrund:
Ich habe ein oder zwei Einführungskurse in Lineare Algebra an der Universität belegt, aber das ist ein paar Jahre her und ich habe es seitdem nicht mehr praktiziert. Meine Terminologie mag falsch sein, aber ich glaube, mein Text sollte klar genug sein, damit jeder ihn versteht.

Problem:
Ich versuche, einen dreidimensionalen Controller für ein Spiel zu bauen, und bin auf ein Problem gestoßen, das ich nicht lösen kann. Ich muss einen dreidimensionalen Richtungsvektor finden, um ein Objekt entlang einer Ebene parallel zur Ebene zu bewegen. Der Richtungsvektor sollte auf einem 2-dimensionalen Eingabevektor entlang der x- und z-Achse in Kombination mit der Drehung (irgendeiner/aller drei Achsen) der Ebene basieren.

Ich denke, der einfachste Weg für mich, das zu lösende Problem zu erklären, besteht darin, zu versuchen, es anhand von zwei Beispielen zu veranschaulichen.

Annahmen:
Linkshändiges Koordinatensystem. Wir haben eine Kugel mit einem Radius von 0,5, deren Mittelpunkt bei (0, 0,5, 0) liegt. Ich denke, wir können das Zentrum der Kugel als das einzig Wichtige betrachten, aber vielleicht kann eine Kugel dabei helfen, ein visuelles Bild aufzubauen. Der Eingabevektor, mit dem die Kugel in den beiden folgenden Beispielen übersetzt wird, ist (1, 0, 1).

Beispiele:

  1. Bei y = 0 befindet sich eine xz-Ebene, also berührt die Kugel die Oberfläche der Ebene. Nach dem Bewegen der Kugel entlang des Eingabevektors befindet sich die Kugel bei (0, 0,5, 0) + (1, 0, 1) = (1, 0,5, 1)
  2. Die Ebene aus Beispiel 1 wurde um 89 Grad um die z-Achse gedreht und um ~0,5 auf der x-Achse verschoben (ohne 90-Grad-Drehung und exakte Bewegung, da dies etwas schwieriger zu veranschaulichen wäre, warum die Kugel bewegt werden sollte wie ich es haben möchte). Die Kugel hat immer noch Kontakt mit der Oberfläche der Ebene, aber von der Seite. Wenn die Kugel mit dem Eingabevektor bewegt würde, würde sie sich durch die Ebene bewegen, aber ich möchte, dass sich die Kugel parallel zur Ebene bewegt. Ich möchte … rotieren? der Eingabevektor irgendwie. Die Endposition der Kugel sollte ungefähr (0,05, 0,95, 1) sein. Der Ort der Kugel nach der Bewegung sollte derselbe sein, als wenn wir den endgültigen Ort der Kugel aus Beispiel 1 um die Welt-z-Achse um die gleiche Anzahl von Grad drehen würden, wie die Ebene in dieser um die z-Achse gedreht wird Beispiel.

Verfügbare Daten:
Die verfügbaren Daten sind der Ort der Kugel, der Eingangsrichtungsvektor und die Normale der Ebene. Reichen diese Informationen aus, um das Problem lösen zu können, und wenn ja, wie? Wenn nein, welche weiteren Daten werden benötigt?

Wenn Sie nicht zu diesem LH-Koordinatensystem gezwungen sind, würde ich raten, zu einem RH-Koordinatensystem zu wechseln. Möglicherweise stoßen Sie regelmäßig auf Dinge, die nicht wie erwartet funktionieren, da die von Ihnen verwendeten Formeln für RH-Systeme vorgesehen waren und Vorzeichenänderungen erfordern, um sie an LH anzupassen.
Ich verstehe das nicht: Sie sagen, dass die einzige Information über das Flugzeug, die Sie haben, ist, dass es normal ist, aber in Ihrer Beschreibung sagen Sie, dass es sich auch bewegt 0,5 entlang der X -Achse. Wie kann man das Flugzeug bewegen, wenn man nur den Normalenvektor kennt? Der Normalenvektor allein kann nur Ebenen durch den Ursprung definieren. Um Flugzeuge außerhalb des Ursprungs zu haben, benötigen Sie außerdem mindestens einen weiteren Wert (normalerweise die Entfernung D vom Ursprung zur Ebene, wie dann die Ebenengleichung lautet N R = D , Wo R sind die Punkte auf der Ebene.).
@PaulSinclair Beide Beispiele sollen ... "Startszenarien" sein, nicht etwas, was wir tun, sondern das uns gegeben wird. Stellen Sie sich einen Ball auf einem flachen Feld vor. Sie treten es so, dass es sich 1 Meter geradeaus und 1 Meter nach rechts bewegt. Vergleichen Sie nun das flache Feldszenario mit einem Szenario, bei dem Sie einem Hang zugewandt sind (dasselbe flache Feld wurde so gedreht, dass es Ihnen zugewandt ist). Sie versuchen immer noch, den Ball 1 Meter geradeaus und 1 Meter nach rechts zu treten, um den Ball "durch" den Hang zu schießen. In diesem Szenario soll sich der Ball 1 Meter den Hang hinauf und 1 Meter nach rechts bewegen. Wenn das Sinn macht.
Sie transformieren also nicht die Kugel und die Ebene, sondern wirklich die Richtung und Entfernung, aus der sie betrachtet werden, auch bekannt als Kameraposition und -ausrichtung?
@PaulSinclair Die Kugel wird transformiert, das Flugzeug nicht. Das Flugzeug ist statische Geometrie in einer Spielwelt, der Boden direkt unter der Kugel. Die Kugel ist ein Objekt, das der Spieler über den Boden bewegen soll.
Die Transformation, nach der Sie fragen, bewegt den Ball nicht über den Boden. Das ist trivial. Es geht darum, die Kamera zu transformieren – die Ansicht, die dem Benutzer geboten wird. Die gleiche Transformation dessen, was der Benutzer sieht, gilt sowohl für den Boden als auch für die Kugel. Anstatt zu versuchen, die Richtung des Bodens und die Richtung, in die die Kugel darauf rollt, zu ändern, lassen Sie sie in Ruhe und transformieren Sie das Ganze mit der gleichen Transformation, wenn Sie bestimmen, was die Kamera sieht. Wie sich die Ansicht der Kugel ändert, ist dasselbe wie die Ansicht des Bodens.
@PaulSinclair Ich bin entweder nicht klar genug, um das Problem zu erklären, oder mir fehlen zu viele 3D-Mathematikkenntnisse, um Ihre Antworten zu verstehen.

Antworten (1)

Okay - ich verstehe jetzt, dass du davon sprichst, den Boden zu verändern. Aber immer noch gilt dieses Prinzip: Die gleiche Transformation, die Sie auf den Boden angewendet haben, ist die Transformation, die auf den Ball angewendet wird.

Du hast das Flugzeug gedreht. Ich weiß nicht, wie Sie diese Drehung in Ihrem Programm erreicht haben, aber mathematisch wird sie als Matrix ausgedrückt M das befriedigt M T M = ICH , die Identitätsmatrix (wobei M T ist die Transponierte von M ). Wenn N ist dann der Normalenvektor zur ursprünglichen Ebene M N ist der Normalenvektor zur gedrehten Ebene.

Sie sagten auch, Sie hätten das Flugzeug bewegt (im Beispiel entlang der X -Achse). Dies bedeutet, dass die neue Ebene nicht mehr durch den Ursprung verläuft (zumindest in Ihrem Beispiel der ursprüngliche Punkt). Dies ist eine Übersetzung, aber wir müssen vorsichtig sein, welche Übersetzung wir verwenden. Angenommen, das neue Flugzeug muss einen bestimmten Punkt passieren P . In Ihrem Beispiel haben Sie angegeben, dass es durchläuft ( 0,5 , 0 , 0 ) . Sie können das als Punkt verwenden P . Da der Normalenvektor ist M N und es ging durch P , ein Punkt R ist im neuen Flugzeug, wenn

( M N ) T R = N T M T R = D
Wo D = N T M T P . Der Übersetzungsvektor, den wir brauchen, ist B = D M N , das ist der dem Ursprung am nächsten liegende Punkt auf der neuen Ebene.

Also die Verwandlung in die ursprüngliche Ebene N T R = 0 um das neue Flugzeug zu bekommen N T M T R = D ist zu drehen durch M , fügen Sie dann den Übersetzungsvektor hinzu B :

R M R + B

(Falls Sie es nicht wissen, bedeutet "zuordnen zu". Das heißt, der ursprüngliche Wert auf der linken Seite wird in den Wert auf der rechten Seite transformiert.) Dies ist die gleiche Transformation, die Sie auf Ihre Kugel anwenden müssen, um nach der Transformation ihre neue Position zu erhalten. Wenn C das ursprüngliche Zentrum der Kugel ist, wird das transformierte Zentrum sein

C M C + B

Lassen v sei der "Eingangsrichtungsvektor" der horizontalen Kugelbewegung. Seit v ist eine Richtung, kein Punkt, es übersetzt nicht. Der neue Richtungsvektor, in dem der Ball den geneigten Boden hinauffliegt, wird also gegeben durch

v M v

Die Eingaben, die Sie zur Lösung Ihres Problems benötigen, sind also der Rotationsvektor M , und ein Punkt P die das neue Flugzeug durchfliegt. Wenn Sie diese haben, können Sie sie verwenden, um die Grundebene, die Position der Kugel und die Bewegungsrichtung, alle drei, zu transformieren.

Erschöpfende Antwort, ich weiß es zu schätzen. Ich habe jedoch keinen Zugriff auf M (soweit ich weiß). Das einzige, was wir über die Ebene wissen, ist die Normale und ein Punkt, der in der Ebene liegt (habe vergessen, dies im ursprünglichen Beitrag zu erwähnen). Die Ebene kann eine der Oberflächen eines 3D-Computerobjekts sein, und ich glaube nicht, dass wir Zugriff auf individuelle Daten über jede bestimmte Oberfläche (Ebene) haben. Aufgrund des letzten Satzes in Ihrem Beitrag bin ich mir immer noch nicht sicher, ob Sie glauben, dass das Flugzeug bewegt werden sollte oder nicht, davon haben Sie einfach erwähnt, dass wir es mit den von Ihnen im letzten Absatz erwähnten Eingaben bewegen können .
Wir haben Zugriff auf den Punkt p . Können wir den Rotationsvektor M aus der Flächennormalen erzeugen?
Sie können es nicht vollständig bestimmen M vom Normalenvektor, weil M kann auch Dinge um diesen Vektor drehen. Sie benötigen also mindestens einen weiteren Referenten, um vollständig zu bestimmen M . Aber die restlichen Informationen benötigt, um festzustellen M ist wahrscheinlich in Ihrem System implizit, also erkennen Sie es nicht. Zum Beispiel, wenn es sowohl für den flachen als auch für den geneigten Boden eine eindeutige Richtung "rechts" gibt. Diese Verbindung zusammen mit dem normalen Vektor definiert vollständig M