Exemple d'utilisation de directx - des boules "tournoyante"

Description

voila un éxemple : on crée des boules de façon très mathématique, sans utiliser les Meshes.

Le probléme c'est que les calculs sont affreusement long à faire, mais ne bloque pas le code, ni n'augmenter l'utilisation de la mémoire Ram (sauf au chargement .. et encore !)

Source / Exemple :


Public d As Single, e As Single, f As Single, z As Single, g As Single
Dim Mat(300, 2, 12), Mat2(300, 2, 12), Mat3(300, 2, 12), Mat4(300, 2, 12), Mat5(300, 2, 12)
Dim OrBiTes(1000, 2, 4), OComPte(4), OCompTe2(4)
Dim Pos(2, 5)
Public CentreX As Single, CentreZ As Single, CentreY As Single
Public CentreX1 As Single, CentreZ1 As Single, CentreY1 As Single
Public CentreX2 As Single, CentreZ2 As Single, CentreY2 As Single
Public CentreX3 As Single, CentreZ3 As Single, CentreY3 As Single
Public CentreX4 As Single, CentreZ4 As Single, CentreY4 As Single
Public PosPa, PosPb, PosPc, PosPd, PosA As Single

Private Sub Command1_Click()
If Not Init3D() Then Exit Sub
bActif = True
Rendu
End Sub

Private Sub Command3_Click()
Timer1.Enabled = False

End Sub

Private Sub Form_Load()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''le form load'''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''
    d = -2756
    e = 180.24
    f = 639
    g = 500
    angle = 37.64
    
    CentreX = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreX = CentreX * -1
    CentreZ = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreZ = CentreZ * -1
    
    CentreX1 = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreX1 = CentreX1 * -1
    CentreZ1 = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreZ1 = CentreZ1 * -1
    
    CentreX2 = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreX2 = CentreX2 * -1
    CentreZ2 = Rnd * 1600
    l = Int(Rnd)
    If l = 0 Then CentreZ2 = CentreZ2 * -1
    
    CentreY = Rnd * 800: CentreY1 = Rnd * 800: CentreY2 = Rnd * 800
    Pos(0, 0) = CentreX: Pos(0, 1) = CentreZ
    Pos(1, 0) = CentreX1: Pos(1, 1) = CentreZ1
    Pos(2, 0) = CentreX2: Pos(2, 1) = CentreZ2
    
    Pos(0, 2) = Int(Rnd * 120): Pos(1, 2) = Int(Rnd * 120): Pos(2, 2) = Int(Rnd * 120) 'distance au choix
    Pos(0, 3) = Int(Rnd * 360): Pos(1, 3) = Int(Rnd * 360): Pos(2, 3) = Int(Rnd * 360) 'angle au choix
    Pos(0, 4) = Int(Rnd * 4): Pos(1, 4) = Int(Rnd * 4): Pos(2, 4) = Int(Rnd * 4) 'position au choix
    Pos(0, 5) = Int(Rnd * 10): Pos(1, 5) = Int(Rnd * 10): Pos(2, 5) = Int(Rnd * 10) 'orientation
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

If KeyCode = 38 Then
d = d + Cos(angle) * 10
e = e + Sin(angle) * 10
End If

If KeyCode = 40 Then
d = d - Cos(angle) * 10
e = e - Sin(angle) * 10
End If

If KeyCode = 39 Then
angle = angle - 0.02
If angle <= 0 Then angle = angle + 360
End If
If KeyCode = 37 Then
angle = angle + 0.02
If angle >= 360 Then angle = angle - 360
End If

If KeyCode = 33 Then
f = f + 5
End If
If KeyCode = 34 Then
f = f - 5
End If

Label1.Caption = "d : " & d & "e : " & e & " f : " & f & "angle : " & angle
MatrIces d, f, e, angle
End Sub
Private Sub Form_Unload(Cancel As Integer)
Debug.Print "Fermeture en cours"
bActif = False
Rendu

End Sub
Private Sub Command2_Click()
    d = -2756
    e = 180.24
    f = 639
    g = 500
    angle = 37.64
    MatrIces d, f, e, angle
Call OrBite
Timer1.Enabled = True
CadreMat = False
End Sub
Private Sub OrBite()
Dim Rayon, Hauteur As Single, RayonG As Single, HauteurTotal As Single
Dim ComPte, angleR, Pi As Single, AnGleR2 As Single
Dim x As Single, y As Single, z As Single
Dim TaCc As Single, Nc As Single
Pi = 3.14159265
AnGleR2 = 0.05
angleR = 0
OComPte(0) = 0
Rayon = 700
y = 250
Do While angleR < 2 * Pi
x = Cos(angleR) * Rayon + 0
z = Sin(angleR) * Rayon + 0
angleR = angleR + AnGleR2
OrBiTes(OComPte(0), 0, 0) = x
OrBiTes(OComPte(0), 1, 0) = y
OrBiTes(OComPte(0), 2, 0) = z
MatriXligneS2 x, y, z, 0
OComPte(0) = OComPte(0) + 1
Loop

OComPte(0) = OComPte(0) - 1

AnGleR2 = 0.04
angleR = 0
OComPte(1) = 0
Rayon = 1200
y = 250
Do While angleR < 2 * Pi
x = Cos(angleR) * Rayon + 0
z = Sin(angleR) * Rayon + 0
angleR = angleR + AnGleR2

etc ..

Conclusion :


Le reste est dans le Zip

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.