Physque pour Dreamotion3D

Généralités sur la programmation 3D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

OK je regarde cela. Pour les instructions de limites, tu ajoute a chque fois
une borne a la limite. Dans le cas de LimitPlane, tu définis les deux limites.

Sinon, pour la trame voici le code, les media employés sont ceux du packPhysX.

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"
  IncludeFile "d3dx9.pbi"
  IncludeFile "dreamotion3d.pbi"
  IncludeFile "PhysX.pbi"
  

; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l


  Global	*camera.CEntity
  Global Dim *roue.CEntity(4)
  Global	*font.CFont
  Global *caisse
  

  ;  Initialisation des différents modules
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
    End
  EndIf

  ; Initialise la fenêtre graphique
  DM_Graphics3D(800, 600, 32,  0, 1)
  ; Charge une font
  *font = DM_LoadFont("Arial",8 , 1)
  DM_SetColorText (*font, 198,198,198,255)
  DM_AmbiantLight(150,  150,  150)
  SetCurrentDirectory("media/")
  
  ;---------------------------------
  ; INIT DU MOTEUR PHYSIQUE
  ;---------------------------------
  NX_Init(*DM_d3dDev9)

  ;--------------------------------------------------------------
  ; PETITE LIGHT HISTOIRE DE ...
  ;--------------------------------------------------------------
  *light = DM_CreateLight(2, #Null)
  DM_LightRange(*light ,150)
  DM_LightAttenuation(*light, 1.0, 0.0, 0.0)
  DM_TranslateEntity(*light, 0,40,0)


  ;--------------------------------------------------------------
  ; set ground
  ;--------------------------------------------------------------
  *ter = DM_LoadEntity("land3.x", #Null, #False)
  DM_TranslateEntity(*ter, 0,20,0)
  NX_CreateStaticElement(*ter,10, 0)


  *caisse = DM_CreateCube()
  DM_ScaleMesh(*caisse, 5, 2, 8)
  NX_CreatePhysicBox(*caisse, 0,0,0,  1.0,0)
  
  For i = 0 To 3
    *roue(i) =  DM_CreateCylinder(16)
    DM_ScaleMesh(*roue(i), 2,2,0.25)
    DM_RotateMesh(*roue(i), 0,90,0)
  Next
  DM_TranslateEntity(*roue(0), 7,0,7) : NX_CreatePhysicMesh(*roue(0),  1,0)
  DM_TranslateEntity(*roue(1), 7,0,-7): NX_CreatePhysicMesh(*roue(1),  1,0)
  DM_TranslateEntity(*roue(2), -7,0,7): NX_CreatePhysicMesh(*roue(2),  1,0)
  DM_TranslateEntity(*roue(3), -7,0,-7): NX_CreatePhysicMesh(*roue(3),  1,0)


  ;---------------------------------------
  ;           Gestion des caméras
  ; ---------------------------------------
  *camera = DM_CreateCamera(#Null)
  DM_MoveEntity(*camera, -9,25, 37)
  DM_TurnEntity(*camera, 30,170, 0)
  DM_CameraClsColor(*camera, 25, 25, 25)


  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  ; si plein ecran, permet d'avoir la fleche
  ;change_curseur( #IDC_ARROW  )
  Repeat

  	ExamineKeyboard()
  	ExamineMouse() 
  	ShowCursor_(1)
  	If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
  	EndIf
  	

  	If KeyboardPushed(#PB_Key_U)
      NX_EntityAddForce(*roue(0), 0,0,10)
    EndIf
 
  	; Gestion de la caméra
  	If KeyboardPushed(#PB_Key_Up)
  	 	DM_MoveEntity(*camera, 0,0,4)
  	ElseIf KeyboardPushed(#PB_Key_Down) 
  	  DM_MoveEntity(*camera, 0,0,-4)
  	EndIf
  	If MouseButton(#PB_MouseButton_Left)
  		If flagXdown=0
  			omx = MouseX()
  			omy = MouseY()
  			flagXDown=11
  		Else
  			moy = MouseY()-omy
  			angley=(moy/5.0)
  			omy= MouseY()
  			mox = MouseX()-omx
  			anglex=(mox/5.0)
  			omx= MouseX()
  			DM_TurnEntity(*camera, angley,anglex,0)
  		EndIf
  	Else
  	 		flagXDown=0
    EndIf

  	; ---------------
  	;      Rendu
  	; ---------------
    ; mise a jour de la physique
	  NX_Update()
 	
  	DM_BeginScene()
  	  DM_RenderWorld()
  	DM_EndScene()

  Until Quit=1
  NX_Exit()
  DM_ClearGraphics()
  End
Vue que ce petit bout de code m'a permis de soulaver un bug, il faut recharger
le modulePhysX...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'ai une erreur
---------------------------
PureBasic
---------------------------
Line 63: NX_CreatePhysicMesh(): Incorrect number of parameters.
---------------------------
OK
---------------------------

Code : Tout sélectionner

NX_CreatePhysicMesh(*roue(0),  1,0)
[EDIT]
Vue que ce petit bout de code m'a permis de soulaver un bug, il faut recharger
le modulePhysX...
Je n'avais pas vu ce message , c'est peut-être ce bug ? :)
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.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Oui ... :wink:
Force et sagesse...
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Le meme code, mais avec un exemple de joint tout simple.
La touche U donne une vitesse angulaire au roue avant (heu enfin tout dépend
d'ou on se place)
et la touche 'I' tire la caisse vers sois...

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"
  IncludeFile "d3dx9.pbi"
  IncludeFile "dreamotion3d.pbi"
  IncludeFile "PhysX.pbi"
  

; Globales
Global	anglex.f, angley.f, flagXDown.w
Global	mox.f, omx.f, moy.l, omy.l


  Global	*camera.CEntity
  Global Dim *roue.CEntity(4)
  Global Dim *axis.CEntity(4)
  Global	*font.CFont
  Global *caisse
  Global	*joint.NxJoint


  ;  Initialisation des différents modules
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 
    End
  EndIf

  ; Initialise la fenêtre graphique
  DM_Graphics3D(800, 600, 32,  0, 1)
  ; Charge une font
  *font = DM_LoadFont("Arial",8 , 1)
  DM_SetColorText (*font, 198,198,198,255)
  DM_AmbiantLight(150,  150,  150)
  SetCurrentDirectory("media/")
  
  ;---------------------------------
  ; INIT DU MOTEUR PHYSIQUE
  ;---------------------------------
  NX_Init(*DM_d3dDev9)

  ;--------------------------------------------------------------
  ; PETITE LIGHT HISTOIRE DE ...
  ;--------------------------------------------------------------
  *light = DM_CreateLight(2, #Null)
  DM_LightRange(*light ,150)
  DM_LightAttenuation(*light, 1.0, 0.0, 0.0)
  DM_TranslateEntity(*light, 0,40,0)


  ;--------------------------------------------------------------
  ; set ground
  ;--------------------------------------------------------------
  *ter = DM_LoadEntity("land3.x", #Null, #False)
  DM_TranslateEntity(*ter, 0,20,0)
  NX_CreateStaticElement(*ter,10, 0)


  *caisse = DM_CreateCube()
  DM_ScaleMesh(*caisse, 4, 2, 8)
  DM_TranslateEntity(*caisse, 0,3,0)
  NX_CreatePhysicBox(*caisse, 0,0,0,  1.0,0)
  
  
  For i = 0 To 3
    *roue(i) =  DM_CreateCylinder(16)
    DM_ScaleMesh(*roue(i), 2,2,0.25)
    DM_RotateMesh(*roue(i), 0,90,0)
  Next
  DM_TranslateEntity(*roue(0), 7,0,7) : NX_CreatePhysicMesh(*roue(0),  1,0)
  DM_TranslateEntity(*roue(1), 7,0,-7): NX_CreatePhysicMesh(*roue(1),  1,0)
  DM_TranslateEntity(*roue(2), -7,0,7): NX_CreatePhysicMesh(*roue(2),  1,0)
  DM_TranslateEntity(*roue(3), -7,0,-7): NX_CreatePhysicMesh(*roue(3),  1,0)

  ;--------------------------------------------------------------
  ; create  joints Cylindrical
  ;--------------------------------------------------------------

  *joint = NX_CreateCylindricalJoint(*roue(0), *caisse , 7,0,7,  1,0,0)
  NX_AddLimitPlane(*joint, -1,0,0, 1,0,0)
  NX_AddLimitPlane(*joint, 1,0,0,  1.5,0,0)
  *joint = NX_CreateCylindricalJoint(*roue(1), *caisse , 7,0,-7,  1,0,0)
  NX_AddLimitPlane(*joint, -1,0,0, 1,0,0)
  NX_AddLimitPlane(*joint, 1,0,0,  1.5,0,0)
  *joint = NX_CreateCylindricalJoint(*roue(2), *caisse , -7,0,7,  1,0,0)
  NX_AddLimitPlane(*joint, -1,0,0, -0.5,0,0)
  NX_AddLimitPlane(*joint, 1,0,0,  -1.5,0,0)
  *joint = NX_CreateCylindricalJoint(*roue(3), *caisse , -7,0,-7,  1,0,0)
  NX_AddLimitPlane(*joint, -1,0,0, -0.5,0,0)
  NX_AddLimitPlane(*joint, 1,0,0,  -1.5,0,0)

  ;---------------------------------------
  ;           Gestion des caméras
  ; ---------------------------------------
  *camera = DM_CreateCamera(#Null)
  DM_MoveEntity(*camera, -9,25, 37)
  DM_TurnEntity(*camera, 30,170, 0)
  DM_CameraClsColor(*camera, 25, 25, 25)


  ; ---------------------------------------
  ;           Boucle principale
  ; ---------------------------------------
  ; si plein ecran, permet d'avoir la fleche
  ;change_curseur( #IDC_ARROW  )
  Repeat

  	ExamineKeyboard()
  	ExamineMouse() 
  	ShowCursor_(1)
  	If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
  	EndIf
  	

  	If KeyboardPushed(#PB_Key_U)
        NX_EntitySetAngularMomentum(*roue(0), 10,0,0)
        NX_EntitySetAngularMomentum(*roue(2), 10,0,0)
    EndIf
  	If KeyboardPushed(#PB_Key_I)
      NX_EntityAddForceAtLocalPos(*caisse, 0,0,102, 0,2,0)
    EndIf

 
  	; Gestion de la caméra
  	If KeyboardPushed(#PB_Key_Up)
  	 	DM_MoveEntity(*camera, 0,0,4)
  	ElseIf KeyboardPushed(#PB_Key_Down) 
  	  DM_MoveEntity(*camera, 0,0,-4)
  	EndIf
  	If MouseButton(#PB_MouseButton_Left)
  		If flagXdown=0
  			omx = MouseX()
  			omy = MouseY()
  			flagXDown=11
  		Else
  			moy = MouseY()-omy
  			angley=(moy/5.0)
  			omy= MouseY()
  			mox = MouseX()-omx
  			anglex=(mox/5.0)
  			omx= MouseX()
  			DM_TurnEntity(*camera, angley,anglex,0)
  		EndIf
  	Else
  	 		flagXDown=0
    EndIf

  	; ---------------
  	;      Rendu
  	; ---------------
    ; mise a jour de la physique
	  NX_Update()
 	
  	DM_BeginScene()
  	  DM_RenderWorld()
  	DM_EndScene()

  Until Quit=1
  NX_Exit()
  DM_ClearGraphics()
  End
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok j'ai repris ma voiture en prenant ton exemple, ça commence à ressembler à quelque chose, mais c'est loin d'être satisfaisant, et pis j'ai toujours rien compris aux paramètres des fonctions, je ne sais pas sur quoi on agit, à quoi ça correspond , si c'est du relatif, de l'absolu, bref, je suis largué.

Par exemple ça :

Code : Tout sélectionner

NX_CreateCylindricalJoint(*roue(0), *caisse , 7,0,7,  1,0,0)
J'ai remarqué que 7,0,7 ça correspond aussi à la position de la roue concernée, mais encore ? qu'est-ce que ça signifie ? qu'est-ce que ça représente ?

Dernière version
http://perso.orange.fr/comtois/sources/Voiture.zip
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.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Voici un exemple complet avec roue + suspensions. Manque plus qu'a simuler
la direction pour avoir un ensemble véhicule complet de base ...
Touche U pour la traction des roue avant, I pour tirer la caisse sinon

Code : Tout sélectionner

; Fichiers Include
IncludePath "Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
IncludeFile "PhysX.pbi"


; Globales
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l


Global *camera.CEntity
Global Dim *roue.CEntity(4)
Global Dim *axis.CEntity(4)
Global *font.CFont
Global *caisse
Global *joint.NxJoint
Global *joint2.NxJoint



; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf

; Initialise la fenêtre graphique
DM_Graphics3D(800, 600, 32, 0, 1)
; Charge une font
*font = DM_LoadFont("Arial",8 , 1)
DM_SetColorText (*font, 198,198,198,255)
DM_AmbiantLight(150, 150, 150)
SetCurrentDirectory("mediaPhysX/")

;---------------------------------
; INIT DU MOTEUR PHYSIQUE
;---------------------------------
NX_Init(*DM_d3dDev9)

;--------------------------------------------------------------
; PETITE LIGHT HISTOIRE DE ...
;--------------------------------------------------------------
*light = DM_CreateLight(3, #Null)

;--------------------------------------------------------------
; set ground
;--------------------------------------------------------------
*ter = DM_LoadEntity("land3.x", #Null, #False)
DM_TranslateEntity(*ter, 0,20,0)
NX_CreateStaticElement(*ter,10, 2)

*ter = DM_CreateSphere(4)
DM_ScaleMesh(*ter, 30,30,30)
DM_TranslateEntity(*ter, 0,-35,100)
NX_CreateStaticElement(*ter,10, 2)
*brush = DM_GetBrush(*ter)
DM_LoadTexture( DM_GetTexture(*brush), "grille1.bmp")

*caisse = DM_CreateCube()
DM_ScaleMesh(*caisse, 4, 2,
DM_TranslateEntity(*caisse, 0,3,0)
NX_CreatePhysicBox(*caisse, 0,0,0, 5000.0,0)


For i = 0 To 3
*roue(i) = DM_CreateCylinder(16)
DM_ScaleMesh(*roue(i), 2,2,0.25)
DM_RotateMesh(*roue(i), 0,90,0)
Next
DM_TranslateEntity(*roue(0), 6,0,7) : NX_CreatePhysicMesh(*roue(0), 400,2) : NX_EntitySetContact(*roue(0), *caisse, 0)
DM_TranslateEntity(*roue(1), 6,0,-7): NX_CreatePhysicMesh(*roue(1), 400,2) : NX_EntitySetContact(*roue(1), *caisse, 0)
DM_TranslateEntity(*roue(2), -6,0,7): NX_CreatePhysicMesh(*roue(2), 400,2) : NX_EntitySetContact(*roue(2), *caisse, 0)
DM_TranslateEntity(*roue(3), -6,0,-7): NX_CreatePhysicMesh(*roue(3), 400,2) : NX_EntitySetContact(*roue(3), *caisse, 0)


For i = 0 To 3
*axis(i) = DM_CreateSphere(8)
DM_ScaleMesh(*axis(i), 0.45,0.45, 0.45)
Next
DM_TranslateEntity(*axis(0), 4,0,7) : NX_CreatePhysicSphere(*axis(0), 0,400,0)
NX_EntitySetContact(*axis(0), *caisse, 0)
NX_EntitySetContact(*axis(0), *roue(0), 0)
DM_TranslateEntity(*axis(1), 4,0,-7): NX_CreatePhysicSphere(*axis(1), 0,400,0)
NX_EntitySetContact(*axis(1), *caisse, 0)
NX_EntitySetContact(*axis(1), *roue(1), 0)
DM_TranslateEntity(*axis(2), -4,0,7): NX_CreatePhysicSphere(*axis(2), 0,400,0)
NX_EntitySetContact(*axis(2), *caisse, 0)
NX_EntitySetContact(*axis(2), *roue(2), 0)
DM_TranslateEntity(*axis(3), -4,0,-7): NX_CreatePhysicSphere(*axis(3), 0,400,0)
NX_EntitySetContact(*axis(3), *caisse, 0)
NX_EntitySetContact(*axis(3), *roue(3), 0)

;--------------------------------------------------------------
; create joints
;--------------------------------------------------------------
;
*joint = NX_CreateRevoluteJointM(*roue(0), *axis(0) , 6,0,7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(0), *caisse , 5,0,7, 0,1,0)
NX_CreateSpring(*axis(0), *caisse, 4,0,7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(2), *axis(2) , -6,0,7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(2), *caisse , -5,0,7, 0,1,0)
NX_CreateSpring(*axis(2), *caisse, -4,0,7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(1), *axis(1) , 6,0,-7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(1), *caisse , 5,0,-7, 0,1,0)
NX_CreateSpring(*axis(1), *caisse, 4,0,-7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(3), *axis(3) , -6,0,-7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(3), *caisse , -5,0,-7, 0,1,0)
NX_CreateSpring(*axis(3), *caisse, -4,0,-7 , 0.1)


;---------------------------------------
; Gestion des caméras
; ---------------------------------------
*camera = DM_CreateCamera(#Null)
DM_MoveEntity(*camera, -9,25, 37)
DM_TurnEntity(*camera, 30,170, 0)
DM_CameraClsColor(*camera, 25, 25, 25)
; ---------------------------------------
; Boucle principale
; ---------------------------------------
Repeat

ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf


If KeyboardPushed(#PB_Key_U)
NX_EntitySetAngularMomentum(*roue(0), 5000,0,0)
NX_EntitySetAngularMomentum(*roue(2), 5000,0,0)
EndIf
If KeyboardPushed(#PB_Key_I)
NX_EntityAddForceAtLocalPos(*caisse, 0,0,50000, 0,2,0)
EndIf


; Gestion de la caméra
If KeyboardPushed(#PB_Key_Up)
DM_MoveEntity(*camera, 0,0,4)
ElseIf KeyboardPushed(#PB_Key_Down)
DM_MoveEntity(*camera, 0,0,-4)
EndIf
If MouseButton(#PB_MouseButton_Left)
If flagXdown=0
omx = MouseX()
omy = MouseY()
flagXDown=11
Else
moy = MouseY()-omy
angley=(moy/5.0)
omy= MouseY()
mox = MouseX()-omx
anglex=(mox/5.0)
omx= MouseX()
DM_TurnEntity(*camera, angley,anglex,0)
EndIf
Else
flagXDown=0
EndIf

; ---------------
; Rendu
; ---------------
; mise a jour de la physique
NX_Update()

DM_BeginScene()
DM_RenderWorld()
DM_EndScene()

Until Quit=1
NX_Exit()
DM_ClearGraphics()
End
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

les angles ne sont pas mis à jour , j'ai modifié ton code pour ajouter le suivi de la caméra et afficher

Code : Tout sélectionner

DM_DrawText(*font,0,0,StrF(DM_EntityYaw(*Caisse),1) + " " + StrF(DM_EntityPitch(*Caisse),1) + " " + StrF(DM_EntityRoll(*Caisse),1))
Toutes les valeurs restent à zéro, même si je monte le petit monticule, que je renverse la voiture.

Code : Tout sélectionner

; Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
IncludeFile "PhysX.pbi"


; Globales
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l


Global *camera.CEntity
Global Dim *roue.CEntity(4)
Global Dim *axis.CEntity(4)
Global *font.CFont
Global *caisse
Global *joint.NxJoint
Global *joint2.NxJoint

Macro NEW_X(x, Angle, Distance) 
  ((x) + Cos((Angle) * 0.0174533) * (Distance))
EndMacro

Macro NEW_Z(z, Angle, Distance)
  ((z) - Sin((Angle) * 0.0174533) * (Distance))
EndMacro

;- Declaration des procédures
Declare.f CurveValue(actuelle.f, Cible.f, P.f) 
Declare GestionCamera()

; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf

; Initialise la fenêtre graphique
DM_Graphics3D(800, 600, 32, 0, 1)
; Charge une font
*font = DM_LoadFont("Arial",8 , 1)
DM_SetColorText (*font, 198,198,198,255)
DM_AmbiantLight(150, 150, 150)
SetCurrentDirectory("medias/")

;---------------------------------
; INIT DU MOTEUR PHYSIQUE
;---------------------------------
NX_Init(*DM_d3dDev9)

;--------------------------------------------------------------
; PETITE LIGHT HISTOIRE DE ...
;--------------------------------------------------------------
*light = DM_CreateLight(3, #Null)

;--------------------------------------------------------------
; set ground
;--------------------------------------------------------------
*ter = DM_LoadEntity("land3.x", #Null, #False)
DM_TranslateEntity(*ter, 0,20,0)
NX_CreateStaticElement(*ter,10, 2)

*ter = DM_CreateSphere(4)
DM_ScaleMesh(*ter, 30,30,30)
DM_TranslateEntity(*ter, 0,-35,100)
NX_CreateStaticElement(*ter,10, 2)
*brush = DM_GetBrush(*ter)
DM_LoadTexture( DM_GetTexture(*brush), "grille1.bmp")

*caisse = DM_CreateCube()
DM_ScaleMesh(*caisse, 4, 2,8)
DM_TranslateEntity(*caisse, 0,3,0)
NX_CreatePhysicBox(*caisse, 0,0,0, 5000.0,0)


For i = 0 To 3
*roue(i) = DM_CreateCylinder(16)
DM_ScaleMesh(*roue(i), 2,2,0.25)
DM_RotateMesh(*roue(i), 0,90,0)
Next
DM_TranslateEntity(*roue(0), 6,0,7) : NX_CreatePhysicMesh(*roue(0), 400,2) : NX_EntitySetContact(*roue(0), *caisse, 0)
DM_TranslateEntity(*roue(1), 6,0,-7): NX_CreatePhysicMesh(*roue(1), 400,2) : NX_EntitySetContact(*roue(1), *caisse, 0)
DM_TranslateEntity(*roue(2), -6,0,7): NX_CreatePhysicMesh(*roue(2), 400,2) : NX_EntitySetContact(*roue(2), *caisse, 0)
DM_TranslateEntity(*roue(3), -6,0,-7): NX_CreatePhysicMesh(*roue(3), 400,2) : NX_EntitySetContact(*roue(3), *caisse, 0)


For i = 0 To 3
*axis(i) = DM_CreateSphere(8)
DM_ScaleMesh(*axis(i), 0.45,0.45, 0.45)
Next
DM_TranslateEntity(*axis(0), 4,0,7) : NX_CreatePhysicSphere(*axis(0), 0,400,0)
NX_EntitySetContact(*axis(0), *caisse, 0)
NX_EntitySetContact(*axis(0), *roue(0), 0)
DM_TranslateEntity(*axis(1), 4,0,-7): NX_CreatePhysicSphere(*axis(1), 0,400,0)
NX_EntitySetContact(*axis(1), *caisse, 0)
NX_EntitySetContact(*axis(1), *roue(1), 0)
DM_TranslateEntity(*axis(2), -4,0,7): NX_CreatePhysicSphere(*axis(2), 0,400,0)
NX_EntitySetContact(*axis(2), *caisse, 0)
NX_EntitySetContact(*axis(2), *roue(2), 0)
DM_TranslateEntity(*axis(3), -4,0,-7): NX_CreatePhysicSphere(*axis(3), 0,400,0)
NX_EntitySetContact(*axis(3), *caisse, 0)
NX_EntitySetContact(*axis(3), *roue(3), 0)

;--------------------------------------------------------------
; create joints
;--------------------------------------------------------------
;
*joint = NX_CreateRevoluteJointM(*roue(0), *axis(0) , 6,0,7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(0), *caisse , 5,0,7, 0,1,0)
NX_CreateSpring(*axis(0), *caisse, 4,0,7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(2), *axis(2) , -6,0,7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(2), *caisse , -5,0,7, 0,1,0)
NX_CreateSpring(*axis(2), *caisse, -4,0,7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(1), *axis(1) , 6,0,-7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(1), *caisse , 5,0,-7, 0,1,0)
NX_CreateSpring(*axis(1), *caisse, 4,0,-7 , 0.1)

*joint = NX_CreateRevoluteJointM(*roue(3), *axis(3) , -6,0,-7, 1,0,0)
*joint = NX_CreatePrismaticJoint(*axis(3), *caisse , -5,0,-7, 0,1,0)
NX_CreateSpring(*axis(3), *caisse, -4,0,-7 , 0.1)


;---------------------------------------
; Gestion des caméras
; ---------------------------------------
*camera = DM_CreateCamera(#Null)
DM_MoveEntity(*camera, -9,25, 37)
DM_TurnEntity(*camera, 30,170, 0)
DM_CameraClsColor(*camera, 25, 25, 25)
; ---------------------------------------
; Boucle principale
; ---------------------------------------
Repeat

ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf


If KeyboardPushed(#PB_Key_Up)
NX_EntitySetAngularMomentum(*roue(0), 5000,0,0)
NX_EntitySetAngularMomentum(*roue(2), 5000,0,0)
EndIf
If KeyboardPushed(#PB_Key_Down)
NX_EntityAddForceAtLocalPos(*caisse, 0,0,50000, 0,2,0)
EndIf

; ---------------
; Rendu
; ---------------
; mise a jour de la physique
NX_Update()
GestionCamera()


DM_BeginScene()
DM_RenderWorld()
DM_DrawText(*font,0,0,StrF(DM_EntityYaw(*Caisse),1) + " " + StrF(DM_EntityPitch(*Caisse),1) + " " + StrF(DM_EntityRoll(*Caisse),1))

DM_EndScene()

Until Quit=1
NX_Exit()
DM_ClearGraphics()
End

Procedure.f CurveValue(actuelle.f, Cible.f, P.f) 
	;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible 
  	Define.f Delta
  	Delta = Cible - actuelle 
  	If P > 1000.0 : P = 1000.0 : EndIf 
  	ProcedureReturn  (actuelle + ( Delta * P / 1000.0)) 
EndProcedure 

Procedure GestionCamera()
  Define.f Px, Py, Pz, Pv 
  Define.f x,y,z
  Static AngleCamera.f
  Pv = 25
  AngleCamera = CurveValue(AngleCamera, DM_EntityYaw(*Caisse) + 90, Pv) 
  Px = CurveValue(DM_EntityX(*Camera), NEW_X(DM_Entityx(*Caisse), AngleCamera, 80), Pv)
  Py = CurveValue(DM_EntityY(*Camera), DM_EntityY(*Caisse) + 20, Pv)
  Pz = CurveValue(DM_EntityZ(*Camera), NEW_Z(DM_EntityZ(*Caisse), AngleCamera, 80), Pv)
     
  DM_PositionEntity(*Camera, Px, Py, Pz)
  DM_PointEntity(*Camera, *Caisse)    
EndProcedure
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.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Oui, c'est normal, enfin si l'on peut dire. Le moteur physique ne travaille
en liaison avec le moteur graphique qu'a partir des matrices. Donc pour
récupérer les angles (par la methode d'Euler) j'ai les memes problèmes
que pour les pivots. Voila pourquoi les valeur sont a zero.

Si tu veux par contre essayer de les récuperer par la matrice, j'ai mis dans
le module a titre expérimental les fonction suivantes:

Code : Tout sélectionner

    DM_EntityEulerYaw.f(*ent.CEntity)
    DM_EntityEulerPitch.f(*ent.CEntity)
    DM_EntityEulerRoll.f(*ent.CEntity)
Elle retournes les fameux angles par la methode d'Euler, donc pas certains que
cela soit bon en toutes les circonstances, mais a essayer...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

mais il n'existe pas de fonction de directx pour faire le calcul ?
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.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Il y a des fonction qui permettent de faire certains des calculs.
En fait le soucis est qu'avec des angles de rotations, tu obtiens une matrice,
et quand, a partir de cette matrice tu veux récupérer les angle, tu ne
retombes pas sur tes pates systématiquement ...

Mais je travaille sur le truc, je finirais bien par trouver une solution...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

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.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Pour éviter ce genre de problème les rotations sont la plupart du temps calculées avec des Quaternions.

Les ordinateurs de contrôle en vol des avions utilisent cette technique pour les calculs parce que les calculs successifs de rotation avec des matrices finissent par générer trop d'erreur.

Faudrait faire une recherche plus approfondie sur le sujet.

A+
Guimauve
Anonyme

Message par Anonyme »

Les ordinateurs de contrôle en vol des avions utilisent cette technique pour les calculs parce que les calculs successifs de rotation avec des matrices finissent par générer trop d'erreur.
Avoir un glimbal lock avec un boeing a380 , ca doit pas être trop cool ^^

@comtois, je crois que dans les sources de mon embryon de moteur avec opengl, il y a une fonction qui fait ca, si mes souvenirs sont bons.

@++
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Avoir un glimbal lock avec un boeing a380 , ca doit pas être trop cool ^^
Il faut tout faire pour que ça n'arrive pas.

A+
Guimauve
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Merci pour vos conseil et lien. Je mate cela et je vois comment m'en sortir.
La j'ai fait un petit code simple. J'ai un cube sur lequel j'applique une rotation
sur les 3 axes, et je récupère les angles a partir de la matrice de transformation
pour les appliquer a un second cube. En théorie, je devrais obtenir les memes
rotations. Force est d'avouer que pour l'instant ce n'est pas le cas.
Alors je travaille mon truc...
Force et sagesse...
Répondre