Page 2 sur 2

Re: Pb pour calcul de coordonnées

Publié : mar. 21/sept./2010 7:03
par Cool Dji
Merci Dobro,

Effectivement, ya des méthodes simples et efficaces !
Méthode utile pour les déplacements de tirs :D

Re: Pb pour calcul de coordonnées

Publié : mar. 21/sept./2010 8:28
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 ;)

Re: Pb pour calcul de coordonnées

Publié : mar. 21/sept./2010 9:59
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 !!

Mad Race : calcul de coordonnées 3D

Publié : mar. 21/sept./2010 11:39
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   

Re: Pb pour calcul de coordonnées

Publié : mar. 21/sept./2010 12:19
par Backup
tu veux pas fournir les "flare.bmp" et "flare1.bmp" ?

je dis ça parceque tel quel ton code plante ... forcement :)

Re: Pb pour calcul de coordonnées

Publié : mar. 21/sept./2010 12:37
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.

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

Publié : mar. 21/sept./2010 15:50
par Backup
Merci ! :)
maintenant j'ai une erreur "index de tableau hors limite " ligne 199 ! :cry:

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

Publié : mar. 21/sept./2010 16:01
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...

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

Publié : dim. 26/sept./2010 12:40
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

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

Publié : jeu. 30/sept./2010 15:24
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...

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

Publié : ven. 01/oct./2010 8:42
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 ? :(

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

Publié : ven. 01/oct./2010 20:27
par Cool Dji
Bizarre le Invalid Memory pour un createsprite :?:
Je regarde... :D