[B3D] Normalmap Creator
Übersicht

![]() |
StepTigerBetreff: [B3D] Normalmap Creator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also hier mal wieder was von mir. Es ist ein Normalmap Ersteller, für Gegenstände, die man an eine Wand zimmern möchte ![]() 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 ![]() |
||
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
ö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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() um es abhängig von der kameraposition zu machen, reicht doch ein einfaches tform der normals in den kameraraum ^^. |
||
MrKeks.net |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group