[B3D] Normalmap Creator

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

StepTiger

Betreff: [B3D] Normalmap Creator

BeitragMi, Nov 08, 2006 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Also hier mal wieder was von mir. Es ist ein Normalmap Ersteller, für Gegenstände, die man an eine Wand zimmern möchte Very Happy

Also nicht für HighQuali -> LowQuali -> Highquali

sondern für Effekte, wie Schilder oder Asphalt als Textur für Wände.

So, hier mal der Code:
Code: [AUSKLAPPEN]
wid=Input("Width:   ")
Graphics3D wid,wid,32,2

cam=CreateCamera()
CameraRange cam,.001,1000
PositionEntity cam,0,0,-2

thing=LoadMesh(Input$("Mesh:    "))
EntityPickMode thing,2

bmp=CreateImage(wid,wid)

MoveMouse wid/2,wid/2
FlushMouse
FlushKeys

While Not KeyDown(1)
   
   ws#=MeshDepth(thing)/80.
   ts#=3.0
   
   MoveEntity cam,ws#*(KeyDown(205)-KeyDown(203)),0,ws#*(KeyDown(200)-KeyDown(208))
   
   xwink#=xwink#+MouseYSpeed()*ts#
   ywink#=ywink#-MouseXSpeed()*ts#
   
   RotateEntity cam,xwink#,ywink#,0
   
   UpdateWorld
   RenderWorld

   If KeyHit(28) Then Print "MACHT MAP!":Flip:MakeMap(cam,bmp):SaveImage bmp,"Normalen.bmp"
   
   Flip
   
Wend

End

Function MakeMap(cam,bmp)
   
   LockBuffer ImageBuffer(bmp)
   
   For x=0 To GraphicsWidth()-1
      For y=0 To GraphicsHeight()-1
         
         CameraPick(cam,x,y)
         
         Ent=PickedEntity()
         If Ent<>0
            Surface=PickedSurface()
            t=PickedTriangle()
            
            Vertex0% = TriangleVertex(Surface,t, 0)
            Vertex1% = TriangleVertex(Surface,t, 1)
            Vertex2% = TriangleVertex(Surface,t, 2)
            
            EdgeAX# = VertexX(Surface, Vertex1) - VertexX(Surface, Vertex0)
            EdgeAY# = VertexY(Surface, Vertex1) - VertexY(Surface, Vertex0)
            EdgeAZ# = VertexZ(Surface, Vertex1) - VertexZ(Surface, Vertex0)
            
            EdgeBX# = VertexX(Surface, Vertex2) - VertexX(Surface, Vertex0)
            EdgeBY# = VertexY(Surface, Vertex2) - VertexY(Surface, Vertex0)
            EdgeBZ# = VertexZ(Surface, Vertex2) - VertexZ(Surface, Vertex0)
            
            NormalX# = EdgeAY#*EdgeBZ# - EdgeAZ#*EdgeBY#
            NormalY# = EdgeAZ#*EdgeBX# - EdgeAX#*EdgeBZ#
            NormalZ# = EdgeAX#*EdgeBY# - EdgeAY#*EdgeBX#
            
            Length# = Sqr(NormalX#*NormalX# + NormalY#*NormalY# + NormalZ#*NormalZ#)
            If Length# = 0.0 Then
               NormalX#=0.0
               NormalY#=0.0
               NormalZ#=1.0
            Else
               RLength# = 1.0 / Length#
               NormalX# = NormalX# * RLength#
               NormalY# = NormalY# * RLength#
               NormalZ# = NormalZ# * RLength#
            EndIf
            
         ;   NormalX#=NormalX#-VertexX#(Surface, Vertex0)
         ;   NormalY#=NormalY#-VertexY#(Surface, Vertex0)
            NormalZ#=-NormalZ#;-VertexZ#(Surface, Vertex0)
            
            a#=-EntityPitch#(cam,1)
                        
            nnx#=NormalX#
                  nny#=Cos#(a#) * NormalY# - Sin#(a#) * NormalZ#
                  nnz#=Sin#(a#) * NormalY# + Cos#(a#) * NormalZ#
            
            a#=-EntityYaw#(cam,1)
            
                  nnx2#=nnx#*Cos#(a#)+nnz#*Sin#(a#)
                  nny2#=nny#
                  nnz2#=-nnx#*Sin#(a#)+nnz#*Cos#(a#)
                  
                  NormalX#=nnx2#
                  NormalY#=nny2#
                  NormalZ#=nnz2#
            
            d=0
            If d=1
               Print NormalX#+" "+NormalY#+" "+NormalZ#
               WaitKey
            EndIf
            
            r=Int(127.5+NormalX#*127.5)
            g=Int(127.5+NormalY#*127.5)
            b=Int(127.5+NormalZ#*127.5)
            
            WritePixelFast x,y,(r Shl 16) + (g Shl 8) + (b Shl 0),ImageBuffer(bmp)
            
         Else
            
            WritePixelFast x,y,(127 Shl 16) + (128 Shl 8) + (255 Shl 0),ImageBuffer(bmp)
            
         EndIf
         
      Next
   Next
   
   UnlockBuffer ImageBuffer(bmp)
   
End Function


Werkel nun etwa 2-3 Tage daran, bis mir Vertex den entscheidenden Code gab ^^

Sehr schnell ist es nicht und sogar extreeeeeeeeeeeeeem langsam, wenn ihr ein Modell mit mehr als 500 Polys bei 256x256 nehmt.

Also bei 6k Polys und 256x256 könnt ihr schon mit etwa 30-40 Sekunden rechnen.

Bei 20 Polys und 512x512 geht es natürlich beteudent schneller.

Ich nehme sehr gern Vorschläge und natürlich Kritik entgegen Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Mr.Keks

BeitragMi, Nov 08, 2006 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
öhhm, ginge das nicht schneller? also vielleicht mache ich gerade zu so später stunde einen fatalen denkfehler, aber ich würde einfach alle vertices des meshs durchgehen, deren vertexfarbe aus ihren normals machen und dann das bunte dingsie rendern. (natürlich ohne textur, leuchtend und mit aktivierter vertexfarbe)
MrKeks.net

StepTiger

BeitragMi, Nov 08, 2006 14:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Rein theoretisch kein Problem.

Aber: Wie steht es denn dann um die Farbberechnung abhängig von der Position der Kamera?

Ich versuch mal mein Glück.

Hab gerade überlegt, dass das so nicht geht, da zwischen den Vertexfarben interpoliert wird. Dreiecke haben keine Farbe.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Mr.Keks

BeitragMi, Nov 08, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
was ist denn verkehrt daran, wenn interpoliert wird? ok, ist vielleicht nicht ganz normalisiert... dann halt nochmal danach mit read- und writepixelfast drüber und normalisieren. ja, das ist dann alles nicht ganz perfekt, aber bestimmt perfekt genug Smile.

um es abhängig von der kameraposition zu machen, reicht doch ein einfaches tform der normals in den kameraraum ^^.
MrKeks.net

StepTiger

BeitragMi, Nov 08, 2006 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ne! ^^

Eine Kugel soll, egal aus welcher Perspektive, die gleichen Werte XYZ besitzen

also sollen bei einer perfekten Kugel die Farben aus jeder Perspektive gleich bleiben, da es ja sozusagen gegen eine Wand gemappt wird ^^
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group