PureBasic

Forums PureBasic
Nous sommes le Ven 18/Oct/2019 20:29

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 
Auteur Message
 Sujet du message: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 11:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Juin/2015 16:18
Messages: 268
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:
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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 11:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8768
Très bon rendu sur certaines images.
Merci

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 12:42 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2090
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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 20:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
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:

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 21:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2090
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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Image to scene 3d - v2
MessagePosté: Lun 05/Mar/2018 22:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Juin/2015 16:18
Messages: 268
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:
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..


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye