Frage

Mein Problem:

Wie kann ich zwei 3D-Punkte und sperrt sie auf eine einzige Achse? Zum Beispiel so, dass beide ihrer z-Achsen sind 0.

Was ich versuche zu tun:

habe ich eine Reihe von 3D-Koordinaten in einer Szene, eine eine Box mit einer Pyramide auf es darstellt. Ich habe auch eine Kamera, dargestellt durch eine andere 3D-Koordinaten. I subtrahieren sich die Kamera von der Bildkoordinaten normalisieren und es, ein Vektor, der Punkte auf die Kamera zurückkehrt. Ich habe dann mit einer Ebene ray-Ebene Kreuzung tun, die hinter der Kamera Punkt ist.

O + tD

Wo O (Ursprung) ist die Kameraposition, D die Richtung von dem Szenepunkt an die Kamera ist und t die Zeit ist es für den Strahl nimmt das Flugzeug von der Kamera Punkt zu schneiden.

Wenn das nicht Sinn machen, hier ist eine grobe Zeichnung:

Crude Zeichnung

Ich habe weit und breit gesucht, und soweit ich das beurteilen kann, das heißt unter Verwendung einer „Lochkamera“.

Das Problem ist nicht meine Kameradrehung, habe ich, dass eliminiert. Das Problem ist, den Schnittpunkt zu baryzentrischen (uv) Koordinaten zu übersetzen.

Die Übersetzung auf der x-Achse sieht wie folgt aus:

uaxis.x = -a_PlaneNormal.y;
uaxis.y = a_PlaneNormal.x;
uaxis.z = a_PlaneNormal.z;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 

Während die Übersetzung auf der z-Achse sieht wie folgt aus:

uaxis.x = -a_PlaneNormal.z;
uaxis.y = a_PlaneNormal.y;
uaxis.z = a_PlaneNormal.x;

point vaxis = uaxis.CopyCrossProduct(a_PlaneNormal);

point2d.x = intersection.DotProduct(uaxis);
point2d.y = intersection.DotProduct(vaxis);

return point2d; 

Meine Frage ist: Wie ich beide drehen kann einen Strahl Ebene Schnittpunkt zu baryzentrischen Koordinaten auf der x- und z-Achse

War es hilfreich?

Lösung

Die übliche Formel für die Punkte (P) auf einer Linie, ab (p0) mit Vektorrichtung (V) ist:

p = p0 + t*v

Das Kriterium für einen Punkt (P) auf einer Ebene, die (p1) und mit normalen (N) ist:

(p - p1).n = 0

So, plug & tuckern:

(p0 + t*v - p1).n = (p0-p1).n + t*(v.n) = 0

   ->  t = (p1-p0).n / v.n
   ->  p = p0 + ((p1-p0).n / v.n)*v

Um zu überprüfen:

(p - p1).n = (p0-p1).n + ((p1-p0).n / v.n)*(v.n)
                   = (p0-p1).n + (p1-p0).n
                   = 0

Wenn Sie die Z-Koordinate bei einem bestimmten Wert festlegen möchten, müssen Sie eine normale entlang der Z-Achse wählen (die eine Ebene parallel zur XY-Ebene definieren).

Dann haben Sie:

n = (0,0,1)

   ->  p = p0 + ((p1.z-p0.z)/v.z) * v
   ->  x and y offsets from p0 = ((p1.z-p0.z)/v.z) * (v.x,v.y)

Schließlich, wenn Sie versuchen, eine virtuelle „Kamera“ für 3D-Computergrafik zu bauen, der normale Weg, diese Art der Sache zu tun ist, homogenen Koordinaten . Letztlich mit homogenen Koordinaten arbeiten ist einfacher (und in der Regel schneller) als die Art von Ad-hoc-3D-Vektoralgebra Ich habe oben geschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top