Astroide 3D

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Astroide 3D

Message par comtois »

un petit dernier et je vais me coucher :)

y'aurait moyen de faire du morphisme entre le coquillage et l'astroide ,c'est la même construction ...

Code : Tout sélectionner

;Comtois 04/05/06
;PB4.0 Beta 11

;Site intéressant pour choisir une couleur
;http://pourpre.com/chroma/dico.php?typ=alpha

;Pour obtenir d'autres formes
;http://www.mathcurve.com/surfaces/surfaces.shtml

Texte$ = "Astroide 3D"

Resultat = MessageRequester(Texte$,"Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6     
  FullScreen=1
Else           
  FullScreen=0
EndIf

;- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
EndIf
   
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


If Fullscreen
   ExamineDesktops()
   Sx = DesktopWidth(0)
   Sy = DesktopHeight(0)
   Sd = DesktopDepth(0)
  OpenScreen(Sx, Sy,Sd, Texte$)
Else
  OpenWindow(0,0, 0, 800 , 600 ,Texte$,#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

#E = 2.71828182

Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Global meridien.l

Structure s_Vecteur
   x.f
   y.f
   z.f
EndStructure

Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   U.f
   V.f
EndStructure

Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure

Macro CX(u,v)
 2 * Cos(u) * Cos(u) * Cos(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro   CY(u,v)
2 * Sin(u) * Sin(u) * Sin(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CZ(u,v)
2 * Sin(v) * Sin(v) * Sin(v)
EndMacro

Macro vcross(N, x1, y1, z1, x2, y2, z2)
   N\x = (((y1) * (z2)) - ((z1) * (y2)))
   N\y = (((z1) * (x2)) - ((x1) * (z2)))
   N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro

Procedure CreateMeshAstroide()
   Define.l k, p, NbSommet, NbTriangle
   Define.f b, umin, umax, vmin, vmax, uiter, viter, uu, vv
   Define.f x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4
   Define.f nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4
   Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
   Define.s_Vecteur vn1, vn2, vn3, vn4
   
   k       = 10       
   b.f     = 0.49268 
   umin.f  = -#PI                
   umax.f  = #PI      
   vmin.f  = -#PI     
   vmax.f  =  #PI     
   uiter.f = 150               ;  nombre de pas en u
   viter.f = 40                ;  nombre de pas en v
   iu.f    = (umax-umin)/uiter ;   increment par pas
   iv.f    = (vmax-vmin)/viter ;

   NbSommet   = 24000   
   NbTriangle = 12000 
   *VBuffer = AllocateMemory(SizeOf(Vertex)    * NbSommet)
   *IBuffer = AllocateMemory(SizeOf(FTriangle) * NbTriangle)
   *PtrV.Vertex    = *Vbuffer
   *PtrF.FTriangle = *IBuffer
   uu = umin   
   p = 0
   ;Coul = Random($00FFFF) + $FF0000
   ;Coul = $12143F   
   ;Coul = $DB1702
   Coul = $318CE7
   While (uu<=umax)                     
      vv = vmin
      While (vv<=vmax)                     
         ;POINTS     
         x1=CX(uu,vv)
         y1=CY(uu,vv)
         z1=CZ(uu,vv)
         uu=uu+iu   
         x2=CX(uu,vv)
         y2=CY(uu,vv)
         z2=CZ(uu,vv)           
         vv=vv+iv
         x3=CX(uu,vv)
         y3=CY(uu,vv)
         z3=CZ(uu,vv)
         uu=uu-iu
         x4=CX(uu,vv)
         y4=CY(uu,vv)
         z4=CZ(uu,vv)
         vv=vv-iv
         ;NORMALS                 
         uu=uu+2*iu
         nx1=CX(uu,vv)
         ny1=CY(uu,vv)
         nz1=CZ(uu,vv)
         uu=uu-2*iu
         vv=vv+2*iv
         nx2=CX(uu,vv)
         ny2=CY(uu,vv)
         nz2=CZ(uu,vv)
         vv=vv-2*iv
         uu=uu-iu
         nx3=CX(uu,vv)
         ny3=CY(uu,vv)
         nz3=CZ(uu,vv)
         uu=uu+iu
         vv=vv-iv
         nx4=CX(uu,vv)
         ny4=CY(uu,vv)
         nz4=CZ(uu,vv)
         vv=vv+iv
         vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
         vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4)
         vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
         vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2)
         vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
         vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
         vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
         vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2)
         vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1)
         
         
         vn1\x = n5\x+n6\x+n8\x+n9\x   
         vn1\y = n5\y+n6\y+n8\y+n9\y
         vn1\z = n5\z+n6\z+n8\z+n9\z
         
         vn2\x = n4\x+n5\x+n7\x+n8\x   
         vn2\y = n4\y+n5\y+n7\y+n8\y
         vn2\z = n4\z+n5\z+n7\z+n8\z
           
         vn3\x = n1\x+n2\x+n4\x+n5\x   
         vn3\y = n1\y+n2\y+n4\y+n5\y
         vn3\z = n1\z+n2\z+n4\z+n5\z
         
         vn4\x = n2\x+n3\x+n5\x+n6\x   
         vn4\y = n2\y+n3\y+n5\y+n6\y
         vn4\z = n2\z+n3\z+n5\z+n6\z
 
         *PtrV\px = x1
         *PtrV\py = y1
         *PtrV\pz = z1
         *PtrV\nx = vn1\x
         *PtrV\ny = vn1\y
         *PtrV\nz = vn1\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
  
         *PtrV\px = x2
         *PtrV\py = y2
         *PtrV\pz = z2
         *PtrV\nx = vn2\x
         *PtrV\ny = vn2\y
         *PtrV\nz = vn2\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
         
         *PtrV\px = x3
         *PtrV\py = y3
         *PtrV\pz = z3
         *PtrV\nx = vn3\x
         *PtrV\ny = vn3\y
         *PtrV\nz = vn3\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)
                   
         *PtrV\px = x4
         *PtrV\py = y4
         *PtrV\pz = z4
         *PtrV\nx = vn4\x
         *PtrV\ny = vn4\y
         *PtrV\nz = vn4\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)   
       
         ;TRIANGLES     
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f3 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f3 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)
         
          p + 4

         vv = vv+iv
      Wend                 
      uu = uu+iu
   Wend   
   
     
   If CreateMesh(0,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
      SetMeshData(0,Flag         ,*VBuffer,NbSommet)
      SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle)
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
   
EndProcedure   


;-Mesh

CreateMeshAstroide()

;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()

;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,80,80,80)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))


;-Light
AmbientColor(RGB(75,75,75))
CreateLight(0,RGB(155,155,155),EntityX(0)+150,EntityY(0),EntityZ(0))

pas = 0.8
Repeat
   If fullscreen = 0
      While WindowEvent() : Wend
   EndIf
   Angle + Pas
   RotateEntity(0,angle,angle/2,-Angle)

   If ExamineKeyboard()
     If KeyboardReleased(#PB_Key_F1)
       CameraMode=1-CameraMode
       CameraRenderMode(0,CameraMode)
     EndIf
   EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Dernière modification par comtois le jeu. 04/mai/2006 20:10, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Celui-là il est quasi parfait à part un "scintillement" sur les arêtes :)

Un prog gratos de "morphing" :)
http://www.debugmode.com/winmorph/
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

@Comtois :

balèze 8O , on peut dire que tu es vachement prolifique, je ne dirais qu'un mot Image
Répondre