procedural mesh from picture
Posted: Fri Jul 26, 2013 10:25 pm
Hi!
i wrote a little procedure that creates a mesh from a picture to create for e.g. objects like you know from minecraft. Well the procedure works
but it generates much too many vertices and i want to optimize it. I achieved to generate in the new version a optimal amount of vertices by
checking the vertexes if the already exist but i don't have an idea how to apply the proper faces to the mesh now. This is what the code looks like:
Here are all files including the old procedure which isn't optimized but its working.
https://dl.dropboxusercontent.com/u/791 ... c2Mesh.zip
I hope that somebody has an good idea how to solve this problem.
Making manual meshes means real pain to me
Good Night
i wrote a little procedure that creates a mesh from a picture to create for e.g. objects like you know from minecraft. Well the procedure works
but it generates much too many vertices and i want to optimize it. I achieved to generate in the new version a optimal amount of vertices by
checking the vertexes if the already exist but i don't have an idea how to apply the proper faces to the mesh now. This is what the code looks like:
Code: Select all
Global CamSpeed = 0.6 , CamMode = 0 , RenderMode = 0, FullScreen = 0
Global KeyX, KeyY, RollZ, RotX, RotY, MouseX, MouseY, FPS, VSync = 1
Structure Vertex
x.f
y.f
z.f
EndStructure
Global NewList VertexList.Vertex()
Global Dim Mask.Vertex(8)
Declare InitWorld()
Declare Keyboard()
Declare MakeMeshFromPicture(picture.s, le)
Declare IsVertex(x.f, y.f, z.f)
Procedure InitWorld()
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Add3DArchive("\", #PB_3DArchive_FileSystem)
AntialiasingMode(#PB_AntialiasingMode_x6)
;Parse3DScripts()
If Not FullScreen
OpenWindow(0,0,0,1280,960,"Stryder",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,1280,960,0,0,0,VSync)
Else
ExamineDesktops()
OpenScreen(DesktopWidth(0),DesktopHeight(0),32,"",VSync)
EndIf
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, -30, 30,-40,#PB_Absolute)
RotateCamera(0,-90,0, 180)
CreateLight(0,$FFFFFF,0,30,0,#PB_Light_Point)
;Sun(0,500,0,$FFFFFF)
;SpotLightRange(0,0, 90)
AmbientColor($FFFFFF)
LoadTexture(0,"plane.jpg")
CreateMaterial(0, TextureID(0))
CreatePlane(0, 20, 20, 10, 10, 10, 10)
CreateEntity(0,MeshID(0), MaterialID(0), 0, 0, 0)
EndProcedure
Procedure Keyboard()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_A)
keyx = -1
ElseIf KeyboardPushed(#PB_Key_D)
keyx = 1
Else
keyx = 0
EndIf
If KeyboardReleased(#PB_Key_A)
ElseIf KeyboardReleased(#PB_Key_D)
EndIf
If KeyboardPushed(#PB_Key_W)
keyy = -1
ElseIf KeyboardPushed(#PB_Key_S)
keyy = 1
Else
keyy = 0
EndIf
If KeyboardReleased(#PB_Key_PageUp)
rollz = 1
ElseIf KeyboardReleased(#PB_Key_PageDown)
rollz = 0
EndIf
If KeyboardReleased(#PB_Key_Space)
EndIf
If KeyboardReleased(#PB_Key_F1)
EndIf
If KeyboardReleased(#PB_Key_F2)
Rendermode = Rendermode + 1
Select Rendermode
Case 0 : CameraRenderMode(0, #PB_Camera_Textured)
Case 1 : CameraRenderMode(0, #PB_Camera_Wireframe)
Case 2 : CameraRenderMode(0, #PB_Camera_Plot)
EndSelect
If Rendermode = 2 : Rendermode = -1 : EndIf
EndIf
If KeyboardReleased(#PB_Key_F3)
;If CamMode = #True : CamMode = #False : Else : CamMode = #True : EndIf
EndIf
ExamineMouse()
rotx = 0 : roty = 0
mousex = -MouseDeltaX()
mousey = -MouseDeltaY()
If MouseButton(#PB_MouseButton_Right)
rotx = mousey
roty = mousex
mousex = 0
mousey = 0
EndIf
EndProcedure
Procedure IsVertex(x.f, y.f, z.f)
ForEach VertexList()
If VertexList()\x = x And VertexList()\y = y And VertexList()\z = z : ProcedureReturn #True : EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure MakeMeshFromPicture(picture.s, le)
Define n,v
UsePNGImageDecoder()
UseJPEGImageDecoder()
Img = LoadImage(#PB_Any, picture)
Width = ImageWidth(img)
Height = ImageHeight(img)
Mesh = CreateMesh(#PB_Any);,#PB_Mesh_PointList)
l = 1 : tu.f = 1 / Width : tv.f = 1 / Height
StartDrawing(ImageOutput(Img))
For y = 0 To Height-1
For x = 0 To Width-1
Pixel = Point(x,y)
If Pixel <> 0
Mask(1)\x = x*l
Mask(1)\y = y*l+1
Mask(1)\z = 0
If Not IsVertex(Mask(1)\x, Mask(1)\y, Mask(1)\z)
AddElement(VertexList())
VertexList()\x = Mask(1)\x
VertexList()\y = Mask(1)\y
VertexList()\z = Mask(1)\z
MeshVertexPosition(x*l,y*l+1, 0)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(2)\x = x*l +1
Mask(2)\y = y*l+1
Mask(2)\z = 0
If Not IsVertex(Mask(2)\x, Mask(2)\y, Mask(2)\z)
AddElement(VertexList())
VertexList()\x = Mask(2)\x
VertexList()\y = Mask(2)\y
VertexList()\z = Mask(2)\z
MeshVertexPosition(x*l+1,y*l+1, 0)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(3)\x = x*l+1
Mask(3)\y = y*l+0
Mask(3)\z = 0
If Not IsVertex(Mask(3)\x, Mask(3)\y, Mask(3)\z)
AddElement(VertexList())
VertexList()\x = Mask(3)\x
VertexList()\y = Mask(3)\y
VertexList()\z = Mask(3)\z
MeshVertexPosition(x*l+1,y*l+0, 0)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(4)\x = x*l+0
Mask(4)\y = y*l+0
Mask(4)\z = 0
If Not IsVertex(Mask(4)\x, Mask(4)\y, Mask(4)\z)
AddElement(VertexList())
VertexList()\x = Mask(4)\x
VertexList()\y = Mask(4)\y
VertexList()\z = Mask(4)\z
MeshVertexPosition(x*l+0,y*l+0, 0)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(5)\x = x*l+0
Mask(5)\y = y*l+1
Mask(5)\z = le
If Not IsVertex(Mask(5)\x, Mask(5)\y, Mask(5)\z)
AddElement(VertexList())
VertexList()\x = Mask(5)\x
VertexList()\y = Mask(5)\y
VertexList()\z = Mask(5)\z
MeshVertexPosition(x*l+0,y*l+1, le)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(6)\x = x*l+1
Mask(6)\y = y*l+1
Mask(6)\z = le
If Not IsVertex(Mask(6)\x, Mask(6)\y, Mask(6)\z)
AddElement(VertexList())
VertexList()\x = Mask(6)\x
VertexList()\y = Mask(6)\y
VertexList()\z = Mask(6)\z
MeshVertexPosition(x*l+1,y*l+1, le)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(7)\x = x*l+1
Mask(7)\y = y*l+0
Mask(7)\z = le
If Not IsVertex(Mask(7)\x, Mask(7)\y, Mask(7)\z)
AddElement(VertexList())
VertexList()\x = Mask(7)\x
VertexList()\y = Mask(7)\y
VertexList()\z = Mask(7)\z
MeshVertexPosition(x*l+1,y*l+0, le)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
Mask(8)\x = x*l+0
Mask(8)\y = y*l+0
Mask(8)\z = le
If Not IsVertex(Mask(8)\x, Mask(8)\y, Mask(8)\z)
AddElement(VertexList())
VertexList()\x = Mask(8)\x
VertexList()\y = Mask(8)\y
VertexList()\z = Mask(8)\z
MeshVertexPosition(x*l+0,y*l+0, le)
MeshVertexTextureCoordinate(tu*x,tv*y)
v + 1
EndIf
EndIf
Next x
Next y
StopDrawing()
StartDrawing(ImageOutput(Img))
For y = 0 To Height-1
For x = 0 To Width-1
pixel = Point(x,y)
If pixel <> 0
n = (x+1)*(y+1)
MeshFace(n+0, n+2, n+3);Vorderseite
MeshFace(n+0, n+1, n+2)
MeshFace(n+4, n+5, n+6);Rückseite
MeshFace(n+6, n+7, n+8)
MeshFace(n+1, n+4, n+5);Oberseite
MeshFace(n+1, n+0, n+4)
MeshFace(n+3, n+2, n+7);Unterseite
MeshFace(n+2, n+6, n+7)
MeshFace(n+7, n+4, n+0);vorne
MeshFace(n+3, n+7, n+0)
MeshFace(n+1, n+5, n+6);hinten
MeshFace(n+2, n+1, n+6)
EndIf
Next x
Next y
; MeshFace(n+0, n+2, n+3);Vorderseite
; MeshFace(n+0, n+1, n+2)
; MeshFace(n+7, n+6, n+4);Rückseite
; MeshFace(n+4, n+6, n+5)
; MeshFace(n+1, n+4, n+5);Oberseite
; MeshFace(n+1, n+0, n+4)
; MeshFace(n+3, n+2, n+7);Unterseite
; MeshFace(n+2, n+6, n+7)
; MeshFace(n+7, n+4, n+0);vorne
; MeshFace(n+3, n+7, n+0)
; MeshFace(n+1, n+5, n+6);hinten
; MeshFace(n+2, n+1, n+6)
StopDrawing()
FinishMesh(1)
Debug MeshVertexCount(mesh)
;TransformMesh(Mesh,(MeshRadius(Mesh)/2)*-1,0,0,1,1,1,180,0,0)
;NormalizeMesh(Mesh)
;Debug MeshVertexCount(mesh)
ProcedureReturn Mesh
EndProcedure
InitWorld()
png.s="test.png"
Mesh = MakeMeshFromPicture(png.s,1)
tex = LoadTexture(#PB_Any, png.s)
mat = CreateMaterial(#PB_Any, TextureID(tex))
CreateEntity(1, MeshID(Mesh), MaterialID(mat),0,20,0)
CameraLookAt(0,EntityX(1),EntityY(1),EntityZ(1))
;CameraRenderMode(0, #PB_Camera_Wireframe)
;Debug MeshVertexCount(mesh)
Repeat
If Not Fullscreen
Select WaitWindowEvent(1)
Case #PB_Event_CloseWindow
Quit = #True
EndSelect
EndIf
Keyboard()
RotateEntity(1, 0, 1.6, 0, #PB_Relative)
RotateCamera(0, mousey, mousex, 0,#PB_Relative)
MoveCamera (0, keyx*CamSpeed, 0, keyy*CamSpeed)
FPS = Engine3DFrameRate(#PB_Engine3D_Current)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = #True
https://dl.dropboxusercontent.com/u/791 ... c2Mesh.zip
I hope that somebody has an good idea how to solve this problem.
Good Night