Korrektes Toonshading
Übersicht

![]() |
VertexBetreff: Korrektes Toonshading |
![]() Antworten mit Zitat ![]() |
---|---|---|
Head.b3d und Palette.bmp findet ihr samt Source unter: http://www.sucox.art-fx.org/Bl...hading.zip
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
du machst ja XIII Konkurenz ![]() |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
naja, ist ein ganz netter effekt, aber celshading ist schon noch bischen was anderes irgendwie... ![]() 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 ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bis auf die Grafikfehler siehts wirklich gut aus. Auch wenn man mal ein paar Farben mehr nimmt:
|
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
INpac |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
schönen dank, sehr lobenswert, vertex ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey sehr schöner Effekt!
Danke dir! |
||
Mfg
F.F.F. "Try and ERROR!" |
![]() |
YellowRiderEhemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das sieht einfach nur geil aus ![]() thx YR |
||
Gombolo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Model hat auch sehr sehr viele Polygone. | ||
Heute ist der erste Tag vom Rest deines Lebens
http://gombolo.go.funpic.de/ |
![]() |
Moep |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm der link ist anscheinend schon ne weile tot
könnte jemand die sachen hochladen? mfg Moep |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group