Image to scene 3d - v2
Publié : lun. 05/mars/2018 11:20
salut tout le monde
j'ai bien aimé le code de zorro, c'est simple et ça donne un truc bien sympa
on peut aussi utiliser un seul mesh en coloriant les vertex
avec "SetMaterialColor(1, #PB_Material_AmbientColor,-1)"
j'ai fais une fonction "Createsurface" qui pourra vous etre utile
elle construit un mesh a partir d'un tableau 2d de type vertex (contenant position, uv, normal et couleur)
(de plus elle choisi la diagonal la plus adaptée (la disposition des 2 triangles formant les mails))
j'ai bien aimé le code de zorro, c'est simple et ça donne un truc bien sympa
on peut aussi utiliser un seul mesh en coloriant les vertex
avec "SetMaterialColor(1, #PB_Material_AmbientColor,-1)"
j'ai fais une fonction "Createsurface" qui pourra vous etre utile
elle construit un mesh a partir d'un tableau 2d de type vertex (contenant position, uv, normal et couleur)
(de plus elle choisi la diagonal la plus adaptée (la disposition des 2 triangles formant les mails))
Code : Tout sélectionner
Structure vector2
x.f
y.f
EndStructure
Structure Vector3
x.f
y.f
z.f
EndStructure
Macro vec3d(v,vx,vy,vz)
v\x=vx
v\y=vy
v\z=vz
EndMacro
Macro vec2d(v,vx,vy)
v\x=vx
v\y=vy
EndMacro
Procedure.f lng3D(*v.Vector3)
ProcedureReturn Sqr(*V\x * *V\x + *V\y * *V\y + *V\z * *V\z)
EndProcedure
Macro sub3D(p,p1,p2)
p\x=p1\x-p2\x
p\y=p1\y-p2\y
p\z=p1\z-p2\z
EndMacro
Structure Svertex2
p.vector3
n.vector3
diag.b
ai.b
aj.b
uv.vector2
color.l
EndStructure
Procedure Createsurface(mesh,Array t.Svertex2(2))
Protected p,i,j,m,diag,nx=ArraySize(t(),2),nz=ArraySize(t(),1)
Protected.vector3 d1,d2,n
m=CreateMesh(mesh):If mesh=-1:mesh=m:EndIf
For j=0 To nz
For i=0 To nx
With t(j,i)
MeshVertexPosition(\P\x,\p\y,\p\z)
MeshVertexTextureCoordinate(\uv\x,\uv\y)
MeshVertexColor(\color)
MeshVertexNormal(\n\x,\n\y,\n\z)
EndWith
Next
Next
For j=0 To nz-1
For i=0 To nx-1
p=j*(nx+1)+i
diag=t(j,i)\diag
If diag=0
sub3d(d1,t(j,i)\p,t(j+1,i+1)\p)
sub3d(d2,t(j+1,i)\p,t(j,i+1)\p)
If lng3d(d1)>lng3d(d2):diag=1:Else:diag=-1:EndIf
EndIf
If diag=1
MeshFace(p,p+1,p+nx+1): MeshFace(p+nx+2,p+nx+1,p+1)
Else
MeshFace(p+nx+1,p,p+nx+2): MeshFace(p+1,p+nx+2,p)
EndIf
Next
Next
FinishMesh(1)
UpdateMeshBoundingBox(mesh)
ProcedureReturn mesh
EndProcedure
;####################################################################################################
Procedure image3d()
Protected i,j,dx,dy,c,h.f
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AllChannels)
dx=ImageWidth(0)-1
dy=ImageHeight(0)-1
Dim t.svertex2(dx,dy)
For j=0 To dy
For i=0 To dx
c=Point(i,j)
With t(i,j)
h=(Red(c)+Green(c)+Blue(c))/64
vec3d(\p,-(i-dx/2),h,-(j-dy/2))
vec2d(\uv,i,j)
\color=c
EndWith
Next
Next
StopDrawing()
createsurface(1,t())
NormalizeMesh(1)
CreateEntity(1,MeshID(1),MaterialID(1))
EndProcedure
UsePNGImageDecoder()
UseJPEGImageDecoder()
LoadFont(0,"arial",18)
OpenWindow(0,0,0,1200,800,"Déposer un fichier image",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
EnableWindowDrop(0,#PB_Drop_Files,#PB_Drag_Copy)
InitKeyboard():InitMouse():InitEngine3D():InitSprite()
OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0),WindowHeight(0))
CreateImage(0,480,150,32)
StartDrawing(ImageOutput(0))
RoundBox(0,0,480,150,16,16,$ffffff)
RoundBox(4,4,472,142,16,16,$0000ff)
BackColor($0000ff)
DrawingFont(FontID(0))
DrawText(20,04,"Déposer un fichier image")
DrawText(20,30,"(Cliquer pour capturer/liberer la souris)")
DrawText(20,60,"Commandes : souris + curseur")
DrawText(20,90,"F12 : Fil de fer")
DrawText(20,116,"Esc : Quitter")
StopDrawing()
CreateLight(0, $ffffff, 1000, -1000, 1000)
AmbientColor($ffffff)
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0,400,-80)
CameraLookAt(0, 0, 0,0.001)
CreateTexture(1,64,64):StartDrawing(TextureOutput(1)):Box(1,1,62,62,$ffffff):StopDrawing()
CreateMaterial(1, TextureID(1))
SetMaterialColor(1, #PB_Material_AmbientColor,-1)
image3d()
Define.f MouseX,Mousey,keyx,keyy,keyz, iu.b=1
Define a.f, fdf, event
Repeat
event=WindowEvent()
ExamineMouse()
MouseX = -MouseDeltaX() * 0.05
MouseY = -MouseDeltaY() * 0.05
ExamineKeyboard()
keyx=(-Bool(KeyboardPushed(#PB_Key_Left)<>0)+Bool(KeyboardPushed(#PB_Key_Right)<>0))*1
keyz=(-Bool(KeyboardPushed(#PB_Key_Down)<>0)+Bool(KeyboardPushed(#PB_Key_Up )<>0))*1+MouseWheel()*10
If KeyboardReleased(#PB_Key_F12):fdf=1-fdf:If fdf:CameraRenderMode(0,#PB_Camera_Wireframe):Else:CameraRenderMode(0,#PB_Camera_Textured):EndIf:EndIf
RotateCamera(0, MouseY, MouseX, 0, #PB_Relative):MoveCamera (0, KeyX, 0, -keyz) :MoveCamera(0,CameraX(0),CameraY(0),CameraZ(0),#PB_Absolute)
If event = #PB_Event_LeftClick And IsScreenActive():iu=1-iu: ReleaseMouse(iu):EndIf
If event=#PB_Event_WindowDrop:LoadImage(0,EventDropFiles()):image3d():EndIf
RenderWorld()
FlipBuffers()
Until event=#PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)