Normal Interpolation

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Normal Interpolation

Beitrag von DomiOh »

Hallo,

ich suche einen weg, Normalen zu interpolieren.
Ich benötige das zur Berechnung einer Lightmap.

Wie kann ich die Normale an einer bestimmten Position eines Dreiecks (ohne Baryzentrische Koordinaten) berechnen?
Ich habe bei Codeprojekt einen Artikel gefunden, der bei mir allerdings nicht funktioniert.

Weiß jemand hilfe?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Normal Interpolation

Beitrag von eXile »

Hi,

Welchen Artikel hast du auf Codeproject gefunden? Wäre gut gewesen, den anzugeben, weil man ja den Code evtl. lauffähig hätte machen können. Das einzige dazu, was ich auf Codeproject gefunden habe:

http://www.codeproject.com/KB/graphics/ ... ginC6.aspx

Ist das der von dir erwähnte Artikel? Aber in eben diesem wurden doch auch baryzentrische Koordinaten verwendet:

Code: Alles auswählen

nx = -((1.0 - (u + v)) * nb.x + na.x * u + nc.x * v);
ny = -((1.0 - (u + v)) * nb.y + na.y * u + nc.y * v);
nz = -((1.0 - (u + v)) * nb.z + na.z * u + nc.z * v); 
So sollte das auch funktionieren ... dabei sind eben u, v, und 1-(u+v) die baryzentrischen Koordinaten des Punktes auf dem Dreieck. Du musst dabei einfach nur aufpassen, dass die baryz. Koordinate auch mit der jeweiligen Normale korreliert:
Wenn das Dreieck aus Punkten A,B,C besteht, und Area(ABC) der Flächeninhalt des Dreiecks ist, und P der Punkt im Dreieck, so ist z.b. die u-Koordinate gleich Area(PBC)/Area(ABC).
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: Normal Interpolation

Beitrag von DomiOh »

Und was passiert, wenn der Punkt außerhalb des Dreiecks liegt?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Normal Interpolation

Beitrag von eXile »

Dann kann es sein, dass eine baryzentrische Koordinate größer 1 oder kleiner 0 werden kann, es könnten also negative Normalenvektoren zur Interpolation herangezogen werden, was in diesem Falle nicht unbedingt eine geeignete Interpolation ist.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: Normal Interpolation

Beitrag von DomiOh »

Wie kann ich denn herausfinden, ob ein Punkt in welchem Dreieck liegt, wenn ich sagen wir mal, 3 Dreiecke habe...
Ich habe es mit D3DXIntersectTri versucht, das ist jedoch zu ungenau...

Das Problem ist, dass ich gerne eine Lightmap berechnen möchte, und zwar auf Basis von Koplanaren Flächen.
Jetzt habe ich das Problem, dass an manchen Stellen natürlich die Lumels außerhalb eines bestimmten Dreiecks liegen. Dann brauche ich die Normals, die dort hingehören.
Ich dachte ich könnte diese über das Dreieck interpolieren (für abgerundete Flächen) was aber auf diese Art auch nicht geht.
Das ganze ist etwas kompliziert, oder ich übersehe etwas.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Normal Interpolation

Beitrag von eXile »

DomiOh hat geschrieben:Wie kann ich denn herausfinden, ob ein Punkt in welchem Dreieck liegt, wenn ich sagen wir mal, 3 Dreiecke habe...
Ich habe es mit D3DXIntersectTri versucht, das ist jedoch zu ungenau...
Auch das geht ... mit baryzentrischen Koordinaten :lol:

Bild

Man sieht hier das Dreieck ABC mit dem Punkt P in dem Dreieck. Bezeichne Area(XYZ) den vorzeichenbehafteten Flächeninhalt des Dreiecks XYZ. Dann ergibt sich:

l_a = Area(CBP)/Area(ABC)
l_b = Area(ACP)/Area(ABC)
l_c = Area(BAP)/Area(ABC)

Dies sind die baryzentrischen Koordinaten von P bzgl. ABC. Damit kann man nun schreiben:

P = l_a * A + l_b * B + l_c * C

Nun gibt es folgende Eigenschaft: P liegt im Dreieck ABC genau dann, wenn l_a, l_b, l_c Werte in [0,1] sind. Daraus folgt: Ist eines von l_a, l_b, l_c größer als 1 oder kleiner als 0, so ist P nicht im Dreieck ABC.

Ist nur noch die Frage übrig, wie man Area(XYZ) im dreidimensionalem ausrechnet:

a = X-Y
b = X-Z
Area(XYZ) = 1/2 * ||a x b|| (dabei ist ||.|| die Länge eines Vektors, und x das Kreuzprodukt).

So hast du einen Test, anhand dem du entscheiden kannst, ob der Punkt P im Dreieck liegt.
Jetzt habe ich das Problem, dass an manchen Stellen natürlich die Lumels außerhalb eines bestimmten Dreiecks liegen. Dann brauche ich die Normals, die dort hingehören.
Ja das ist ein Problem, jedoch ontologischer Natur. Es gibt keine Normalen, die "außerhalb des Dreiecks" da hin gehören. Selbst die Normaleninterpolation über ein einziges Dreieck ist eigentlich ein Hack, da ja die Geometrie flach ist - aber ein sehr gut aussehender Hack nun einmal. Mir ist schleierhaft, warum man eine Normale außerhalb eines Dreiecks berechnen möchte.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: Normal Interpolation

Beitrag von DomiOh »

Das mit dem PointInTriangle über eine ähnliche Formel habe ich schonmal gemacht.
War ziemlich ungenau (leider).
Ja das ist ein Problem, jedoch ontologischer Natur. Es gibt keine Normalen, die "außerhalb des Dreiecks" da hin gehören. Selbst die Normaleninterpolation über ein einziges Dreieck ist eigentlich ein Hack, da ja die Geometrie flach ist - aber ein sehr gut aussehender Hack nun einmal. Mir ist schleierhaft, warum man eine Normale außerhalb eines Dreiecks berechnen möchte.
Das Problem vor dem ich stehe ist ganz einfach:
Wenn ich die Lumels einer Lightmap "durchgehe", komme ich irgendwann zu dem Punkt, wo sich einzelne Lumels außerhalb des Dreiecks\der Fläche befinden (wenn z.B. die Fläche an den Ränder nicht gerade ist). D.h. evtl trifft der Lumel das Dreieck nicht mehr - Ich brauche dann aber für die Lightmap eine Normal, weil ich ja sonst einen schwarzen Pixel auf der Lightmap habe. Ich frage mich nun, wie ich an diese Normal herankomme, die ich dann da benötige.

Ich glaube ich übersehe bei meinem Ansatz irgendwas.

2.)

Code: Alles auswählen

nx = -((1.0 - (u + v)) * nb.x + na.x * u + nc.x * v);
ny = -((1.0 - (u + v)) * nb.y + na.y * u + nc.y * v);
nz = -((1.0 - (u + v)) * nb.z + na.z * u + nc.z * v); 
Das passt bei mir auch nicht. Nur wenn ich das "-" davor weglasse.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Normal Interpolation

Beitrag von Zudomon »

Die Lumel, die nicht auf einem Dreieck liegen bzw. auf der Fläche, für die die Lightmap ist, werden einfach nicht berechnet. In einem Nachbearbeitungsschritt rechnest du dann einfach den Mittelwert der umliegenden Lumel für das nicht vorhandene Lumel aus. Dabei dürfen natürlich nur korrekt berechnete Lumel einfließen.

Das ganze kann man ruhig mehrmals wiederholen, oder solange, bis keine fehlerhaften Lumel mehr in der Lightmap existieren. So bekommst du selbst bei nur einem einzigen berechneten Lumel immernoch die Fläche einigermaßen korrekt beleuchtet. Du könntest natürlich dann meinen Ansatz verfolgen, dass sobald weniger als eine bestimmte Anzahl Lumel vorhanden sind, einfach auf Vertexbeleuchtung umgeschaltet wird, statt über Textur. Dafür sollte das Objekt dann schön tesseliert sein, also keine zu langen und schmalen Dreiecke beinhalten. So kannst du für ein Dreieck immerhin noch 3 Lumel berechnen. Dabei würde ich dir raten, dann die Lumel nicht direkt auf den Eckpunkten zu verteilen sondern etwas zum Dreieckszentrum hin. Ansonsten kann es Probleme an Wänden geben, die bündig mit dem Dreieck abschließen.
Allerdings ist auch bei der Vertexlichtberechnung darauf zu achten, dass der Lumel auch gültig ist. Wenn das Dreieck z.B. mit einer Spitze in einer Säule steht, wäre der Vertex schattiert. Aber um genau zu sein ist er ungültig, weil das Licht für eine Stelle berechnet wurde, die nicht in der Welt liegt. Also das gleiche Spiel, alle gültigen Vertexfarben berechnen und die anderen durch einen Mittelwert der umliegenden ersetzen.
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: Normal Interpolation

Beitrag von Youka »

eXile hat geschrieben:
DomiOh hat geschrieben:Wie kann ich denn herausfinden, ob ein Punkt in welchem Dreieck liegt, wenn ich sagen wir mal, 3 Dreiecke habe...
Ich habe es mit D3DXIntersectTri versucht, das ist jedoch zu ungenau...
Auch das geht ... mit baryzentrischen Koordinaten :lol:

Bild

Man sieht hier das Dreieck ABC mit dem Punkt P in dem Dreieck. Bezeichne Area(XYZ) den vorzeichenbehafteten Flächeninhalt des Dreiecks XYZ. Dann ergibt sich:

l_a = Area(CBP)/Area(ABC)
l_b = Area(ACP)/Area(ABC)
l_c = Area(BAP)/Area(ABC)

Dies sind die baryzentrischen Koordinaten von P bzgl. ABC. Damit kann man nun schreiben:

P = l_a * A + l_b * B + l_c * C

Nun gibt es folgende Eigenschaft: P liegt im Dreieck ABC genau dann, wenn l_a, l_b, l_c Werte in [0,1] sind. Daraus folgt: Ist eines von l_a, l_b, l_c größer als 1 oder kleiner als 0, so ist P nicht im Dreieck ABC.

Ist nur noch die Frage übrig, wie man Area(XYZ) im dreidimensionalem ausrechnet:

a = X-Y
b = X-Z
Area(XYZ) = 1/2 * ||a x b|| (dabei ist ||.|| die Länge eines Vektors, und x das Kreuzprodukt).

So hast du einen Test, anhand dem du entscheiden kannst, ob der Punkt P im Dreieck liegt.
Dreiecksecken: A, B, C
Punkt: P
Baryzentrische Koordinaten: a, b, c


Ein Dreieck lässt sich folgends beschreiben:
P = aA + bB + cC
Es gilt a = 1 - b - c, da die Summe der Multiplikatoren der Vektoren 1 sein muss, damit die Formel Punkte innerhalb des Dreiecks beschreiben kann.
P = A - bA - cA + bB + cC
P = A + b(B-A) + c(C-A)

Zur kürzeren Schreibweise benenne ich Vektor AB = V1 und Vektor AC = V2.
Desweiteren gilt nun 0 <= b, c <= 1 und b + c <= 1.
P = A + bV1 + cV2
Der Punkt sowie das Dreieck sind dreidimensional. Nun möchte ich eine baryzentrische Koordinate ausschließen, um die andere auszurechnen.
In diesem Fall c.
Px = Ax + bV1x + cV2x *V2y *V2z
Py = Ay + bV1y + cV2y *V2x *V2z
Pz = Az + bV1z + cV2z *V2x *V2y
------------------------------------------------------------------------------------------------------------------------------
V2y * V2z * Px = V2y * V2z * Ax + V2y * V2z * bV1x + cV2xV2yV2z
V2x * V2z * Py = V2x * V2z * Ay + V2x * V2z * bV1y + cV2xV2yV2z
V2x * V2y * Pz = V2x * V2y * Az + V2x * V2y * bV1z + cV2xV2yV2z
*(-2)
------------------------------------------------------------------------------------------------------------------------------
V2y * V2z * Px = V2y * V2z * Ax + V2y * V2z * bV1x + cV2xV2yV2z + [2] +[3]
V2x * V2z * Py = V2x * V2z * Ay + V2x * V2z * bV1y + cV2xV2yV2z
(-2) * V2x * V2y * Pz = (-2) * V2x * V2y * Az - 2 * V2x * V2y * bV1z - 2 * cV2xV2yV2z

------------------------------------------------------------------------------------------------------------------------------
Somit entfällt c und die Gleichungen werden zu einer. Nun zur Auflösung von b:
V2y * V2z * Px + V2x * V2z * Py - 2 * V2x * V2y * Pz = V2y * V2z * Ax + V2x * V2z * Ay - 2 * V2x * V2y * Az + V2y * V2z * bV1x + V2x * V2z * bV1y - 2 * V2x * V2y * bV1z
-(V2y * V2z * Ax + V2x * V2z * Ay - 2 * V2x * V2y * Az)
V2y * V2z * Px + V2x * V2z * Py - 2 * V2x * V2y * Pz - V2y * V2z * Ax - V2x * V2z * Ay + 2 * V2x * V2y * Az = V2y * V2z * bV1x + V2x * V2z * bV1y - 2 * V2x * V2y * bV1z
Distributiv-Gesetz für b
V2y * V2z * Px + V2x * V2z * Py - 2 * V2x * V2y * Pz - V2y * V2z * Ax - V2x * V2z * Ay + 2 * V2x * V2y * Az = b * (V2y * V2z * V1x + V2x * V2z * V1y - 2 * V2x * V2y * V1z)
/ (V2y * V2z * V1x + V2x * V2z * V1y - 2 * V2x * V2y * V1z)
b = (V2y * V2z * Px + V2x * V2z * Py - 2 * V2x * V2y * Pz - V2y * V2z * Ax - V2x * V2z * Ay + 2 * V2x * V2y * Az) / (V2y * V2z * V1x + V2x * V2z * V1y - 2 * V2x * V2y * V1z)

Sauberer geschrieben:
b = (V2yV2zPx + V2xV2zPy - 2V2xV2yPz - V2yV2zAx - V2xV2zAy + 2V2xV2yAz) / (V2yV2zV1x + V2xV2zV1y - 2V2xV2yV1z)
Für c müsste ich nur V1 und V2 umtauschen.

Hat eine Dimension beider Vektoren nun die Steigung 0 (z.B. wenn das Dreieck flach auf der z-Ebene 0 liegt) ergibt sich eine Division durch 0. Dies ist logisch, da dann für P = A + bV1 + cV2 die baryzentrischen Koordinaten unbedeutend sind.
In 2D ist dies kein Problem, weil vorausgesetzt wird, dass beide Vektoren ungleich 0 sind, aber die dritte Dimension, die das durchaus sein darf, sprengt mir die Rechnung.

Ich würde das gerne besser verstehen. Könnte mir jemand den Unterschied zwischen meiner Rechnung und einer funktionierenden erklären?
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Normal Interpolation

Beitrag von eXile »

Youka hat geschrieben:Hat eine Dimension beider Vektoren nun die Steigung 0 (z.B. wenn das Dreieck flach auf der z-Ebene 0 liegt) ergibt sich eine Division durch 0. Dies ist logisch, da dann für P = A + bV1 + cV2 die baryzentrischen Koordinaten unbedeutend sind.
Das Problem an deiner Rechnung ist einfach, dass du nicht sicher sein kannst, dass du nicht durch Null dividierst.

Herleitung:
Da die Flächeninhalt des Dreiecks invariant unter Translationen ist, gilt für \($u,v,w \in \mathbb{R}^2$\):
\($$A(\Delta(u,v,w) = A(\Delta(0,v-u,w-u))$$\)Ist das Dreieck \($\Delta(p_0, p_1, p_2)$\) mit \($p_0 = (x_0, y_0)^T$, $p_1 = (x_1, y_1)^T$, $p_2 = (x_2, y_2)^T \in \mathbb{R}^2$\) und \($p = (x, y)^T \in \mathbb{R}^2$\) mit baryzentrischen Koordinaten \($\lambda_0, \lambda_1, \lambda_2 \in \mathbb{R}$\) gegeben, so sind die folgenden Bedingungen erfüllt:
\($$\begin{align}&\begin{cases}
\lambda_0 p_0 + \lambda_1 p_1 + \lambda_2 p_2 = p \\
\lambda_0 + \lambda_1 + \lambda_2 = 1
\end{cases} \\
\Leftrightarrow \quad
&\begin{cases}
\lambda_0 x_0 + \lambda_1 x_1 + \lambda_2 x_2 = x \\
\lambda_0 y_0 + \lambda_1 y_1 + \lambda_2 y_2 = y \\
\lambda_0 + \lambda_1 + \lambda_2 = 1
\end{cases} \\
\Leftrightarrow \quad
&\begin{pmatrix} x_0 & x_1 & x_2 \\ y_0 & y_1 & y_2 \\ 1 & 1 & 1 \end{pmatrix} \cdot \begin{pmatrix} \lambda_0 \\ \lambda_1 \\ \lambda_2 \end{pmatrix} = \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} \\
\Leftrightarrow \quad
&\lambda_0 = \frac{\begin{vmatrix} x & x_1 & x_2 \\ y & y_1 & y_2 \\ 1 & 1 & 1 \end{vmatrix}}{\begin{vmatrix} x_0 & x_1 & x_2 \\ y_0 & y_1 & y_2 \\ 1 & 1 & 1 \end{vmatrix}} = \frac{x y_1 + x_1 y_2 + x_2 y - x_1 y - x y_2 - x_2 y_1}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1}, \\
&\lambda_1 = \frac{\begin{vmatrix} x_0 & x & x_2 \\ y_0 & y & y_2 \\ 1 & 1 & 1 \end{vmatrix}}{\begin{vmatrix} x_0 & x_1 & x_2 \\ y_0 & y_1 & y_2 \\ 1 & 1 & 1 \end{vmatrix}} = \frac{x_0 y + x y_2 + x_2 y_0 - x y_0 - x_0 y_2 - x_2 y}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1}, \\
&\lambda_2 = \frac{\begin{vmatrix} x_0 & x_1 & x \\ y_0 & y_1 & y \\ 1 & 1 & 1 \end{vmatrix}}{\begin{vmatrix} x_0 & x_1 & x_2 \\ y_0 & y_1 & y_2 \\ 1 & 1 & 1 \end{vmatrix}} = \frac{x_0 y_1 + x_1 y + x y_0 - x_1 y_0 - x_0 y - x y_1}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1} \text{.}\end{align}$$\)
Andererseits ist wahr:
\($$\begin{align}
A(\Delta(p_0, p_1, p_2)) &= A(\Delta(0, p_1 - p_0, p_2 - p_0)) \\
&= \frac{1}{2} \cdot \left| \operatorname{det} \begin{pmatrix} x_1 - x_0 & x_2 - x_0 \\ y_1 - y_0 & y_2 - y_0 \end{pmatrix} \right| \\
&= \frac{1}{2} \cdot \left| x_1 y_2 - x_1 y_0 - x_0 y_2 - x_2 y_1 + x_2 y_0 + x_0 y_1 \right|
\end{align}$$\)
\($$\begin{align}
A(\Delta(p, p_1, p_2)) &= A(\Delta(0, p_1 - p, p_2 - p)) \\
&= \frac{1}{2} \cdot \left| \operatorname{det} \begin{pmatrix} x_1 - x & x_2 - x \\ y_1 - y & y_2 - y \end{pmatrix} \right| \\
&= \frac{1}{2} \cdot \left| x_1 y_2 - x_1 y - x y_2 - x_2 y_1 + x_2 y + x y_1 \right|
\end{align}$$\)
\($$\begin{align}
A(\Delta(p_0, p, p_2)) &= A(\Delta(0, p - p_0, p_2 - p_0)) \\
&= \frac{1}{2} \cdot \left| \operatorname{det} \begin{pmatrix} x - x_0 & x_2 - x_0 \\ y - y_0 & y_2 - y_0 \end{pmatrix} \right| \\
&= \frac{1}{2} \cdot \left| x y_2 - x y_0 - x_0 y_2 - x_2 y + x_2 y_0 + x_0 y \right|
\end{align}$$\)
\($$\begin{align}
A(\Delta(p_0, p_1, p)) &= A(\Delta(0, p_1 - p_0, p - p_0)) \\
&= \frac{1}{2} \cdot \left| \operatorname{det} \begin{pmatrix} x_1 - x_0 & x - x_0 \\ y_1 - y_0 & y - y_0 \end{pmatrix} \right| \\
&= \frac{1}{2} \cdot \left| x_1 y - x_1 y_0 - x_0 y - x y_1 + x y_0 + x_0 y_1 \right|
\end{align}$$\)
Da \($p \in \Delta(p_0, p_1, p_2)$\) gilt, liegt \($p$\) in der konvexen Hülle von \($\{p_0, p_1, p_2\}$\), daher ist \($\lambda_0, \lambda_1, \lambda_2 \geq 0$\) erfüllt. Also kriegen wir:
\($$\begin{align}
\lambda_0 = \left| \lambda_0 \right| &= \left| \frac{x y_1 + x_1 y_2 + x_2 y - x_1 y - x y_2 - x_2 y_1}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1} \right| \\
&= \frac{2}{2} \cdot \frac{\left| x_1 y_2 - x_1 y - x y_2 - x_2 y_1 + x_2 y + x y_1 \right|}{\left| x_1 y_2 - x_1 y_0 - x_0 y_2 - x_2 y_1 + x_2 y_0 + x_0 y_1 \right|} \\
&= \frac{A(\Delta(p, p_1, p_2))}{A(\Delta(p_0, p_1, p_2))} \text{,}
\end{align}$$\)
\($$\begin{align}
\lambda_1 = \left| \lambda_1 \right| &= \left| \frac{x_0 y + x y_2 + x_2 y_0 - x y_0 - x_0 y_2 - x_2 y}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1} \right| \\
&= \frac{2}{2} \cdot \frac{\left| x y_2 - x y_0 - x_0 y_2 - x_2 y + x_2 y_0 + x_0 y \right|}{\left| x_1 y_2 - x_1 y_0 - x_0 y_2 - x_2 y_1 + x_2 y_0 + x_0 y_1 \right|} \\
&= \frac{A(\Delta(p_0, p, p_2))}{A(\Delta(p_0, p_1, p_2))} \text{,}
\end{align}$$\)
\($$\begin{align}
\lambda_2 = \left| \lambda_2 \right| &= \left| \frac{x_0 y_1 + x_1 y + x y_0 - x_1 y_0 - x_0 y - x y_1}{x_0 y_1 + x_1 y_2 + x_2 y_0 - x_1 y_0 - x_0 y_2 - x_2 y_1} \right| \\
&= \frac{2}{2} \cdot \frac{\left| x_1 y - x_1 y_0 - x_0 y - x y_1 + x y_0 + x_0 y_1 \right|}{\left| x_1 y_2 - x_1 y_0 - x_0 y_2 - x_2 y_1 + x_2 y_0 + x_0 y_1 \right|} \\
&= \frac{A(\Delta(p_0, p_1, p))}{A(\Delta(p_0, p_1, p_2))} \text{.} \quad \square
\end{align}$$\)
Zuletzt geändert von eXile am 23.04.2012, 03:58, insgesamt 2-mal geändert.
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: Normal Interpolation

Beitrag von Youka »

eXile hat geschrieben:
Youka hat geschrieben:Hat eine Dimension beider Vektoren nun die Steigung 0 (z.B. wenn das Dreieck flach auf der z-Ebene 0 liegt) ergibt sich eine Division durch 0. Dies ist logisch, da dann für P = A + bV1 + cV2 die baryzentrischen Koordinaten unbedeutend sind.
Mir erschließt sich nicht, was du erstens mit hier mit der „Steigung eines Vektors“ meinst, zweitens wieso dann eine Division durch Null auftreten soll und drittens warum die baryzentrischen Koordinaten plötzlich „unbedeutend“ sind.
Beispiel:
V1 = {10, 5, 0}
V2 = {9, 1, 0}
Erstens:
Die Dimension z beider Vektoren hat die Steigung 0 (entschuldige meine Ausdrucksweise :? ).
Zweitens:
Siehe b = (V2yV2zPx + V2xV2zPy - 2V2xV2yPz - V2yV2zAx - V2xV2zAy + 2V2xV2yAz) / (V2yV2zV1x + V2xV2zV1y - 2V2xV2yV1z).
Ist V1z,V2z = 0, dann wird auch der Divisor 0.
Drittens:
Für Pz = Az + 0b + 0c ist b und c unbedeutend.
eXile hat geschrieben:Das Problem an deiner Rechnung ist einfach, dass du nicht sicher sein kannst, dass du nicht durch Null dividierst.
Ganz genau. Danke für die Herleitung. Damit kann ich arbeiten :)
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Normal Interpolation

Beitrag von dot »

Ich denk was auch ein Problem ist ist dass du da oben versuchst die Baryzentrischen Koordinaten für einen 3D Punkt zu bestimmen. In 3D liegt aber nicht notwendigerweise jeder Punkt in der Ebene des Dreiecks...
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: Normal Interpolation

Beitrag von Youka »

dot hat geschrieben:Ich denk was auch ein Problem ist ist dass du da oben versuchst die Baryzentrischen Koordinaten für einen 3D Punkt zu bestimmen. In 3D liegt aber nicht notwendigerweise jeder Punkt in der Ebene des Dreiecks...
Ich bin mir der Ungenauigkeit bewusst. Das soll Problem des Anwenders bleiben ;)
Hab es nun gelöst, indem ich die Normalen (APB, BPC, CPA) vergleiche.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Normal Interpolation

Beitrag von dot »

Gehts dir um einen Strahl/Dreieck Schnittpunktstest? Wenn ja schau dir den Möller-Trumbore Algorithmus an, der liefert dir alles auf einen Schlag...
Antworten