Tore 3D

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

Tore 3D

Message par comtois »

Pour ceux qui aiment avoir Tore
ça devrait être le dernier de la série.

Code : Tout sélectionner

;Comtois 05/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$ = "Tore 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

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

aa = 3 ; Amusez vous à changer cette valeur
bb = 1 ; Amusez vous à changer cette valeur

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)
 (aa + bb * Cos(v)) * Cos(u) 
EndMacro
Macro   CY(u,v)
 (aa + bb * Cos(v)) * Sin(u) 
EndMacro
Macro CZ(u,v)
bb * 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 CreateMeshTore()
   Define.l p, NbSommet, NbTriangle
   Define.f 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
   
   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 ; uiter * viter * 4   
   NbTriangle = NbSommet / 2
   *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 = $7FDD4C
   Coul = $884DA7
   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

CreateMeshTore()

;-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,35,35,35)

;-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 sam. 06/mai/2006 7:03, modifié 3 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 »

En effet pour ceux qui sont en manque de vocabulaire pour les couleurs, c'est parfait 8)

mais ils ont aussi ces 2 outils qui peuvent être fort utliles

Le chromafiltre http://pourpre.com/outils/chromafiltre.php
pour aider à l'accord des couleurs: visualisez votre couleur sur une roue chromatique, trouvez des teintes qui s'accordent

et le chromographe http://pourpre.com/chromograf/
un ensemble d'outils en ligne pour manipuler la couleur et créer des dégradés
Est beau ce qui plaît sans concept :)
Speedy Galerie
Répondre