Page 1 sur 1

Cylindre 3D

Publié : dim. 30/avr./2006 22:23
par comtois
Après la sphère , le cylindre. Pour le cône c'est presque la même chose.

Code : Tout sélectionner

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


Resultat = MessageRequester("Cylindre 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,"Cylindre 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Cylindre 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 CreateMeshCylindre(m,h.f)
	;m = méridien 
	;h = hauteur
	;Le rayon est égal à 1 .
	
	If m<3
		ProcedureReturn 0
	EndIf
	

	h2.f = h / 2.0
	NbSommet = 4*(m+1)+2 
	*VBuffer = AllocateMemory(SizeOf(Vertex)*Nbsommet)
	*PtrV.Vertex = *VBuffer
	
	;Sommet en bas du cylindre
   Coul = $FF ; Pas utilisé dans cette démo
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = -h2
		*PtrV\pz = Sin(theta)
 		*PtrV\nx = *PtrV\px
		*PtrV\ny = 0
		*PtrV\nz = *PtrV\pz
		*PtrV\couleur = Coul
		*PtrV\u = Theta / (2.0*#PI)
		*PtrV\v = 0
		*PtrV + SizeOf(Vertex)
	Next i	
	
	;Sommet en haut du cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = h2
		*PtrV\pz = Sin(theta)
	   *PtrV\nx = *PtrV\px
		*PtrV\ny = 0
		*PtrV\nz = *PtrV\pz
		*PtrV\couleur = Coul
		*PtrV\u = Theta / (2.0*#PI)
		*PtrV\v = 1
		*PtrV + SizeOf(Vertex)
	Next i
		
	;Sommet face bas du cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = -h2
		*PtrV\pz = 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 cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = h2
		*PtrV\pz = 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 = -h2
	*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 = h2
	*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
CreateMeshCylindre(meridien,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,120,30)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-200)
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é : dim. 30/avr./2006 22:50
par comtois
Une variante

Code : Tout sélectionner

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

Resultat = MessageRequester("Cylindre 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,"Cylindre 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Cylindre 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
Global *VBuffer,*IBuffer
Global meridien.l, CameraMode.l, Sens.l, Tps.l
meridien=3
pas = 0.8
Sens = 1
tps = ElapsedMilliseconds()

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 CreateMeshCylindre(m,h.f)
	;m = méridien 
	;h = hauteur
	;Le rayon est égal à 1 .
	
	If m<3
		ProcedureReturn 0
	EndIf
	

	h2.f = h / 2.0
	NbSommet = 4*(m+1)+2 
	*VBuffer = AllocateMemory(SizeOf(Vertex)*Nbsommet)
	*PtrV.Vertex = *VBuffer
	
	;Sommet en bas du cylindre
   Coul = $FF ; Pas utilisé dans cette démo
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = -h2
		*PtrV\pz = Sin(theta)
 		*PtrV\nx = *PtrV\px
		*PtrV\ny = 0
		*PtrV\nz = *PtrV\pz
		*PtrV\couleur = Coul
		*PtrV\u = Theta / (2.0*#PI)
		*PtrV\v = 0
		*PtrV + SizeOf(Vertex)
	Next i	
	
	;Sommet en haut du cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = h2
		*PtrV\pz = Sin(theta)
	   *PtrV\nx = *PtrV\px
		*PtrV\ny = 0
		*PtrV\nz = *PtrV\pz
		*PtrV\couleur = Coul
		*PtrV\u = Theta / (2.0*#PI)
		*PtrV\v = 1
		*PtrV + SizeOf(Vertex)
	Next i
		
	;Sommet face bas du cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = -h2
		*PtrV\pz = 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 cylindre
	For i = 0 To m
		theta.f =2*#PI*i/m
 		
 		*PtrV\px = Cos(theta)
		*PtrV\py = h2
		*PtrV\pz = 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 = -h2
	*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 = h2
	*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
CreateMeshCylindre(meridien,1)

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

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

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

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-200)
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))


Repeat
   ;ClearScreen(0)
   If fullscreen = 0
      While WindowEvent() : Wend 
   EndIf  
   
   If ElapsedMilliseconds()-tps> 1000
      CreateMeshCylindre(meridien,1)
      CreateEntity(0,MeshID(0),MaterialID(0))
      ScaleEntity(0,30,12,30)
      tps = ElapsedMilliseconds()
      meridien + sens
      If meridien > 15 Or meridien < 4
         Sens = - Sens
      EndIf
   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)