Mad Race : calcul de coordonnées 3D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Merci Dobro,

Effectivement, ya des méthodes simples et efficaces !
Méthode utile pour les déplacements de tirs :D
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pb pour calcul de coordonnées

Message par G-Rom »

Evite de les utilisé en tps réel. Pour etre au top reprend le code de Dobro, fait des macro a la place des procédures, ( d'ailleurs les nom ne sont pas explicite, newX() est plus approprié ) utilise des table precalculé des cos/sin et tu sera au top ;)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

G-Rom a écrit :Evite de les utilisé en tps réel. Pour etre au top reprend le code de Dobro, fait des macro a la place des procédures, ( d'ailleurs les nom ne sont pas explicite, newX() est plus approprié ) utilise des table precalculé des cos/sin et tu sera au top
Héhé, je n'ai pas de fait de macros mais j'ai tout précalculé (je limite un max le calcul en temps-réel) . Hier soir, j'ai trouvé un peu de courage au fond du puits et j'ai codé le truc .
Ce midi j'ajoute l'accélérateur et je poste le code...

Merci à vous deux !!
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Mad Race : calcul de coordonnées 3D

Message par Cool Dji »

Hop, avec les images de la précédente version...

J'ai mis l'accélérateur avec la touche Espace (ralenti quand on relache)
Couleur à travailler pour faire moins psyché
Code à reprendre pour optimiser...et rendre compatible Linux (la case concerne aussi les variables ou uniquement les noms de fichiers ?)

Edit : http://xdji.free.fr/Telechargement/flare1.zip

Code : Tout sélectionner

; Mad Race
; Cool Dji, Septembre 2010, PB 4.50

InitSprite() : InitKeyboard() : InitSprite3D() :InitEngine3D()

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A/c)*180/#PI
  If y1 < y2 : Angle=360-Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure

;Tableau qui stock les coordonnées du circuit
Global Dim cx.f(10000),Dim cy.f(10000),Dim cz.f(10000)

Structure vecteur3f
  x.f
  y.f
  z.f
EndStructure

A.vecteur3f
B.vecteur3f
C.vecteur3f
Dir.vecteur3f
Global Accel.f

; liste de points recalculés avec un espacement normés
nbnewpoints=0

Global Dim Dx.f(nbnewpoints),Dim Dy.f(nbnewpoints),Dim Dz.f(nbnewpoints)

OpenScreen(800, 600, 32, "Circuit")

; Création de deux sprites qui servent à visualiser le circuit et la position de la camera

CreateSprite(0, 5,5,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(0))
Circle(3, 3, 2, RGB(255,255,255))
StopDrawing()

CreateSprite3D(0, 0)

CreateSprite(1, 5,5,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(1))
Circle(3, 3, 2, RGB(255,0,0))
StopDrawing()

CreateSprite3D(1, 1)

Sprite3DQuality(1)

; Charge la texture pour le Billboard
Add3DArchive("\", #PB_3DArchive_FileSystem)

CreateMaterial(1, LoadTexture(0,"flare.bmp")):DisableMaterialLighting(1, 1)
MaterialBlendingMode(1,#PB_Material_Add)

CreateBillboardGroup(10,MaterialID(1),5,5)

CreateMaterial(2, LoadTexture(1,"flare1.bmp")):DisableMaterialLighting(2, 1)
MaterialBlendingMode(2,#PB_Material_Add)

CreateBillboardGroup(11,MaterialID(2),5,5)


; Charge le fichier de points (x,y) qui constitue le circuit

OpenFile(0,"Savepoints.txt")
nbsavepoints=Val(ReadString(0))
j=0
k=0
i=0


For j=1 To nbsavepoints
  ang.f=ang+0.05:If ang=360:ang=0:EndIf
  cx(j)=Val(ReadString(0))/10 ; les coordonnées sont stockées sur un grand nombre
  cy(j)=Val(ReadString(0))/10 ; la division permet de récupérer des décimaux pour plus tard : héhéhéhé
  cz(j)=Sin(ang)*50            ; ajoute du relief avec un sinus pour l'instant
Next
CloseFile(0)

; on retravaille la courbe pour obtenir un nombre de points séparés par un segment de unité 1 en 3D

; là, je découpe tous les segments entre les points en
; autant de tronçon de longueur 1 en 3d

k=0
j=0
For j=1 To nbsavepoints-1
A\x = cx(j)   ; point de départ
A\y = cy(j)
A\z = cz(j)

B\x = cx(j+1)  ; point d'arrivée
B\y = cy(j+1)
B\z = cz(j+1)

C\x = A\x
C\y = A\y
C\z = A\z

; calcul la longueur du segment en 3d
; cette longueur deviendra le nombre de tronçons du segment de longueur 1
Lenght.f = Sqr(   (A\x - B\x) * (A\x - B\x) + (A\y - B\y) * (A\y - B\y) +  (A\z - B\z) * (A\z - B\z) )
Lenght=Lenght*4 ; ce coef permet de définir un segment encore plus petit = augmente la précision du déplacement

nbnewpoints=nbnewpoints+Lenght

ReDim Dx(nbnewpoints): ReDim Dy(nbnewpoints): ReDim Dz(nbnewpoints)
If Lenght<>0 ; Prevent div 0
  Dir\x = (B\x - A\x) / (Lenght)
  Dir\y = (B\y - A\y) / (Lenght)
  Dir\z = (B\z - A\z) / (Lenght)
EndIf

For i= 1 To Lenght
  k=k+1
  Dx(k)=C\x + Dir\x*i ; calcul les coordonnées des nouveaux points
  Dy(k)=C\y + Dir\y*i
  Dz(k)=C\z + Dir\z*i

Next

cx(j+1)=Dx(k) ; remplace les coordonnées de l'ancien point par les
cy(j+1)=Dy(k) ; nouvelles coordonnées recalculées.
cz(j+1)=Dz(k) ; et prends ce point comme nouveau point de départ pour le prochain calcul...

Next





For j=1 To nbnewpoints
  i=i+1:If i>100
    i=0
  k1=k1+1 
  AddBillboard(k1,11,dx(j),dz(j),dy(j)) 
  
  If j>1

  X1.f=dx(j)
  Y1.f=dy(j)
  X2.f=dx(j-1)
  Y2.f=dy(j-1)
  
 
  Angle     = ReturnDegAngle(X1,Y1,X2,Y2)

  EndIf
  
    For l=0 To 1
      k=k+1
        Distance  = 10;Random(10);

      X3.f = X2 + Distance * Cos( (Angle - 90) *  #PI/180)
      Y3.f = Y2 + Distance * Sin( (Angle - 90) *  #PI/180)
      AddBillboard(k,10,X3,dz(j),Y3)      ;

      k=k+1
        Distance  = 10;Random(10)
      X4.f = X2 + Distance * Cos( (Angle + 90) *  #PI/180)
      Y4.f = Y2 + Distance * Sin( (Angle + 90) *  #PI/180)
      AddBillboard(k,10,X4,dz(j),Y4)      
    Next
       
  
    EndIf        
  
  
Next


HideBillboardGroup(10, 0)
HideBillboardGroup(11, 0)


dl=nbnewpoints
dl=0

CreateCamera(0, 0, 0, 100, 100)
SkyBox("Space.bmp")

;-
;-       BIG LOOP

Repeat
  
  FlipBuffers()
  

;ing+1:If ing>0:ing=0:dl=dl+1:If dl=nbnewpoints-20:dl=1:EndIf:EndIf
dl=dl+accel :If dl>nbnewpoints-50:dl=1:EndIf

CameraLocate(0,dx(dl),dz(dl)+15,dy(dl)):CameraLookAt(0,dx(dl+50),dz(dl+50)+15,dy(dl+50))
    RenderWorld()
   
      If Start3D()
    
          For j=1 To nbnewpoints
         
            DisplaySprite3D(0,dx(j)/10,dy(j)/10,200)
          Next
           DisplaySprite3D(1,dx(dl)/10,dy(dl)/10,200)
          
        
        
      EndIf
      
    
      ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Space)
        If accel+5<50 :accel+1 : EndIf   ; Edit je mets 50 pour éviter le bug de fin de parcours avec le 50 de CameraLookAt (Patch provisoire)
        
      Else
        accel-1: If accel<0:accel=0:EndIf
      EndIf
    Until KeyboardPushed(#PB_Key_Escape):
End   
Dernière modification par Cool Dji le mar. 21/sept./2010 16:02, modifié 2 fois.
Only PureBasic makes it possible
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pb pour calcul de coordonnées

Message par Backup »

tu veux pas fournir les "flare.bmp" et "flare1.bmp" ?

je dis ça parceque tel quel ton code plante ... forcement :)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Sorry Dobro,

J'ai ajouté un lien dans le post précédent.

Les virages de l'exemple sont un peu trop raides.
Je dois corriger le passage entre la fin et le début du circuit (ya un vide et un petit saut)
Je vais inclure l'éditeur de courbe dans la version.
Only PureBasic makes it possible
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mad Race : calcul de coordonnées 3D

Message par Backup »

Merci ! :)
maintenant j'ai une erreur "index de tableau hors limite " ligne 199 ! :cry:
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Mad Race : calcul de coordonnées 3D

Message par Cool Dji »

Hum, mince

Je vois, c'est le passage entre la fin et le début du circuit (pb entre max accélération et pointeur caméra).
Je mets un patch dans la source : je limite l'accélération à 50 au lieu de 60 et corrigerai mon code ce soir...
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Mad Race : calcul de coordonnées 3D

Message par Cool Dji »

J'ai avancé sur le projet.
- J'ai mis un mesh rectangulaire pour symboliser un véhicule
avec rotation haut/bas et gauche/droite (merci la routine ReturnDegAngle)
- Déplacement avec accélération (touche espace)
- Viseur => déplacement avec la souris

Pour voir c'est là : http://xdji.free.fr/Telechargement/Mad%20Race.zip
Only PureBasic makes it possible
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Mad Race : calcul de coordonnées 3D

Message par kelebrindae »

Très joli! On a presque envie que le circuit soit plus long et doté de pentes plus fortes pour accentuer le côté "montagnes russes de l'espace"! J'ai hâte de voir le résultat final...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Mad Race : calcul de coordonnées 3D

Message par Cls »

Le débogueur m'indique un Invalid Memory Access ligne 41 :

Code : Tout sélectionner

CreateSprite(0, 5,5,#PB_Sprite_Texture)
Je suis en 4.50 (x86). J'ai zappé un truc ? :(
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Mad Race : calcul de coordonnées 3D

Message par Cool Dji »

Bizarre le Invalid Memory pour un createsprite :?:
Je regarde... :D
Only PureBasic makes it possible
Répondre