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

Soyez le premier à donner votre avis sur cette source.

Vue 3 648 fois - Téléchargée 712 fois

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

Ajouter un commentaire

Commentaires

Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
gaffe a mettre D3DDEVTYPE_HAL, passe pas systematiquement selon les postes...

de même, tentes de mettre D3DCREATE_HARDWARE_VERTEXPROCESSING avant D3DCREATE_SOFTWARE_VERTEXPROCESSING
cs_ShayW
Messages postés
3251
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46 -
Bonjour Zulrigh
Il y a des bugs
Click sur comand1 "automation errror.."
le debugger s'arrete à
Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Form1.Picture1.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dPP)

click sur command2
run time error 91
click sur command3
rien ne se passse
Donnes des noms plus significatif aux boutons

bonne prog
zulrigh
Messages postés
24
Date d'inscription
samedi 10 janvier 2009
Statut
Membre
Dernière intervention
7 juin 2014
-
Bonne idée oué !
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
précalcule les Sin, Cos et autres, inutile de les faire en Live.

de meme, utilises une constante pour PIV optimisera son utilisation.

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.