Normalen für Flatshading berechnen

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Nox

Betreff: Normalen für Flatshading berechnen

BeitragMi, Jul 19, 2006 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
So, da ich's mit Hilfe von Dreameora und BIG BUG selbst endlich hinbekommen habe, könnte die Funktion für einige möglicherweise nützlich sein.
Sie berechnet für alle Surfaces eines Meshs die Normalen. UpdateNormals() tut das zwar auch, aber auf eine andere Art und Weise: Soweit ich das beobachtet habe, fasst UpdateNormals() bspw. Eckpunkte oder generell Punkte, die sich 2 oder mehr Triangles teilen, zusammen. Das kann zu unschönen Effekten führen.

Code darf verändert, beliebig genutzt, vergewaltigt und aufgegessen werden. Wink
Code: [AUSKLAPPEN]

Function UpdateNormalsFlat( mesh% )
  Local srfMesh%
  Local srfnum%, trinum%
  Local v0%, v1%, v2%
  Local nx#, ny#, nz#, norm#
  Local v0x#, v0y#, v0z#, v1x#, v1y#, v1z#, v2x#, v2y#, v2z#
  Local v01x#, v01y#, v01z#, v02x#, v02y#, v02z#
   
   For srfnum% = 1 To CountSurfaces( mesh% )
      srfMesh% = GetSurface( mesh%, srfnum% )

    For trinum% = 0 To CountTriangles( srfMesh% ) - 1
      v0% = TriangleVertex( srfMesh%, trinum%, 0 )
      v1% = TriangleVertex( srfMesh%, trinum%, 1 )
      v2% = TriangleVertex( srfMesh%, trinum%, 2 )

      v0x# = VertexX( srfMesh%, v0% ) ; Nur zur besseren Lesbarkeit..
      v0y# = VertexY( srfMesh%, v0% )
      v0z# = VertexZ( srfMesh%, v0% )
      v1x# = VertexX( srfMesh%, v1% )
      v1y# = VertexY( srfMesh%, v1% )
      v1z# = VertexZ( srfMesh%, v1% )
      v2x# = VertexX( srfMesh%, v2% )
      v2y# = VertexY( srfMesh%, v2% )
      v2z# = VertexZ( srfMesh%, v2% )

      v01x# = v0x# - v1x#         ; (v0 - v1)
      v01y# = v0y# - v1y#
      v01z# = v0z# - v1z#
      v02x# = v0x# - v2x#         ; (v0 - v2)
      v02y# = v0y# - v2y#
      v02z# = v0z# - v2z#

      ; Kreuzprodukt zwischen (v0 - v1) und (v0 - v2).
      nx# = v01y# * v02z# - v01z# * v02y#
      ny# = v01z# * v02x# - v01x# * v02z#
      nz# = v01x# * v02y# - v01y# * v02x#
     
      ; Normalisierungsfaktor bestimmen...
      norm# = Sqr( nx# * nx# + ny# * ny# + nz# * nz# )
      nx# = nx# / norm#   ; ...und normalisieren.
      ny# = ny# / norm#
      nz# = nz# / norm#
     
      ; Normale auf alle Vertices anwenden.
      VertexNormal( srfMesh%, v0%, nx#, ny#, nz# )
      VertexNormal( srfMesh%, v1%, nx#, ny#, nz# )
         VertexNormal( srfMesh%, v2%, nx#, ny#, nz# )

      Next
   Next

End Function

skey-z

BeitragMi, Jul 19, 2006 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke dir, kann ich gut gebrauchen und mein Meshterrain sieht endlich gut aus *thumpsup*
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group