Korrektes Toonshading

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Vertex

Betreff: Korrektes Toonshading

BeitragMo, März 21, 2005 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Head.b3d und Palette.bmp findet ihr samt Source unter: http://www.sucox.art-fx.org/Bl...hading.zip

user posted image

Code: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()

Mesh = LoadMesh("Head.b3d")
ScaleMesh Mesh, 75, 75, 75
UpdateNormals Mesh
Outline = CreateOutline(Mesh, 0.15)

Shading = LoadTexture("Palette.bmp", 1)
EntityTexture Mesh, Shading
TurnEntity Mesh, 0, 180, 0

Camera = CreateCamera()
CameraClsColor Camera, 255, 255, 255
PositionEntity Camera, 0.0, 0.0, -20.0

LightPivot = CreatePivot()
LightIcon = CreateCone(15, 1, LightPivot)
MoveEntity LightIcon, 0.0, 0.0, -12.0
TurnEntity LightIcon, 270.0, 0.0, 0.0, 0
EntityColor LightIcon, 255, 255, 0
ScaleMesh LightIcon, 0.5, 0.5, 0.5

Light = CreateLight(1)
EntityParent Light, LightIcon, 0

While Not KeyDown(1)
   TurnEntity LightPivot, 0.5, -0.5, 0.0
   TurnEntity Mesh, MouseYSpeed(), MouseXSpeed(), 0.0
   PointEntity Light, Mesh

   UpdateShading(Mesh, Light)
   
   UpdateWorld
   RenderWorld
   Flip
Wend

End

Function UpdateShading(Mesh, Light)
   Local SurfaceCount, S, Surface, VertexCount, V
   Local Normal#[2], Direction#[2], TexU#
   
   TFormNormal -1.0, -1.0, -1.0, Light, 0
   Direction[0] = TFormedX#()
   Direction[1] = TFormedY#()
   Direction[2] = TFormedZ#()
         
   SurfaceCount = CountSurfaces(Mesh)
   For S = 1 To SurfaceCount
      Surface = GetSurface(Mesh, S)
      VertexCount = CountVertices(Surface)-1
      For V = 0 To VertexCount
         Normal[0] = VertexNX#(Surface, V)
         Normal[1] = VertexNY#(Surface, V)
         Normal[2] = VertexNZ#(Surface, V)
         
         TFormNormal Normal[0], Normal[1], Normal[2], Mesh, 0
         Normal[0] = TFormedX#()
         Normal[1] = TFormedY#()
         Normal[2] = TFormedZ#()
         
         TexU# = DotProduct#(Normal[0], Normal[1],Normal[2], Direction[0], Direction[1], Direction[2])
         
         If TexU# < 0.0 Then TexU# = 0.0
         VertexTexCoords Surface, V, TexU#, 0
      Next
   Next
End Function

Function DotProduct#(X1#, Y1#, Z1#, X2#, Y2#, Z2#)
   Return X1#*X2# + Y1#*Y2# + Z1#*Z2#
End Function

Function CreateOutline(Mesh, Scale#)
   Local Outline, SurfaceCount, S, Surface, VertexCount, V
   Local Position#[2]
   
   Outline = CopyMesh(Mesh, Mesh)
   SurfaceCount = CountSurfaces(Outline)
   For S = 1 To SurfaceCount
      Surface = GetSurface(Outline, S)
      VertexCount = CountVertices(Surface)-1
      For V = 0 To VertexCount
         Position[0] = VertexX#(Surface, V)+VertexNX#(Surface, V)*Scale#
         Position[1] = VertexY#(Surface, V)+VertexNY#(Surface, V)*Scale#
         Position[2] = VertexZ#(Surface, V)+VertexNZ#(Surface, V)*Scale#
         VertexCoords Surface, V, Position[0], Position[1], Position[2]
      Next
   Next
   
   EntityColor Outline, 0, 0, 0
   FlipMesh Outline
   Return Outline
End Function


In der Zip-Datei hatte ich noch sinnloserweise TexV# mit drin.

Wie das ganze funktioniert werde ich mal in einem Tutorial zusammenfassen.

mfg olli
vertex.dreamfall.at | GitHub

Chester

BeitragMo, März 21, 2005 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
du machst ja XIII Konkurenz Very Happy
 

OJay

BeitragMo, März 21, 2005 20:19
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, ist ein ganz netter effekt, aber celshading ist schon noch bischen was anderes irgendwie... Confused

user posted image

einmal stören die normalen T&L vertexlights und die übergänge beschränken sich zu stark auf einzelne polygone...irgendwie.

nicht, das ich es besser könnte Wink

Vertex

BeitragMo, März 21, 2005 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja OJay, es werden halt die Normalen der Vertices zur Berechnung benutzt. Zwangsläufig hängt es also auch mit der Anzahl der Polygone zusammen.

Ansonsten gibt es bessere Effekte, in dem Man in dem Sinne kein echtes Licht, sondenr nur ein Pivot oder änliches benutzt und EntityFX Mesh, 1 sagt. Sieht bedeutend besser aus.

mfg olli
vertex.dreamfall.at | GitHub

Firstdeathmaker

BeitragMo, März 21, 2005 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Bis auf die Grafikfehler siehts wirklich gut aus. Auch wenn man mal ein paar Farben mehr nimmt:

user posted image
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

INpac

BeitragDi, März 22, 2005 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
schönen dank, sehr lobenswert, vertex Smile

Vertex

BeitragDi, März 22, 2005 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Smile

Sobald Lichtrichtung und Vertexnormal ein Skalarprodukt das kleiner als 0.0 ergeben, ist praktisch kein Licht zur Verfügung = Schatten. Hier sollte richtigerweise TexU# auf ein Wert annähernd von 0.0, wo bei der Palette auch Schatten ist, gestezt werden.

Öffnet mal in paint die Palette.bmp, Bild -> Drehen/Spiegeln... -> Horizontal Spiegeln -> OK und dann Speichern.

Hier der neue Code:
Code: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2
SetBuffer BackBuffer()

Mesh = LoadMesh("Head.b3d")
ScaleMesh Mesh, 75, 75, 75
UpdateNormals Mesh
EntityFX Mesh, 1
Outline = CreateOutline(Mesh, 0.10)

Shading = LoadTexture("Palette.bmp", 1)
EntityTexture Mesh, Shading
TurnEntity Mesh, 0, 180, 0

Camera = CreateCamera()
CameraClsColor Camera, 255, 255, 255
PositionEntity Camera, 0.0, 0.0, -20.0

LightPivot = CreatePivot()
LightIcon = CreateCone(15, 1, LightPivot)
MoveEntity LightIcon, 0.0, 0.0, -12.0
TurnEntity LightIcon, 270.0, 0.0, 0.0, 0
EntityColor LightIcon, 255, 255, 0
ScaleMesh LightIcon, 0.5, 0.5, 0.5

Light = CreatePivot()
EntityParent Light, LightIcon, 0

While Not KeyDown(1)
   TurnEntity LightPivot, 0.0, -0.5, 0.0
   TurnEntity Mesh, MouseYSpeed(), MouseXSpeed(), 0.0
   PointEntity Light, Mesh

   UpdateShading(Mesh, Light)
   
   UpdateWorld
   RenderWorld
   Flip
Wend

End

Function UpdateShading(Mesh, Light)
   Local SurfaceCount, S, Surface, VertexCount, V
   Local Normal#[2], Direction#[2], TexU#
   
   TFormNormal -1.0, -1.0, -1.0, Light, 0
   Direction[0] = TFormedX#()
   Direction[1] = TFormedY#()
   Direction[2] = TFormedZ#()
         
   SurfaceCount = CountSurfaces(Mesh)
   For S = 1 To SurfaceCount
      Surface = GetSurface(Mesh, S)
      VertexCount = CountVertices(Surface)-1
      For V = 0 To VertexCount
         Normal[0] = VertexNX#(Surface, V)
         Normal[1] = VertexNY#(Surface, V)
         Normal[2] = VertexNZ#(Surface, V)
         
         TFormNormal Normal[0], Normal[1], Normal[2], Mesh, 0
         Normal[0] = TFormedX#()
         Normal[1] = TFormedY#()
         Normal[2] = TFormedZ#()
         
         TexU# = DotProduct#(Normal[0], Normal[1],Normal[2], Direction[0], Direction[1], Direction[2])
         
         If TexU# < 0.0 Then TexU# = 0.01
         VertexTexCoords Surface, V, TexU#, 0
      Next
   Next
End Function

Function DotProduct#(X1#, Y1#, Z1#, X2#, Y2#, Z2#)
   Return X1#*X2# + Y1#*Y2# + Z1#*Z2#
End Function

Function CreateOutline(Mesh, Scale#)
   Local Outline, SurfaceCount, S, Surface, VertexCount, V
   Local Position#[2]
   
   Outline = CopyMesh(Mesh, Mesh)
   SurfaceCount = CountSurfaces(Outline)
   For S = 1 To SurfaceCount
      Surface = GetSurface(Outline, S)
      VertexCount = CountVertices(Surface)-1
      For V = 0 To VertexCount
         Position[0] = VertexX#(Surface, V)+VertexNX#(Surface, V)*Scale#
         Position[1] = VertexY#(Surface, V)+VertexNY#(Surface, V)*Scale#
         Position[2] = VertexZ#(Surface, V)+VertexNZ#(Surface, V)*Scale#
         VertexCoords Surface, V, Position[0], Position[1], Position[2]
         VertexColor Surface, V, 0, 0, 0
      Next
   Next
   
   EntityFX Outline, 2
   FlipMesh Outline
   Return Outline
End Function


Sieht besser aus, wie ich finde.

TexU# = 0.01 weil die texturen noch gefiltert sind.

mfg olli
vertex.dreamfall.at | GitHub

FreakForFreedom

BeitragMi, März 23, 2005 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey sehr schöner Effekt!
Danke dir!
Mfg
F.F.F.
"Try and ERROR!"

YellowRider

Ehemaliger Admin

BeitragMi, März 23, 2005 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sieht einfach nur geil aus Shocked

thx YR
 

Gombolo

BeitragMi, März 23, 2005 17:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Model hat auch sehr sehr viele Polygone.
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/

Moep

BeitragSa, März 03, 2007 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm der link ist anscheinend schon ne weile tot

könnte jemand die sachen hochladen?

mfg Moep

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group