Vertices im Uhrzeigersinn

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Eingeproggt

Betreff: Vertices im Uhrzeigersinn

BeitragDi, Jan 22, 2008 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Bei AddTriangle muss man ja die Vertices im Uhrzeigersinn angeben, damit das Triangle aus der Perspektive, aus der man es erstellt hat sichtbar ist. (Blöd formuliert, aber ich glaub ihr wisst, was ich meine Smile )

Wenn ich jetzt 3 Vertices hab und weiß, aus welcher Richtung sie sichtbar sein sollen - Wie weiß ich dann, in welcher Reihenfolge ich sie an AddTriangle übergeben muss?

Ich dachte irgendwie an CameraProject und dann auf 2D-Basis das iwie mit Abfragen hardcoden... Aber so ganz sicher bin ich mir da nicht, ob das hinhaut.

Danke und mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Dreamora

BeitragDi, Jan 22, 2008 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
das geht viel einfacher: Kreuzprodukt und dann schauen ob du auf der positiven oder negativen seite bist und entsprechend die reihenfolge ändern.

Sagen wir du hast 3 Vertices v0, v1, v2
Dann entscheidst du zuerst, welcher in der "durchgehensreihenfolge" der mittlere sein soll. Nehmen wir v1
Dann kannst du 2 Vektoren berechnen, nämlich v01 und v21, die vektoren von v0 zu v1 und v0 zu v2

v10 = v0 - v1
v12 = v2 - v1

Mit diesen kannst du nun die Normale dieser Fläche bestimmen mit hilfe des Vektor Kreuzproduktes:
n = crossproduct(v10, v12)

jetzt musst du lediglich noch schauen auf welcher Seite du bist dieses dreiecks indem du den Vektor Position -> v0 auf diese normale projizierst mit hilfe des Skalarprodukts (dot product auf englisch)

dif = v0 - pos
val = dotproduct(dif,n)

Wenn val > 0 ist, dann schaut das dreieck mit der reihenfolge v0,v1,v2 in deine Richtung, sonst in die andere und du musst die vertices in der umgekehrten reihenfolge einfügen.

Sprich wenn du das bischen Vektormathe kannst um Kreuzprodukt und Skalarprodukt zu implementieren wars das schon fast Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Eingeproggt

BeitragDi, Jan 22, 2008 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke aber.... Shocked .... "einfach" ist das nicht. Zumindest nicht für mich Crying or Very sad

Hab mal so angefangen, allerdings nur in der Vermutung, dass "pos" die Kamera sein soll, richtig?
Außerdem nahm ich an, dass B3D einen "euklidischen Raum mit der Standardbasis {(1,0,0),(0,1,0),(0,0,1)} und dem kanonischen Skalarprodukt" darstellt.

Code: [AUSKLAPPEN]

Dim vektor10#(2) ;x,y,z
Dim vektor12#(2)
Dim n#(2)
Dim diff#(2)
Function clockwise(sf,v0,v1,v2)
   ;Vektor von v1 zu v0
   vektor10(0)=VertexX(sf,v0)-VertexX(sf,v1)
   vektor10(1)=VertexY(sf,v0)-VertexY(sf,v1)
   vektor10(2)=VertexZ(sf,v0)-VertexZ(sf,v1)
   ;Vektor von v1 zu v2
   vektor12(0)=VertexX(sf,v2)-VertexX(sf,v1)
   vektor12(1)=VertexY(sf,v2)-VertexY(sf,v1)
   vektor12(2)=VertexZ(sf,v2)-VertexZ(sf,v1)
   ;Kreuzprodukt
   n(0)=vektor10(1)*vektor12(2)-vektor10(2)*vektor12(1)
   n(1)=vektor10(2)*vektor12(0)-vektor10(0)*vektor12(2)
   n(2)=vektor10(0)*vektor12(1)-vektor10(1)*vektor12(0)
   ;Differenzvektor zu Kamera
   diff(0)=VertexX(sf,v0)-EntityX(cam)
   diff(1)=VertexY(sf,v0)-EntityY(cam)
   diff(2)=VertexZ(sf,v0)-EntityZ(cam)
   ;Skalarprodukt aus Differenzvektor und Kreuzprodukt (Normalvektor)
   val=n(0)*diff(0)+n(1)*diff(1)+n(2)*diff(2)
   If val>0 Then
      Return True
   Else
      Return False
   EndIf
End Function


EDIT: Dreamoras Kochrezept mit ein bisschen Wikipedia-Wissen und ner gehörigen Portion Glück haben funktioniert Very Happy
Danke! Die Sache wär erledigt, außer wenn jemand noch Verbesserungsvorschläge hat.

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Dreamora

BeitragDi, Jan 22, 2008 21:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist einfach. wenn das noch nicht einfach ist, mehr üben ... wirst Vektormathe noch sehr häufig brauchen in 3D.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group