Question déplacement math

Programmation avancée de jeux en PureBasic
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 »

A OK. bon voici le code modifié. On définit donc une position initale de l'objet (ici un sprite)
et le rayon que fera le virage (on parle en degrés)
Le pgm genere le centre de rotation

Tu appuis sur Space pour commencer le virage.

Code : Tout sélectionner

; Fichiers Include 
IncludePath "Include\"  :  IncludeFile "dreamotion3d.pbi"

  Global *sp1.CSprite2D

  ;  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)
  SetCurrentDirectory("media/")
  
  ;----------------
  ; Charge un petit sprite
  ;----------------
  ;position intiale du sprite
  pos_sp_x = 200 
  pos_sp_y = 200
  ; son angle d'attaque du moment 
  AngDeg.f=40
  ; rayon de virage
  Rayon = 50
  ; chargement et positionnement
  *sp1 = DM_LoadSprite2D("sp1.png", pos_sp_x,pos_sp_y)
  DM_RotateSprite2D(*sp1, AngDeg)


  ; calcul du point central du futur virage  
  Centre_X = pos_sp_x + Cos((AngDeg+180)*#PI/180) * Rayon
  Centre_Y = pos_sp_y + Sin((AngDeg+180)*#PI/180) * Rayon
  flag.c = #False
  
  
  Repeat
  	ExamineKeyboard()
	
  	If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
  	  Quit=1
  	EndIf
  	
  	If KeyboardReleased(#PB_Key_Space) 
       flag=#True
    EndIf
      
   If flag   
    AngDeg + 0.5  
    Pos_X = Centre_X + Rayon * Cos(AngDeg*#PI/180)
    Pos_Y = Centre_Y + Rayon * Sin(AngDeg*#PI/180)
    DM_PositionSprite2D(*sp1, Pos_X, Pos_Y)
    DM_RotateSprite2D(*sp1, AngDeg)
   EndIf
   
  	; ---------------
  	;      Rendu
  	; ---------------
  	DM_BeginScene()
	      DM_ClsScreen(0,0,0)
	      DM_DrawSprite2D(*sp1)	    
  	DM_EndScene()
  	

  Until Quit=1

  DM_ClearGraphics()
  End
  
Force et sagesse...
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

Merci, cela fait exactement ce que je recherche à faire avec mon mesh d'avion :)
Va falloir que j'adapte tout cela a mon code :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tmyke a écrit :Bon, je ne sait si c'est ce que tu cherche, mais voici le prolongement du code
de Cpl.Bator, je l'ai fait avec DM3D, heeuu (j'ai honte...) je sais pas comment
on fait faire une rotation a un sprite2D avec PB :?
pour une fois que je peux t'expliquer !

regarde c'est simple lit les commentaires de ceci :
(j'utilise ce code pour tester mes code 2D)



; code by Dobro http://michel.dobro.free.fr/

#dobro =1
#Police =1
#sprite =1
; ***********************************
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
     WindowID = OpenWindow (1, 0, 0, EcranX, EcranY, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse ()
    taille_du_cercle=200
    nombre_de_point=360 ; ceci determine la resolution (nombre de points)
    
    
     ; on fabrique un sprite : D
     CreateSprite ( #sprite ,32,32) ; de 32 par 32
     StartDrawing ( SpriteOutput ( #sprite ) ) ; on va dessiner dans notre sprite (qui est au depart une cellule vide)
     Circle (16, 16, 16 , RGB (255,0,0)) ; je decide de dessiner un cercle rouge dedans
     StopDrawing ()
     ; voila notre sprte est dessiné !! : D
    
    
    
     Repeat
         ExamineMouse ()
        Event= WaitWindowEvent ()
        
         StartDrawing ( ScreenOutput ())
        compt+1
         If compt=nombre_de_point :compt=0: EndIf ; on a fait le tour ??
        
        x=taille_du_cercle* Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
        Y=taille_du_cercle * Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2) ; la formule du cercle
         Box (x, Y,2, 2 , RGB (255,255,255)) ; on peux laisser une trace du dessin
         StopDrawing ()
        
         ; on affiche notre rond rouge : D
         DisplaySprite ( #sprite ,x,Y)
         ; *****************************
         StartDrawing ( ScreenOutput ())
        
         DrawText (20, 200, " a la fin du dessin " )
         DrawText (20, 250, " click avec le bouton droit !! " )
         StopDrawing ()
         FlipBuffers (): ; affiche l'ecran *****<------- si tu Rem ceci le sprite laisse une trace : D
         ClearScreen ( RGB (0,0,0))
        
        
        Event= WindowEvent ()
         If MouseButton (2)
             End
         EndIf
     Until Event= #PB_Event_CloseWindow
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 Michel, sympa le code. En fait je me demandais surtout comment faire une rotation
d'un sprite sur lui meme (autour de son axe), un peu comme l'instruction DM_RotateSprite2d() de Dreamotion3D ?

:wink:
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tout simplement comme ça ! :)





; code by Dobro http://michel.dobro.free.fr/

#dobro =1
#Police =1
#sprite =1
#Sprite3D =1
#angle =5
; ***********************************
Resultat = InitSprite ()
Resultat = InitSprite3D ()
FontID = LoadFont ( #Police , "arial" , 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
     WindowID = OpenWindow (1, 0, 0, EcranX, EcranY, "hello" , #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse ()
    taille_du_cercle=200
    nombre_de_point=360 ; ceci determine la resolution (nombre de points)
    
    
     ; on fabrique un sprite : D
     CreateSprite ( #sprite ,32,32, #PB_Sprite_Texture ) ; de 32 par 32
     StartDrawing ( SpriteOutput ( #sprite ) ) ; on va dessiner dans notre sprite (qui est au depart une cellule vide)
     Box (1, 1, 32 ,32, RGB (255,0,0)) ; je decide de dessiner un carre rouge dedans
     StopDrawing ()
     ; voila notre sprte est dessiné !! : D
    
     ; on fait un sprite3d a partir de notre sprite créé
    Resultat = CreateSprite3D ( #Sprite3D , #sprite )
    
    
    
    
    
     Repeat
         ExamineMouse ()
        Event= WaitWindowEvent ()
        
         ; StartDrawing ( ScreenOutput ())
        compt+1
         If compt=nombre_de_point :compt=0: EndIf ; on a fait le tour ??
        
        x=taille_du_cercle* Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
        Y=taille_du_cercle * Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2) ; la formule du cercle
         ; Box (x, Y,2, 2 , RGB (255,255,255)) ; on peux laisser une trace du dessin
         ; StopDrawing ()
        
         ; on affiche notre rond rouge : D
         ; DisplaySprite ( #sprite ,x,Y) ; afficherai le sprite 2D
         RotateSprite3D ( #Sprite3D , - #angle ,1)
         Start3D ()
         DisplaySprite3D ( #Sprite3D , x,Y, 255) ; affiche le sprite 3D
         Stop3D ()
         ; *****************************
         StartDrawing ( ScreenOutput ())
        
         DrawText (20, 200, " a la fin du dessin " )
         DrawText (20, 250, " click avec le bouton droit !! " )
         StopDrawing ()
         FlipBuffers (): ; affiche l'ecran *****<------- si tu Rem ceci le sprite laisse une trace : D
         ClearScreen ( RGB (0,0,0))
        
        
        Event= WindowEvent ()
         If MouseButton (2)
             End
         EndIf
     Until Event= #PB_Event_CloseWindow
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 »

A OK, faut passer par les Sprites3D. Merci, je comprend nettement mieux
désormais

Merci

:)
Force et sagesse...
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

Bonjour,
Toujours en rapport avec la rotation, comment svp, peut-on faire en sorte que la valeur ajouté à l'angle AngDeg soit proportionnel à la vitesse de déplacement de facon que le sprite se déplace de la même manière qu'en ligne droite.

En ligne droite on fait cela pour prendre la vitesse en compte :

Code : Tout sélectionner

Sprite\x + Direction\x * Vitesse
Sprite\y + Direction\y * Vitesse
(tiré du tuto proposé par Comtois ici : http://www.games-creators.org/wiki/Pure ... t_Sprite3D)

Par là j'aimerai que la distance parcourue sur mon arc de cercle soit la même que si c'était en ligne droite.

Pouvez-vous m'aider à réaliser cela svp ?

Merci :)
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 »

Tu cherches à reproduire le comportement du sprite du tuto de Comtois ?

(qui se calerait sur une direction changente)
Force et sagesse...
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

Je n'ai pas compris ta question Tmyke, je vais essayer de repondre.
Mon code de base est basé sur le tutoriel de Comtois.

En faite j'aimerais avoir une vitesse égale de déplacement entre un sprite qui va se déplacer en ligne droite et un autre sprite qui va se deplacer circulairement.

Pour cela il faut déterminer par un calcul la valeur qui sera incrémenté à l'angle en fonction de la vitesse voulu et de le rayon... mais lequel... ? La Trigo c'est pas mon point fort.

Si la valeur incrémenté à l'angle n'est pas la bonne, le sprite ira trop vite ou trop lentement.

edit : pour une ligne droite la vitesse est un facteur du vecteur directionnel une fois normé
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 comprend mieux, je me penche dessus et je te tiens au courant d'ici a ce soir :wink:
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Tu me diras si c'est ça ?

Code : Tout sélectionner

Define.f Vitesse, Rayon,  Omega, Angle, DistanceD 

Rayon = 45
Vitesse = 3

Omega = Vitesse / Rayon

;Compare les distances parcourues pour 60 boucles
For i = 1 To 60
  ; En ligne droite
  DistanceD + Vitesse ; Le premier sprite se déplace en ligne droite
  ;Angle parcouru
  Angle + Omega       ; le second en cercle à la vitesse omega
Next i  
   
;Affiche la distance en ligne droite    
Debug DistanceD
;Affiche la distance en cercle 
Debug Angle * Rayon
Dernière modification par comtois le ven. 04/mai/2007 18:50, modifié 2 fois.
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.
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

tmyke a écrit :OK, je comprend mieux, je me penche dessus et je te tiens au courant d'ici a ce soir :wink:
Je te remercie d'avance :).
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

comtois a écrit :Tu me diras si c'est ça ?
Merci Comtois.
C'est surment cela que je recherche :)
Je vais étudier ton code pour voir ca :)
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

Merci :) Exactement ce que je voulais ! Et en plus en fonction du Rayon et de la vitesse :) :) :) :)

Bon maintenant va falloir assembler tout ca, mais cela j'en suis capable :)
Merci ;)
_Slide_
Messages : 52
Inscription : sam. 17/mars/2007 18:04

Message par _Slide_ »

Bonjour,

Maintenant il faut que je passe de la rotation à la ligne droite pour arriver à la destination.

Voici toutes les données que j'ai dans mon code :
Image
Les points, distances et angles qui portent un nom, ce sont les valeurs que je connais déjà.

Ce que je recherche c'est l'angle "????" pour obtenir l'angle à parcourir (ma rotation...) pour ensuite pouvoir aller direct en ligne droite vers ma destination.

Je dispose donc de x1,x2,x3,a1,a2,d1,d2 ainsi que les angles droit pour trouver "????".

Pouvez vous m'aider ?
Merci :)

edit : image modifié
edit 2 : image modifié encore (l'angle recherché), ca devrait etre bon là
Répondre