Image to scene 3d - v2

Généralités sur la programmation 3D
Avatar de l’utilisateur
Guillot
Messages : 516
Inscription : jeu. 25/juin/2015 16:18

Image to scene 3d - v2

Message par Guillot »

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))

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)
Avatar de l’utilisateur
Ar-S
Messages : 9471
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Image to scene 3d - v2

Message par Ar-S »

Très bon rendu sur certaines images.
Merci
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Image to scene 3d - v2

Message par Zorro »

a la base, je voulais faire exactement ça :)

mais vu que je n'y connais rien en Mesh , je me suis rabattu
sur les cubes :)

Bien joué , c'est bien cool comme code ...
faudra que je m'attarde a etudier la chose de plus pres
mais j'ai pas trop l'esprit "apprentissage" pour le moment

Merci pour ce code :)

je pense quand meme qu'il nous manque vraiment énormément de chose
en 3D ogre avec Purebasic ....

l’édition d'un objet créé , la manipulation des polygones/point arêtes, (extrusion,rotation,mouvement )
en l'etat, je ne pense pas qu'il soit possible de se creer un modeleur sous Ogre ...
mais peut etre je me trompe due a mon ignorance des meshs.....

de plus , l'utilisation d'un simple cube par exemple pour en faire un element de dessin
allourdit tres rapidement tout le moteur 3d ... j'ai pourtant un ordi veloce ...

sous 3Dreams /3dmotion je pouvais utiliser une ligne faite de cube/sphere/polygone
je ne crois pas ça possible en l'etat avec Ogre/Purebasic

bref, ça donne pas vraiment envie d'experimenter la 3D sous Purebasic je trouve...
je sent que je vais ressortir mon Darkbasic :mrgreen: :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Image to scene 3d - v2

Message par falsam »

Zorro a écrit :je pense quand meme qu'il nous manque vraiment énormément de choseen 3D ogre avec Purebasic ....
Parce que tu ne sais pas utiliser.
Zorro a écrit :’édition d'un objet créé , la manipulation des polygones/point arêtes, (extrusion,rotation,mouvement )
en l'etat, je ne pense pas qu'il soit possible de se creer un modeleur sous Ogre ...
mais peut etre je me trompe due a mon ignorance des meshs.....
J'aime quand tu te donnes des réponses.
Zorro a écrit :de plus , l'utilisation d'un simple cube par exemple pour en faire un element de dessin
allourdit tres rapidement tout le moteur 3d ... j'ai pourtant un ordi veloce ...
Va falloir te poser des questions :mrgreen:
Zorro a écrit :bref, ça donne pas vraiment envie d'experimenter la 3D sous Purebasic je trouve...
C'est pas graves tu sais :wink: :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Image to scene 3d - v2

Message par Zorro »

falsam a écrit :
Zorro a écrit :de plus , l'utilisation d'un simple cube par exemple pour en faire un element de dessin
allourdit tres rapidement tout le moteur 3d ... j'ai pourtant un ordi veloce ...
Va falloir te poser des questions :mrgreen:

ben non , si je compare avec un jeux comme minecraft , on est loin des 4000 cubes ...

de plus lorsque j'utilise des softs 3D (C4d , Blender,etc.. ) je vois bien qu'il y a une grosse difference de traitement


et je ne parle pas d'un soft comme ZBrush , dont la gestion des polygones est indécente !
je sais bien qu'on peut ne pas afficher des cubes non present a l'ecran
mais serieux, si tu as deja utilisé des softs 3d , (voir des jeux) , tu vois forcement une sacres difference avec Ogre sous Purebasic !

une simple copie de cube sous Blender ou C4d , et tu vois la difference ... ça ne saccade pas ! meme une copie de 4000 cubes!

mais bon ...
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Guillot
Messages : 516
Inscription : jeu. 25/juin/2015 16:18

Re: Image to scene 3d - v2

Message par Guillot »

on peut faire des decors tres complexe, mais il ne faut pas depasser quelques centaines d'entités
je vois 2 façon de faire :
- mettre les entités dans une staticgeometry
- fusionner les entités
je penses que les entités doivent etre utiliseés pour les objets mobiles ou lorsqu'on a besoin gerer la physique (mais la aussi on peut les fusionner)

dans ton code "image to scene" remplace tes cubes par des spheres (avec une centaine de facettes) tu verra que ça ramera pas beaucoup plus, en tout cas, pas en proportion

pour fusionner les mesh j'ai une petite fonction AddMesh (modifié d'un code de falsam je crois) :

Code : Tout sélectionner

Procedure addvertex(px.f,py.f,pz.f, nx.f,ny.f,nz.f, u.f,v.f)
    MeshVertexPosition(px,py,pz)
    MeshVertexNormal(nx,ny,nz)
    MeshVertexTextureCoordinate(u,v)        
EndProcedure

Procedure AddMesh(mesho,Mesh,mat, NewX.f=0 , NewY.f=0, NewZ.f=0, ScaleX.f=1, ScaleY.f=1, ScaleZ.f=1, RotateX.f=0, RotateY.f=0, RotateZ.f=0)
  Protected Dim MeshDataV.PB_MeshVertex(0)
  Protected Dim MeshDataF.PB_MeshFace(0)
  Protected i,meshc
  meshc=CopyMesh(mesh,-1)
  TransformMesh(Meshc, NewX,NewY,NewZ, ScaleX,ScaleY,ScaleZ, RotateX,RotateY,RotateZ)
  GetMeshData(Meshc,0, MeshDataV(), #PB_Mesh_Vertex | #PB_Mesh_UVCoordinate| #PB_Mesh_Normal, 0, MeshVertexCount(Meshc, 0)-1)
  GetMeshData(Meshc,0, MeshDataF(), #PB_Mesh_Face, 0, MeshIndexCount(Meshc, 0)-1)
  FreeMesh(meshc)   
  AddSubMesh()
  For i=0 To ArraySize(MeshDataV())
    With MeshDatav(i)
      addvertex(\x,\y,\z,\NormalX,\NormalY,\NormalZ,\u,\v)
    EndWith
  Next     
  For i=0 To ArraySize(MeshDataF()) Step 3
    MeshFace(MeshDataF(i)\Index, MeshDataF(i+1)\Index,MeshDataF(i+2)\Index)
  Next
  If mat>=0:SetMeshMaterial(mesho, MaterialID(mat), SubMeshCount(mesho)-1):EndIf
EndProcedure
ce qui manque pour rejoindre les standards actuel en terme de détail, c'est la gestion LOD (level of détail) qui permet principalement de décliné les mesh dans des version moins détaillées, la camera selectionnant le niveau de detail du mesh en fonction de son eloignement
je m'occupe de ça des que j'ai finis les trucs en cours..
Répondre