Page 1 sur 1

Cône 3D

Publié : lun. 01/mai/2006 8:50
par comtois
Pour un cône bien pointu, mettre le paramètre rt (rayon de troncature) à zéro.
;CreateMeshCone(meridien,2,2,0)
Le mieux c'est de faire une autre fonction pour un cône pointu,il y a moins de sommets et moins de triangles.Je la ferai à l'occasion.

Code : Tout sélectionner

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


Resultat = MessageRequester("Cone 3D","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
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf

If Fullscreen 
  OpenScreen(800,600,32,"Cone 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Cone 3D",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

Macro MaCouleur(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro


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

meridien=90

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

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

Procedure CreateMeshCone(m, rb.f, h.f, rt.f)
   ;m = méridien
   ;h = hauteur
   ;rb = Rayon de la base
   ;rt = rayon troncature (haut du cône)
   
   ;Les normales sont calculées pour un cône :
   ;rb = 2
   ;h  = 2   
   ;rt = 1

   ;Pour un cône plus général , il faut éventuellement utiliser la pondération par les angles 
   
   If m<3 Or h < 0 Or rb < 0 Or rt < 0
      ProcedureReturn 0
   EndIf


   NbSommet = 4*(m+1)+2
   *VBuffer = AllocateMemory(SizeOf(Vertex)*Nbsommet)
   *PtrV.Vertex = *VBuffer
   
   ;Sommet en bas du cone
   Coul = $FF ; Pas utilisé dans cette démo
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rb * Cos(theta)
      *PtrV\py = 0
      *PtrV\pz = rb * Sin(theta)
      *PtrV\nx = *PtrV\px * 4
      *PtrV\ny = 4 - *PtrV\py
      *PtrV\nz = *PtrV\pz * 4 
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 0
      *PtrV + SizeOf(Vertex)
   Next i   
   
   ;Sommet en haut du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rt * Cos(theta)
      *PtrV\py = h
      *PtrV\pz = rt * Sin(theta)
      *PtrV\nx = *PtrV\px * 4
      *PtrV\ny = 4 - *PtrV\py
      *PtrV\nz = *PtrV\pz * 4 
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
      
   ;Sommet face bas du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rb * Cos(theta)
      *PtrV\py = 0
      *PtrV\pz = rb * Sin(theta)
      *PtrV\nx = 0
      *PtrV\ny = -1
      *PtrV\nz = 0
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
             
   ;Sommet face haut du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rt * Cos(theta)
      *PtrV\py = h
      *PtrV\pz = rt * Sin(theta)
      *PtrV\nx = 0
      *PtrV\ny = 1
      *PtrV\nz = 0
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
   
   ;Centre bas
   *PtrV\px = 0
   *PtrV\py = 0
   *PtrV\pz = 0
   *PtrV\nx = 0
   *PtrV\ny = -1
   *PtrV\nz = 0
   *PtrV\couleur = Coul
   *PtrV\u = 0.5
   *PtrV\v = 0.5
   *PtrV + SizeOf(Vertex)

   ;Centre haut
    *PtrV\px = 0
   *PtrV\py = h
   *PtrV\pz = 0
   *PtrV\nx = 0
   *PtrV\ny = 1
   *PtrV\nz = 0
   *PtrV\couleur = Coul
   *PtrV\u = 0.5
   *PtrV\v = 0.5
   
   
   ;Les facettes
   NbTriangle = 4*m
   *IBuffer=AllocateMemory(SizeOf(FTriangle)*NbTriangle)
   *PtrF.FTriangle=*IBuffer
   
   For i=0 To m-1
      
      *PtrF\f3=i
      *PtrF\f2=i + 1
      *PtrF\f1=m + i + 2
      *PtrF + SizeOf(FTriangle)
      *PtrF\f1=i 
      *PtrF\f3=m + i + 2
      *PtrF\f2=m + i + 1
      *PtrF + SizeOf(FTriangle)
   Next i
   
   ;Face bas
   For i=0 To m-1
      *PtrF\f1= 4 * m + 4
      *PtrF\f2= 2 * m + 2 + i
      *PtrF\f3= 2 * m + 3 + i
      *PtrF + SizeOf(FTriangle)
   Next i      
   
   ;Face Haut   
   For i=0 To m-1
      *PtrF\f1= 4 * m + 5
      *PtrF\f3= 3 * m + 3 + i
      *PtrF\f2= 3 * m + 4 + i
      *PtrF + SizeOf(FTriangle)
   Next i      

 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
;CreateMeshCone(meridien,2,2,0)
CreateMeshCone(meridien,2,2,1)

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

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


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

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


;-Light
AmbientColor(RGB(105,105,105))
CreateLight(0,RGB(255,255,55),EntityX(0)+150,EntityY(0),EntityZ(0))
CreateLight(1,RGB(55,255,255),EntityX(0)-150,EntityY(0),EntityZ(0))
CreateLight(2,RGB(55,55,255),EntityX(0),EntityY(0)+150,EntityZ(0))
CreateLight(3,RGB(255,55,255),EntityX(0),EntityY(0)-150,EntityZ(0))
pas = 0.8
Repeat
   ;ClearScreen(0)
   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) 

Publié : lun. 01/mai/2006 9:17
par bernard13
trop fort comtois
tu es le meilleur en 3D de ce forum
je t'admire beaucoup