Astroide 3D
Publié : mar. 02/mai/2006 22:27
un petit dernier et je vais me coucher 
y'aurait moyen de faire du morphisme entre le coquillage et l'astroide ,c'est la même construction ...

y'aurait moyen de faire du morphisme entre le coquillage et l'astroide ,c'est la même construction ...
Code : Tout sélectionner
;Comtois 04/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$ = "Astroide 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
#E = 2.71828182
Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Global meridien.l
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)
2 * Cos(u) * Cos(u) * Cos(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CY(u,v)
2 * Sin(u) * Sin(u) * Sin(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CZ(u,v)
2 * Sin(v) * Sin(v) * 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 CreateMeshAstroide()
Define.l k, p, NbSommet, NbTriangle
Define.f b, 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
k = 10
b.f = 0.49268
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
NbTriangle = 12000
*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 = $318CE7
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
CreateMeshAstroide()
;-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,80,80,80)
;-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)