U und V Koordinaten von D3DXIntersect
-
Ich möchte eine kleines Benutzerinterface mit Direct3d erstellen (übrigens in D), das ein klein wenig an das .Net-framework 3.0 angelehnt ist. Dieses benutze ich auch mehreren Gründen nicht, einer wäre, dass ich es nicht auf dem Zielcomputer installieren kann, und ein anderer, dass ich mit XAML nicht umgehen kann. Außerdem muss es 3-Dimensional sein, d.h. auch Button/Bilder/Texte auf 3-dimensionalen Flächen.
Ich will auf den Controls noch weitere einfügen, dafür muss ich bei einem Klick herausfinden, wo der Pick-Ray das Rechteck geschnitten hat. Die Koordinaten möchte ich so haben, dass sie den Textur-Koordinaten entsprechen. Die Funktion D3DXIntersect(Tri) hat dafür (hoffe ich) die beiden vorletzten Parameter. Allerdings verstehe ich die dazugehörige Mathematik nicht, und ich weiß auch nicht, wie ich barycentric coordinates übersetzen soll.Ich hoffe mir kann jemand helfen.
-
barycentric coordinates = baryzentrische Koordinaten
Der Witz ist, das alle Koordinaten im Interval [0;1] liegen und die Summe aller Koordinaten 1 ergibt. Z. B. kann man mit 2 baryzentrischen Koordinaten jeden Punkt in einem Dreieck beschreiben.
v0, v1, v2 seien die Eckpunkte (Vertizes) und u, v seien die baryzentrischen Koordinaten - so kann wie folgt jeder Punkt im Dreieck beschrieben werden:
(1-u-v)*v0 + u*v1 + v*v2Der Vorteil der baryzentrischen Form von Dreiecken liegt z. B. darin, das sich sehr schnell ein Schnittpunkttest zwischen einem Strahl und einem Dreieck, das durch baryzentrische Koordinaten beschrieben ist, machen läßt.
Lass dich ja nicht durch das Wort baryzentrisch in Unruhe versetzen und fang bloß nicht an dich in in Affine Räume und Kombinationen einzulesen. Das bringt nichts - da oben in der Formel steckt nicht mehr drin als ein Dreieck läßt sich eindeutig durch zwei nicht parallele Vektoren und einen Aufpunkt beschreiben (ähnlich wie eine Ebene)
-
ach ja - der Algorithmus den ich meine (Schnittpunkt zwischen Strahl und Dreieck) wurde von "Möller und Trumbore" in einem Paper beschrieben - ist recht trivial

-
Danke für die schnelle Antwort!
Im Grunde ist das Thema ja sogar richtig einfach, wenn man es erst einmal verstanden hat. Jetzt funktioniert auch das Programm richtig gut, allerdings muss ich aus irgendeinem Grund um die eigentlichen Koordinaten herauszufinden noch von einem Vektor (1;1) das Ergebnis subtrahieren, warum weiß ich auch nicht
-
ergebnis - (1,1) ???
keine Ahnung - da müsste ich schon den Code sehen...
das einzige was mir spontan einfällt ist, dass es verschiedenen Koordinatensysteme für die u,v Koordinaten gibt - bei manchen ist = u=0, v=0 links unten - bei anderen links oben - um das wieder "richtig hinzurechnen" macht man einfach 1-v
-
Nein, das falsche Ergebnis war bloß ein Fehler von mir, weil ich mir nicht durchgelesen hab, was ich zuvor programmiert hab

Ich hab meine Koordinaten jetzt so gewählt, dass möglichst viel Rechnerei raus fällt, da dieser Teilabschnitt doch recht häufig durchlaufen wird.
-
Vertexwahn schrieb:
Der Witz ist, das alle Koordinaten im Interval [0;1] liegen und die Summe aller Koordinaten 1 ergibt.
Warum laesst man dann nicht eine Koordinate weg, sie eribt sich ja ohnehin immer aus den anderen. Du siehst schon, deine Aussage ist im allgemeinen Fall nicht so ganz korrekt. Allerdings folgt aus dieser Eigenschaft, das der Punkt im Dreieck liegt. Da alle Schnittpunkte im Dreieck liegen, kann man sie eben genau so ausdruecken.
Aber was red ich, das haette man schon laengst in Mathebuechern oder google nachschlagen koennen. f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Vertexwahn schrieb:
Der Witz ist, das alle Koordinaten im Interval [0;1] liegen und die Summe aller Koordinaten 1 ergibt.
Warum laesst man dann nicht eine Koordinate weg, sie eribt sich ja ohnehin immer aus den anderen. Du siehst schon, deine Aussage ist im allgemeinen Fall nicht so ganz korrekt. Allerdings folgt aus dieser Eigenschaft, das der Punkt im Dreieck liegt. Da alle Schnittpunkte im Dreieck liegen, kann man sie eben genau so ausdruecken.
Aber was red ich, das haette man schon laengst in Mathebuechern oder google nachschlagen koennen. f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
hast du auch diesen Satz meines Postings gelesen:
Z. B. kann man mit 2 baryzentrischen Koordinaten jeden Punkt in einem Dreieck beschreiben.
-
Ich habe den Satz gelesen, verstehe aber nicht, warum er falsche Aussagen rechtfertigt. f'`8k
Gruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Ich habe den Satz gelesen, verstehe aber nicht, warum er falsche Aussagen rechtfertigt. f'`8k
Gruß, TGGC (\-/ has leading)
ich kann dir leider nicht ganz folgen
TGGC schrieb:
Warum laesst man dann nicht eine Koordinate weg
mach ich doch: (1-u-v)*v0 + u*v1 + v*v2 - die dritte Koordinate w ergibt sich aus w =1-u-v
-
Ich glaube du verstehst den Unterschied nicht. Das Spezielle folgt aus dem Allgemeinen und nicht umgekehrt. f'`8k
Gruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Ich glaube du verstehst den Unterschied nicht. Das Spezielle folgt aus dem Allgemeinen und nicht umgekehrt.
und du verstehst offensichtlich seinen simplen satz nicht.
-
Nein. f'`8k
Gruß, TGGC (\-/ has leading)
-
Ich denke er will darauf hinaus, dass eben nicht "alle Koordinaten im 0..1 bereich liegen".
Wenn sie das tuen und die Summe 1 ist, liegen sie im Dreieck, was noch lange nicht bedeutet, dass alle Punkte das tuen. Und man kann mit 2 baryzentrischen Koordinaten auch Punkte außerhalb von besagtem Dreieck darstellen.Trozdem denke ich, wir alle wissen, was Vertexwahn damit sagen wollte...