
Dreamotion3D
-
- Messages : 1202
- Inscription : sam. 31/déc./2005 23:52
L'exemple PurePatator ne fonctionne pas comme mon exemple WaterWorld, il n'y a plus la marche arrière, on ne bloque plus la rotation en hauteur.
Alors je commence à chercher pourquoi, premier constat, pour gérer la rotation en hauteur je dois croiser les tests
Dans WaterWorld j'avais ça
Dans PurePatator , pour que ça fonctionne de la même façon je suis obligé de mettre ça :
Qu'est-ce qui a changé entre ces deux versions ?
Pour la marche arrière je n'ai pas encore regardé pourquoi ça ne marche plus, et je n'ai pas encore regardé pourquoi tu avais ajouté ça :
Qu'est-ce qui a changé ? je n'ai pas encore essayé de reprendre l'ancien code pour voir ce que ça donnerait, mais si tu as déjà une explication simple à donner, je suis preneur.
Alors je commence à chercher pourquoi, premier constat, pour gérer la rotation en hauteur je dois croiser les tests
Dans WaterWorld j'avais ça
Code : Tout sélectionner
If Mouse\x > 0 And DM_EntityPitch(*camera) < 60
DM_TurnEntity(*camera, Mouse\x, 0, 0)
ElseIf Mouse\x < 0 And DM_EntityPitch(*camera) > -60
DM_TurnEntity(*camera, Mouse\x, 0, 0)
EndIf
Code : Tout sélectionner
If Mouse\x > 0 And DM_EntityPitch(*camera) > -60
DM_TurnEntity(*camera, Mouse\x, 0, 0)
ElseIf Mouse\x < 0 And DM_EntityPitch(*camera) < 60
DM_TurnEntity(*camera, Mouse\x, 0, 0)
EndIf
Pour la marche arrière je n'ai pas encore regardé pourquoi ça ne marche plus, et je n'ai pas encore regardé pourquoi tu avais ajouté ça :
Code : Tout sélectionner
; récupère les vertex associé, '*resul' étant le mesh resultant du test de Raycasting
n_face.l = 0
n_surface.l = 0
*surfP.CSurface=DM_GetSurface(*resul)
; recherche la surface correspondante
n_surface = DM_CountSurface(*resul)
If(n_surface>1)
For i = 1 To n_surface
*surf.CSurface = DM_GetSurface(*resul, i-1)
n_face = n_face + DM_CountTriangles(*surf)
If(n_face>face)
*surfP = DM_GetSurface(*resul, i-1)
; face relative à la surface
face = face - (n_face - DM_CountTriangles(*surfP) )
i=999999999
EndIf
Next
EndIf
-
- Messages : 1554
- Inscription : lun. 24/juil./2006 6:44
- Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E
Pour la marche arrière, ce n'est pas normal, j'ai du mettre en ligne le mauvais
sample, non achevé (une de mes étourderie de plus).
En fait j'ai pris en compte les remarques, et refais les déplacements, tu peux maintenant
avancer, reculer, aller de coté, et surtout faire les deux en meme temps
(en biais si tu préfères).
Pour le bloquage en hauteur, il a disparu surtout par erreur, lors de mes mise aux points
ou je l'avais fait sauté. Pour ta remarque sur la différence entre l'ancienne méthode
et la nouvelle sur le bloquage en hauteur, c'est un bug, donc merci d'avoir mis le
doigt dessus, il y a une inversion dans la fonctions DM_EntityPitch() au niveau du signe.
Pour la symbolisation de la face touché, le code rejouté est en fait indispensable, car
avec le nouveau moteur, la gestion en interne des Mesh est légérement différente. Chaque
Mesh est composé de surface, et donc la scene n'est plus une entité unifiée, quand tu as
la face fournis par le moteur physique, il faut ensuite trouver la bonne surface, puis
enfin la bonne face. Voila pourquoi.
J'ai mis en ligne la dernière version de DM3D cet après-midi, cela ne corrige pas encore
le bug sur le signe de EntityPitch(), mais la version de PurePatator doit etre plus
complete, en particulier sur le mouvement (reculer, straf, ...)
(dernière mise a jour de DM3D indispensable pour que cela tourne)
sample, non achevé (une de mes étourderie de plus).
En fait j'ai pris en compte les remarques, et refais les déplacements, tu peux maintenant
avancer, reculer, aller de coté, et surtout faire les deux en meme temps
(en biais si tu préfères).
Pour le bloquage en hauteur, il a disparu surtout par erreur, lors de mes mise aux points
ou je l'avais fait sauté. Pour ta remarque sur la différence entre l'ancienne méthode
et la nouvelle sur le bloquage en hauteur, c'est un bug, donc merci d'avoir mis le
doigt dessus, il y a une inversion dans la fonctions DM_EntityPitch() au niveau du signe.
Pour la symbolisation de la face touché, le code rejouté est en fait indispensable, car
avec le nouveau moteur, la gestion en interne des Mesh est légérement différente. Chaque
Mesh est composé de surface, et donc la scene n'est plus une entité unifiée, quand tu as
la face fournis par le moteur physique, il faut ensuite trouver la bonne surface, puis
enfin la bonne face. Voila pourquoi.
J'ai mis en ligne la dernière version de DM3D cet après-midi, cela ne corrige pas encore
le bug sur le signe de EntityPitch(), mais la version de PurePatator doit etre plus
complete, en particulier sur le mouvement (reculer, straf, ...)
(dernière mise a jour de DM3D indispensable pour que cela tourne)
Force et sagesse...
Merci c'est beaucoup plus clair maintenant. Cool on peut enfin se déplacer en biais , voila une bonne nouvelle.
Avec PureBasic il existe une façon plus élégante que ça
Je vais attendre la prochaine mise à jour avant de télécharger(avec DM_EntityPitch() corrigé).
Avec PureBasic il existe une façon plus élégante que ça
pour sortir d'une boucle, essaye avec Breaki=999999999

Je vais attendre la prochaine mise à jour avant de télécharger(avec DM_EntityPitch() corrigé).
-
- Messages : 1202
- Inscription : sam. 31/déc./2005 23:52
Salut,
Voila, j'ai un petit problème, je vous met la cituation dans un exemple :
J'ai un objet a l'écran, par exemple une sphere, et je voudrais arrivé a faire tourner cette sphère dans le sens anti horlogique. Jusque la tout va bien.
Mais en même temps, je voudrais faire tourner la caméra dans le même sens en même temps. Tout en gardant une distance constante entre les deux.
ça reviendrais en quelque sorte a faire une rotation de la caméra sur l'axe Y de la sphère...
Pouvez vous me dire comment faire ?
Car j'ai esseyer plein de truc mais là je deviens fou mdr
Merci.
Voila, j'ai un petit problème, je vous met la cituation dans un exemple :
J'ai un objet a l'écran, par exemple une sphere, et je voudrais arrivé a faire tourner cette sphère dans le sens anti horlogique. Jusque la tout va bien.
Mais en même temps, je voudrais faire tourner la caméra dans le même sens en même temps. Tout en gardant une distance constante entre les deux.
ça reviendrais en quelque sorte a faire une rotation de la caméra sur l'axe Y de la sphère...
Pouvez vous me dire comment faire ?
Car j'ai esseyer plein de truc mais là je deviens fou mdr
Merci.
-
- Messages : 1202
- Inscription : sam. 31/déc./2005 23:52
En fait il faut créer un pivot
ensuite lorsque que tu créer la camera, tu lui assigne un pivot en parent
et tu tourne le pivot pour faire tourner ta camera autour du pivot !
@++
ensuite lorsque que tu créer la camera, tu lui assigne un pivot en parent
et tu tourne le pivot pour faire tourner ta camera autour du pivot !
Code : Tout sélectionner
; Fichiers Include
IncludePath "..\Include\"
IncludeFile "d3dx9.pbi"
IncludeFile "dreamotion3d.pbi"
; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialise la fenêtre graphique
DM_Graphics3D(1024,768, 32, 1, 0)
; Charge une font
*font = DM_LoadFont( "Arial",8 , 1)
DM_SetColorText (*font, 198,198,198,255)
; Définit la couleur ambiante
DM_AmbiantLight(150, 150, 150)
*Sphere = DM_CreateSphere()
*pivot = DM_CreatePivot()
*camera = DM_CreateCamera(*pivot)
DM_TranslateEntity(*camera,0,5,-10)
DM_CameraZoom(*camera,120)
DM_PointEntity(*camera,*Sphere)
;Creation d'une grille
For u = -5 To 5
*Line = DM_CreateLine(2)
DM_LinePoint(*Line,u*2,0,-10,255,255,255)
DM_LinePoint(*Line,u*2,0,10,255,255,255)
Next
For v = -5 To 5
*Line = DM_CreateLine(2)
DM_LinePoint(*Line,10,0,v*2,255,255,255)
DM_LinePoint(*Line,-10,0,v*2,255,255,255)
Next
; ---------------------------------------
; 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
DM_TurnEntity(*pivot,0,1/10,0)
; ---------------
; Rendu
; ---------------
DM_BeginScene()
DM_RenderWorld()
; Affichage du texte
DM_DrawText(*font, 10, 15, "FPS: "+Str(DM_FPS()))
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
@++
-
- Messages : 1554
- Inscription : lun. 24/juil./2006 6:44
- Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E
Excelent, le meme sans pivot, car dans ce cas la sphere suffit comme
réference parental pour la camera...
réference parental pour la camera...
Code : Tout sélectionner
; Fichiers Include
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
; Initialisation des différents modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
; Initialise la fenêtre graphique
DM_Graphics3D(1024,768, 32, 0, 1)
; Définit la couleur ambiante
DM_AmbiantLight(150, 150, 150)
DM_CreateLight(3)
*Sphere = DM_CreateSphere()
*camera = DM_CreateCamera(*sphere)
DM_TranslateEntity(*camera,0,5,-20)
;Creation d'une grille
For u = -5 To 5
*Line = DM_CreateLine(2)
DM_LinePoint(*Line,u*2,0,-10,255,255,255)
DM_LinePoint(*Line,u*2,0,10,255,255,255)
Next
For v = -5 To 5
*Line = DM_CreateLine(2)
DM_LinePoint(*Line,10,0,v*2,255,255,255)
DM_LinePoint(*Line,-10,0,v*2,255,255,255)
Next
; ---------------------------------------
; 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
DM_TurnEntity(*sphere,0,1/10,0)
; ---------------
; Rendu
; ---------------
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
Until Quit=1
DM_ClearGraphics()
End
Force et sagesse...
-
- Messages : 1202
- Inscription : sam. 31/déc./2005 23:52
-
- Messages : 1554
- Inscription : lun. 24/juil./2006 6:44
- Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E
Oui, essais. En fait, j'ai lié la camera directement a la Sphere, je ne passe
pas par un pivot comme Cpl.Bator. Tu peux lier les objets entre-eux sans
passer par des pivots.
Le pivot est une entité virtuelle qui sert surtout dans certains type de liens
entre entités, non situé au niveau du centre géométrique d'un objet .
donc DM_CreateCamera(*sphere) = camera asservie a la sphere
pas par un pivot comme Cpl.Bator. Tu peux lier les objets entre-eux sans
passer par des pivots.
Le pivot est une entité virtuelle qui sert surtout dans certains type de liens
entre entités, non situé au niveau du centre géométrique d'un objet .
donc DM_CreateCamera(*sphere) = camera asservie a la sphere
Force et sagesse...