Cube3D

Généralités sur la programmation 3D
Anonyme

Cube3D

Message par Anonyme »

Voici mon premier code en 3D! :D
J'ai toujours voulu faire un cube :D

j'ai repris un code en C que vous pouvez trouvez ici :http://membres.lycos.fr/heulin/3D/Plan3D.html

Code : Tout sélectionner

Structure World3D
x.f
y.f
z.f
EndStructure

Dim Point3D.World3D(8)
Dim Point2D.World3D(8)
Dim Sommet.World3D(8)

#Xoff = 512
#Yoff = 384
#Zoff = 250

Dim Matrice.f(3,3)

; /****************************************************************************/
; /* Rotation() : effectue la rotation des points Sommets -> Point3D           */
; /****************************************************************************/

Procedure Rotation(Xa.f,Ya.f,Za.f)


  matrice(0,0) = Cos(Za)*Cos(Ya)
  matrice(1,0) = Sin(Za)*Cos(Ya) 
  matrice(2,0) = -Sin(Ya)

  matrice(0,1) = Cos(Za)*Sin(Ya)*Sin(Xa) - Sin(Za)*Cos(Xa)
  matrice(1,1) = Sin(Za)*Sin(Ya)*Sin(Xa) + Cos(Xa)*Cos(Za)
  matrice(2,1) = Sin(Xa)*Cos(Ya)

  matrice(0,2) = Cos(Za)*Sin(Ya)*Cos(Xa) + Sin(Za)*Sin(Xa)
  matrice(1,2) = Sin(Za)*Sin(Ya)*Cos(Xa) - Cos(Za)*Sin(Xa) 
  matrice(2,2) = Cos(Xa)*Cos(Ya)
  
  
  For i = 0 To 7
    Point3D(i)\x = matrice(0,0)*Sommet(i)\x + matrice(1,0)*Sommet(i)\y + matrice(2,0)*Sommet(i)\z
    Point3D(i)\y = matrice(0,1)*Sommet(i)\x + matrice(1,1)*Sommet(i)\y + matrice(2,1)*Sommet(i)\z
    Point3D(i)\z = matrice(0,2)*Sommet(i)\x + matrice(1,2)*Sommet(i)\y + matrice(2,2)*Sommet(i)\z
  Next i  
  
EndProcedure


; /****************************************************************************/
; /* Projection() : projette en perspective les points après rotation.        */
; /****************************************************************************/


Procedure Projection()
For i = 0 To 7
 Point2D(i)\x=(Point3D(i)\x*256)/(Point3D(i)\z+#Zoff)+#Xoff;
 Point2D(i)\y=(Point3D(i)\y*256)/(Point3D(i)\z+#Zoff)+#Yoff;
Next i
EndProcedure


; /****************************************************************************/
; /* Initialiser() : initialise les coordonnees des sommets du cube           */
; /****************************************************************************/
Procedure Initialiser()

  Sommet(0)\x = -100 : Sommet(0)\y = -100 : Sommet(0)\z = -100
  Sommet(1)\x =  100 : Sommet(1)\y = -100 : Sommet(1)\z = -100
  Sommet(2)\x =  100 : Sommet(2)\y =  100 : Sommet(2)\z = -100
  Sommet(3)\x = -100 : Sommet(3)\y =  100 : Sommet(3)\z = -100
  Sommet(4)\x =  100 : Sommet(4)\y = -100 : Sommet(4)\z =  100
  Sommet(5)\x = -100 : Sommet(5)\y = -100 : Sommet(5)\z =  100
  Sommet(6)\x = -100 : Sommet(6)\y =  100 : Sommet(6)\z =  100
  Sommet(7)\x =  100 : Sommet(7)\y =  100 : Sommet(7)\z =  100

EndProcedure


Procedure ligne(a.l,b.l,couleur.l)
  LineXY(Point2D(a)\x,Point2D(a)\y,Point2D(b)\x,Point2D(b)\y,couleur);
EndProcedure


Procedure Update()
Static Couleur.l

Couleur = RGB(100,100,255)

 StartDrawing(ScreenOutput())
  For i = 0 To 7

; Circle(Point2D(i)\x,Point2D(i)\y,3,Couleur)
; 
; Locate(Point2D(i)\x,Point2D(i)\y) 
; DrawText(Str(i))
; 
; 
;  ligne(0,1,couleur)
;  ligne(1,2,couleur)
;  ligne(2,3,couleur)
;  ligne(3,0,couleur)
;  ligne(4,5,couleur)
;  ligne(5,6,couleur)
;  ligne(6,7,couleur)
;  ligne(7,4,couleur)
;  ligne(0,5,couleur)
;  ligne(1,4,couleur)
;  ligne(2,7,couleur)
;  ligne(3,6,couleur)


  Next i
 StopDrawing()
EndProcedure





InitSprite () :InitSprite3D() : InitKeyboard () : InitMouse () 
OpenScreen (1024,768,32, "" ) 



;Création de faces (sprite3D())

CreateSprite(0,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(0))
  Box(0,0,64,64,$82E67D)
   StopDrawing()
    CreateSprite3D(0,0)

CreateSprite(1,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(1))
  Box(0,0,64,64,$0552FA)
   StopDrawing()
    CreateSprite3D(1,1)

CreateSprite(2,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(2))
  Box(0,0,64,64,$FD0202)
   StopDrawing()
    CreateSprite3D(2,2)

CreateSprite(3,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(3))
  Box(0,0,64,64,$00FFFF)
   StopDrawing()
    CreateSprite3D(3,3)
    
 CreateSprite(4,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(4))
  Box(0,0,64,64,$FDFF02)
   StopDrawing()
    CreateSprite3D(4,4)   
    
 CreateSprite(5,64,64,#PB_Sprite_Texture)
 StartDrawing(SpriteOutput(5))
  Box(0,0,64,64,$B3FF4C)
   StopDrawing()
    CreateSprite3D(5,5)   

Initialiser()


Repeat 
ExamineKeyboard () : ExamineMouse() : ClearScreen (0,0,0)

Start3D()


Xangle.f + 0.01 
Yangle.f + 0.03
ZAngle.f + 0.01
  
Sprite3DQuality(1)


DisplaySprite3D(0,0,0)
DisplaySprite3D(1,0,0)
DisplaySprite3D(2,0,0)
DisplaySprite3D(3,0,0)
DisplaySprite3D(4,0,0)
DisplaySprite3D(5,0,0)



TransformSprite3D(0,Point2D(0)\x,Point2D(0)\Y,Point2D(1)\x,Point2D(1)\Y,Point2D(2)\x,Point2D(2)\Y,Point2D(3)\x,Point2D(3)\Y)
TransformSprite3D(1,Point2D(1)\x,Point2D(1)\Y,Point2D(4)\x,Point2D(4)\Y,Point2D(7)\x,Point2D(7)\Y,Point2D(2)\x,Point2D(2)\Y)
TransformSprite3D(2,Point2D(4)\x,Point2D(4)\Y,Point2D(5)\x,Point2D(5)\Y,Point2D(6)\x,Point2D(6)\Y,Point2D(7)\x,Point2D(7)\Y)
TransformSprite3D(3,Point2D(5)\x,Point2D(5)\Y,Point2D(0)\x,Point2D(0)\Y,Point2D(3)\x,Point2D(3)\Y,Point2D(6)\x,Point2D(6)\Y)
TransformSprite3D(4,Point2D(5)\x,Point2D(5)\Y,Point2D(4)\x,Point2D(4)\Y,Point2D(1)\x,Point2D(1)\Y,Point2D(0)\x,Point2D(0)\Y)
TransformSprite3D(5,Point2D(3)\x,Point2D(3)\Y,Point2D(2)\x,Point2D(2)\Y,Point2D(7)\x,Point2D(7)\Y,Point2D(6)\x,Point2D(6)\Y)

Rotation(Xangle,Yangle,Zangle)
 Projection()
  Update()


Stop3D()
FlipBuffers () 
Until KeyboardPushed ( #PB_Key_Escape ) 
C'est pas du très propres mais il y a de bonne base de 3D
@++ :wink:
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Maintenant il faut en mettre plein l'écran de toutes les tailles :lol:
Mal de mer assuré :D
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

il n'y a pas de facettes sur ton rubisk cube 8)
Anonyme

Message par Anonyme »

Je cherche de quelle facon je pourrais calculer les sommets d'une sphère
Je n'arrive pas trop à mettre en pratique une procedure qui automatise
les coordonées des sommets. car les saisirs à la main... :?
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Ta essayer avec les cos et sin.
Mais je sais pas comment faire avec.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Cpl.Bator a écrit :Je cherche de quelle facon je pourrais calculer les sommets d'une sphère
Je n'arrive pas trop à mettre en pratique une procedure qui automatise
les coordonées des sommets. car les saisirs à la main... :?

Code : Tout sélectionner

; Comtois le 03/12/2005
; Pb 3.94 et Lib 3D beta (Ogre 1.03)

;-Constantes
;/ Ecran
#ScreenWidth = 800 
#ScreenHeight = 600
#ScreenDepth = 32
#PB_Mesh_Vertex       = 1 << 0
#PB_Mesh_Color        = 1 << 1
#PB_Mesh_Normal       = 1 << 2
#PB_Mesh_UVCoordinate = 1 << 3
#PB_Mesh_Face         = 1 << 4
;{- 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
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "M3D_Matrix3D" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
;}

Add3DArchive("", #PB_3DArchive_FileSystem)

Structure Vertex
	px.f
	py.f
	pz.f
	nx.f
	ny.f
	nz.f
	
	cr.f
	cg.f
	cb.f
	
	U.f
	V.f
EndStructure

Structure Facette
	P1.Vertex
	P2.vertex
	P3.Vertex
	P4.Vertex
EndStructure
Structure FTriangle
	f1.w
 	f2.w
 	f3.w
EndStructure
Structure Face
	f1.w
 	f2.w
 	f3.w
 	f4.w
 	f5.w
 	f6.w 
EndStructure	
ProcedureDLL CreateMeshSphere(No,m,p)
	;m = méridien 
	;p = parallèle
	;Le rayon est égal à 1 .
	
	If m<3 Or p<2 	
		ProcedureReturn 0
	EndIf
	NbSommet=2+((m+1)*p) 
	*Mem=AllocateMemory(SizeOf(Vertex)*Nbsommet)
	For i=0 To m
		theta.f =i*3.14159*2.0/m
		ctheta.f=Cos(theta)
		stheta.f=Sin(theta)
		For j=1 To p
			alpha.f =j*3.14159/(p+1)
			calpha.f =Cos(alpha)
			salpha.f=Sin(alpha)
			
			*PtrV.Vertex = *Mem + SizeOf(Vertex) * ((i*p) + (j-1))
			*PtrV\px=salpha*ctheta
			*PtrV\py=salpha*stheta
			*PtrV\pz=calpha
			
			*PtrV\nx=0.0
			*PtrV\ny=0.0
			*PtrV\nz=0.0
					
			*PtrV\cr=1.0
			*PtrV\cg=1.0
			*PtrV\cb=1.0						
			
			*PtrV\u=Theta/(2.0*3.14159)
			*PtrV\v=alpha/3.14159

		Next j
	Next i	
	*PtrV.Vertex = *Mem + SizeOf(Vertex) * ((m+1)*p)
	;Pole sud  
	*PtrV\px=0
	*PtrV\py=0	  
	*PtrV\pz=-1
	*PtrV\nx=0.0
	*PtrV\ny=0.0
	*PtrV\nz=0.0
			
	*PtrV\cr=1.0
	*PtrV\cg=1.0
	*PtrV\cb=1.0						
	
	*PtrV\u=0
	*PtrV\v=0
	*PtrV + SizeOf(Vertex)
	;Pole nord
	*PtrV\px=0
	*PtrV\py=0	  
	*PtrV\pz=1
	*PtrV\nx=0.0
	*PtrV\ny=0.0
	*PtrV\nz=0.0
			
	*PtrV\cr=1.0
	*PtrV\cg=1.0
	*PtrV\cb=1.0						
	
	*PtrV\u=0
	*PtrV\v=0
	
	;Les facettes
	NbTriangle=2*m*p
	*MemF=AllocateMemory(SizeOf(FTriangle)*2*m*p)
	*PtrF.FTriangle=*MemF
	For i=0 To m-1
		For j=1 To p-1
			*PtrF\f1=((i + 1) * p) + j 
			*PtrF\f2=((i + 1) * p) + (j - 1)
			*PtrF\f3=(i * p) + (j - 1)
			*PtrF + SizeOf(FTriangle)
			*PtrF\f1=i * p + j 
			*PtrF\f2=((i + 1) * p) + j 
			*PtrF\f3=(i * p) + (j - 1)
			*PtrF + SizeOf(FTriangle)
		Next j		
	Next i
	
	
	For i=0 To m-1
		*PtrF\f3=(m + 1) * p + 1
		*PtrF\f2=(i + 1) * p  
		*PtrF\f1=i * p  
		*PtrF + SizeOf(FTriangle)
	Next i		
		
	For i=0 To m-1
		*PtrF\f3=(m + 1) * p 
		*PtrF\f2=i * p + (p - 1)  
		*PtrF\f1=(i + 1) * p + (p - 1)  
		*PtrF + SizeOf(FTriangle)
	Next i		
	

    If CreateMesh(No)
		Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color  
		SetMeshData(No,Flag         ,*Mem,NbSommet)
		SetMeshData(No,#PB_Mesh_face,*MemF,NbTriangle)
		ProcedureReturn 1
	Else
		ProcedureReturn 0	
	EndIf
	
EndProcedure	


CreateMeshSphere(0,15,13)
CreateTexture(0,128, 128) 
StartDrawing(TextureOutput(0))
  Box(0,0,TextureWidth(0),TextureHeight(0),RGB(0,100,220))
StopDrawing()  

;-Matière
CreateMaterial(0,TextureID(0))

CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,60,60,60)

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-200)
CameraRenderMode(0,#PB_Camera_Wireframe)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))



;- Light
AmbientColor(RGB(185,185,185))
CreateLight(0,RGB(255,255,255))
Repeat
	ClearScreen(0,0,0)
	RotateEntity(0,0.5,0.5,0.5)
  	RenderWorld()
  	FlipBuffers()
	ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 
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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Mais il travaille avec des quadrilatères, pas des triangles...

Dri
Anonyme

Message par Anonyme »

@Dri, les deux sont bons.
si tu regarde bien mon code tu verras que Sommets(0,1,2,3) Correspond a une face, Sommet(0,2,3) à un triangle de la face, & (1,2,3) à l'autre triangle.

@Comtois , Merci je vais étudier cela.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Dr. Dri a écrit :Mais il travaille avec des quadrilatères, pas des triangles...

Dri
Ben il mettra des triangles , ça lui changera les idées :)

sinon c'est des facettes , chaque facette est constituée de deux triangles .
il regroupe deux triangles pour constituer un quadrilatère.


[EDIT]

Ben voila c'est confirmé, les triangles conviennent :)
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.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

comtois a écrit :Ben il mettra des triangles , ça lui changera les idées :)
Je disais ca parce qu'il utilise les Sprite3D

Dri ;)
Anonyme

Message par Anonyme »

j'ai juste utiliser les sprites 3d car ils permettent une déformation grace à leurs sommets, j'ai pas encore fait une fonction de remplissage de polygones, ni le z-buffer pour trier & cacher les facettes.
En revanche , le code de comtois est pas simple à étudier ^^
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Cpl.Bator a écrit :En revanche , le code de comtois est pas simple à étudier ^^
Oui ça manque de commentaire :)

Bon je vais essayer d'expliquer un peu .

la première partie consiste à calculer les sommets ou vertices ou les points si tu préfères.La postion de chaque point est stocké dans un tableau à une dimension

Code : Tout sélectionner

 NbSommet=2+((m+1)*p)
 *Mem=AllocateMemory(SizeOf(Vertex)*Nbsommet)
Dans la structure Vertex il y a des choses dont tu n'as pas besoin , comme

Code : Tout sélectionner

         *PtrV\nx=0.0
         *PtrV\ny=0.0
         *PtrV\nz=0.0
               
         *PtrV\cr=1.0
         *PtrV\cg=1.0
         *PtrV\cb=1.0       
C'est pour le calcul des normales et de la couleur.D'ailleurs dans cet exemple , je ne l'utilise pas non plus.

Bref tu trouves la position de chaque point dans

Code : Tout sélectionner

         *PtrV\px
         *PtrV\py
         *PtrV\pz
Maintenant comment reconstituer un triangle avec ça ?
En t'aidant de la suite du code , le calcul des facettes.
Les facettes sont constituées de 2 triangles , et les pôles Nord et Sud de triangles ( les calottes qui ferment la sphère)
Bref il n'y a que des triangles et ils sont stockés dans un autre tableau à une dimension.Je pense que c'est ce tableau que tu devras exploiter.

Code : Tout sélectionner

   ;Les facettes
   NbTriangle=2*m*p
   *MemF=AllocateMemory(SizeOf(FTriangle)*2*m*p)
Le calcul des facettes :

Code : Tout sélectionner

   *PtrF.FTriangle=*MemF
   For i=0 To m-1
      For j=1 To p-1
         *PtrF\f1=((i + 1) * p) + j
         *PtrF\f2=((i + 1) * p) + (j - 1)
         *PtrF\f3=(i * p) + (j - 1)
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1=i * p + j
         *PtrF\f2=((i + 1) * p) + j
         *PtrF\f3=(i * p) + (j - 1)
         *PtrF + SizeOf(FTriangle)
      Next j      
   Next i
on retrouve les deux triangles.
Premier Triangle
*PtrF\f1=((i + 1) * p) + j
*PtrF\f2=((i + 1) * p) + (j - 1)
*PtrF\f3=(i * p) + (j - 1)
SEcond Triangle
*PtrF\f1=i * p + j
*PtrF\f2=((i + 1) * p) + j
*PtrF\f3=(i * p) + (j - 1)
ça correspond à un index sur le tableau des vertices calculés précédemment .
Exemple Pour i=0 et j=1 avec p = 30,Le premier triangle sera
*PtrF\f1=((0 + 1) * p) + 1
*PtrF\f2=((0 + 1) * p) + (1 - 1)
*PtrF\f3=(0 * p) + (1 - 1)
*PtrF\f1=p+1
*PtrF\f2=p
*PtrF\f3=0
On obtient
*PtrF\f1=31
*PtrF\f2=30
*PtrF\f3=0
Et ensuite pour connaitre la position du point 31
*PtrV.Vertex = *Mem + SizeOf(Vertex) * 31
Pour le point 30
*PtrV.Vertex = *Mem + SizeOf(Vertex) * 30
Et ainsi de suite

Le calcul des pôles , c'est des triangles

Code : Tout sélectionner

   ;Pole 
   For i=0 To m-1
      *PtrF\f3=(m + 1) * p + 1
      *PtrF\f2=(i + 1) * p 
      *PtrF\f1=i * p 
      *PtrF + SizeOf(FTriangle)
   Next i      
   ;Pole   
   For i=0 To m-1
      *PtrF\f3=(m + 1) * p
      *PtrF\f2=i * p + (p - 1) 
      *PtrF\f1=(i + 1) * p + (p - 1) 
      *PtrF + SizeOf(FTriangle)
   Next i       
J'espère que je n'ai pas trop raconté de bêtises , il est tard :)
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai supprimé ce qui ne servait à rien dans la structure Vertex
et cette fois ci j'utilise un tableau , c'est la même chose que précédemment.

Tu ne devrais avoir besoin que du tableau Sommets() , et ensuite pour construire tes triangles tu calcules les index comme dans le calcul des facettes , tu n'as peut-être pas besoin de stocker les index , tu peux construire tes triangles au fur et à mesure.

Code : Tout sélectionner

; Comtois le 03/12/2005
; Pb 3.94 et Lib 3D beta (Ogre 1.03)

;-Constantes
;/ Ecran
#ScreenWidth = 800
#ScreenHeight = 600
#ScreenDepth = 32
#PB_Mesh_Vertex       = 1 << 0
#PB_Mesh_Color        = 1 << 1
#PB_Mesh_Normal       = 1 << 2
#PB_Mesh_UVCoordinate = 1 << 3
#PB_Mesh_Face         = 1 << 4
;{- 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
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "M3D_Matrix3D" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
;}

Add3DArchive("\", #PB_3DArchive_FileSystem)

Structure Vertex
   px.f
   py.f
   pz.f
   U.f
   V.f
EndStructure

Structure Facette
   P1.Vertex
   P2.vertex
   P3.Vertex
   P4.Vertex
EndStructure
Structure FTriangle
   f1.w
    f2.w
    f3.w
EndStructure
Structure Face
   f1.w
    f2.w
    f3.w
    f4.w
    f5.w
    f6.w
EndStructure   
ProcedureDLL CreateMeshSphere(No,m,p)
   ;m = méridien
   ;p = parallèle
   ;Le rayon est égal à 1 .
   
   If m<3 Or p<2    
      ProcedureReturn 0
   EndIf
   NbSommet=2+((m+1)*p)
   Dim Sommets.Vertex(NbSommet-1)
   For i=0 To m
      theta.f =i*3.14159*2.0/m
      ctheta.f=Cos(theta)
      stheta.f=Sin(theta)
      For j=1 To p
         alpha.f =j*3.14159/(p+1)
         calpha.f =Cos(alpha)
         salpha.f=Sin(alpha)
         Index = (i*p) + (j-1)
         Sommets(Index)\px = salpha*ctheta
         Sommets(Index)\py = salpha*stheta
         Sommets(Index)\pz = calpha
         Sommets(Index)\u = Theta/(2.0*3.14159)
         Sommets(Index)\v = alpha/3.14159

      Next j
   Next i   
   Index = (m+1)*p
   ;Pole sud 
   Sommets(Index)\px=0
   Sommets(Index)\py=0    
   Sommets(Index)\pz=-1
   Sommets(Index)\u=0
   Sommets(Index)\v=0

   Index + 1
   ;Pole nord
   Sommets(Index)\px=0
   Sommets(Index)\py=0    
   Sommets(Index)\pz=1
   Sommets(Index)\u=0
   Sommets(Index)\v=0
   
   ;Les facettes
   NbTriangle=2*m*p
   *MemF=AllocateMemory(SizeOf(FTriangle)*2*m*p)
   *PtrF.FTriangle=*MemF
   For i=0 To m-1
      For j=1 To p-1
         *PtrF\f1=((i + 1) * p) + j
         *PtrF\f2=((i + 1) * p) + (j - 1)
         *PtrF\f3=(i * p) + (j - 1)
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1=i * p + j
         *PtrF\f2=((i + 1) * p) + j
         *PtrF\f3=(i * p) + (j - 1)
         *PtrF + SizeOf(FTriangle)
      Next j      
   Next i
   
   
   For i=0 To m-1
      *PtrF\f3=(m + 1) * p + 1
      *PtrF\f2=(i + 1) * p 
      *PtrF\f1=i * p 
      *PtrF + SizeOf(FTriangle)
   Next i      
      
   For i=0 To m-1
      *PtrF\f3=(m + 1) * p
      *PtrF\f2=i * p + (p - 1) 
      *PtrF\f1=(i + 1) * p + (p - 1) 
      *PtrF + SizeOf(FTriangle)
   Next i      
   

    If CreateMesh(No)
      Flag = #PB_Mesh_Vertex |  #PB_Mesh_UVCoordinate 
      SetMeshData(No,Flag         ,Sommets(),NbSommet)
      SetMeshData(No,#PB_Mesh_face,*MemF,NbTriangle)
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
   
EndProcedure   


CreateMeshSphere(0,15,13)
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0,0,TextureWidth(0),TextureHeight(0),RGB(0,100,220))
StopDrawing() 

;-Matière
CreateMaterial(0,TextureID(0))

CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,60,60,60)

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-200)
CameraRenderMode(0,#PB_Camera_Wireframe)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))



;- Light
AmbientColor(RGB(185,185,185))
CreateLight(0,RGB(255,255,255))
Repeat
   ClearScreen(0,0,0)
   RotateEntity(0,0.5,0.5,0.5)
     RenderWorld()
     FlipBuffers()
   ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape) 
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.
Anonyme

Message par Anonyme »

Merci Comtois, je part Lundi 3 à 4 semaine, donc j'étudirais cela à mon retour, merci encore.

@+
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Cpl.Bator
Tu m'as donné envie de reprendre mon T3D (Triangle3D) ^^
Cette fois je vais le faire avec des Sprite3D ^^

Dri :D
Répondre