Dot3 normalmap berechnung

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

KaozZZ

Betreff: Dot3 normalmap berechnung

BeitragDo, Aug 02, 2012 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wollte mal das Thema Normalmapping ansprechen!
Und zwar wurde hier im Forum schon vor längerer Zeit diese funktion zur berechnung der vertexcolor gepostet:
BlitzBasic: [AUSKLAPPEN]

Function UpdateDot3Normals1(Mesh, Light)
Local LX#, LY#, LZ#, LNX#, LNY#, LNZ#
Local S, Surface, V, VX#, VY#, VZ#, VNX#, VNY#, VNZ#
Local Length#, DotProduct#, VRed, VGreen, VBlue

; get the lightcoords
LX# = EntityX#(Light, 1)
LY# = EntityY#(Light, 1)
LZ# = EntityZ#(Light, 1)

For S = 1 To CountSurfaces(Mesh)
Surface = GetSurface(Mesh, S)
For V = 0 To CountVertices(Surface)-1
; get vertexcoords
VX# = VertexX#(Surface, V)
VY# = VertexY#(Surface, V)
VZ# = VertexZ#(Surface, V)

; get vertexnormalcoords
VNX# = VertexNX#(Surface, V)
VNY# = VertexNY#(Surface, V)
VNZ# = VertexNZ#(Surface, V)

; transform vertexcoords into worldcoords
TFormPoint VX#, VY#, VZ#, Mesh, 0
VX# = TFormedX#()
VY# = TFormedY#()
VZ# = TFormedZ#()

; transform vertexnormalcoords into worldnormalcoords
TFormNormal VNX#, VNY#, VNZ#, Mesh, 0
VNX# = TFormedX#()
VNY# = TFormedY#()
VNZ# = TFormedZ#()

; calculate a vector between vertex and light
LNX# = LX#-VX#
LNY# = LY#-VY#
LNZ# = LZ#-VZ#

; normalize this vector
Length# = Sqr#(LNX#^2.0+LNY#^2.0+LNZ#^2.0)
LNX# = LNX#/Length#
LNY# = LNY#/Length#
LNZ# = LNZ#/Length#

; calculate the dotproduct between vertexnormal and the vector between light and vertex
DotProduct# = VNX#*LNX#+VNY#*LNY#+VNZ#*LNZ#


; if the light behind the mesh
If DotProduct# < 0.0 Then DotProduct# = 0.0

; calculate the new vertexcolor
VRed = ( LNX#*DotProduct#+1.0)*127.0
VGreen = ( LNY#*DotProduct#+1.0)*127.0
VBlue = (-LNZ#*DotProduct#+1.0)*127.0

; update vertexcolor
VertexColor Surface, V, VRed, VGreen, VBlue
Next
Next
End Function


leider scheint diese methode fehlerhaft. das folgende bild zeigt 2 cubes einmal von vorne und einmal von hinten. die cubes wurden dafür nicht rotiert, sondern die kamera auf die rückseite bewegt. Und obwohl die cubes nicht rotiert wurden ist die schattendarstellung der normalmap auf der Rückseite fehlerhaft (falschherum).

user posted image

Wahrscheinlich liegt das daran, dass die licht position zur vertexposition bei dieser methode nicht in abhängigkeit zum normalen vektor und zur texturausrichtung betrachtet/berechnet wird.

meine frage ist, was ihr denkt, was das problem ist und ob irgendjemand für dieses probleme eine lösungsidee hat oder schon eine lösung gefunden hat?


Edit: Außerdem tritt auch ein fehler auf, wenn die cubes z.b. um die z-achse rotiert werden und das licht von rechts auf die z-seiten des cubes scheint. eigentlich müsste der schatten der steine, durch das licht von rechts, immer auf der linken seite sein(die Texture würde ständig verändert werden), aber das passiert nicht. die Textur verändert sich nicht und der schatten der steine kann dann schonmal auf der seite des lichts sein ^^
  • Zuletzt bearbeitet von KaozZZ am So, Aug 05, 2012 19:31, insgesamt einmal bearbeitet
 

KaozZZ

BeitragFr, Aug 03, 2012 10:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe jetzt vll einen lösungsweg gefunden, aber ich weis nicht ob ich diesen realisieren kann.

Gibt es eine möglichkeit, wenn ich ein Vertex habe ein anderes, dass im gleichen dreieck ist herauszufinden?
 

sddsmhr

BeitragDo, Aug 09, 2012 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wüsste jetzt nicht, wie man auf ein Vertex als Handle zugreifen kann... Aber im Prinzip sind von Surfaces, Triangles bis Vertices alle indiziert oder miteinander verknüpft (child/parent).

Die Funktionen GetSurface, FindSurface, CountVertices, CountTriangles und insbesondere TriangleVertex sollten dir helfen.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group