Cône 3D
Publié : lun. 01/mai/2006 8:50
Pour un cône bien pointu, mettre le paramètre rt (rayon de troncature) à zéro.
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.;CreateMeshCone(meridien,2,2,0)
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)