Salut les gens, petit probleme de camera...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Salut les gens, petit probleme de camera...

Message par Liet_Kynes »

Salut a tous, je viens de me mettre à PureBasic, et j'ai une petite expérience en DarkBasic...
Comtois m'a recommandé de poser mes question sur ce forum, et il a bien raison, il a l'air sympa ce forum :D


Bon, pour rentrer dans le vif du sujet, j'ai repris le code du sample Terrain, que j'ai modifié pour mettre le robot qui se déplace a l'aide du clavier, avec une camera qui le suit derriere.
Lorsqu'on appuie sur les touches gauche/droite, le robot fais une rotation sur lui-même afin de changer de direction, et la camera suis le mouvement pour s'ajuster derriere lui... (merci comtois :-) )
Le problème est qu'à certains angles, la camera n'est pas bien orienté vers le robot (malgrès le "CameraLookAt(0, EntityX(#robot)-30,EntityY(#robot)+40,EntityZ(#robot))" )...

Voila le code: (qui utilise les médias en sample dans PureBasic\Examples\Sources\Data)

(faite pas attention a l'absence de structures)

Code : Tout sélectionner

IncludeFile "Screen3DRequester.pb"

;-déclarer variables
#RobotMesh    = 2
#RobotTexture = 2
#Robot        = 2
distancecamera.f=100
vitesserobot.f=3
angle.f=90

If InitEngine3D()
  Add3DArchive("Data\"          , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()

    AmbientColor(RGB(255,255,255))
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
    
    CreateTerrain("Terrain.png", MaterialID(0), 4, 0.6, 4, 1)

    CreateCamera(0, 0, 0, 100, 100)

    
    SkyDome("Clouds.jpg",10)
    
    LoadMesh   (#RobotMesh   , "Robot.mesh")
    LoadTexture(#RobotTexture, "r2skin.jpg")
    
    CreateMaterial(2, TextureID(#RobotTexture))
    
    CreateEntity(#Robot, MeshID(#RobotMesh), MaterialID(2))
    
    
    ScaleEntity(#robot,0.5,0.5,0.5)
    EntityLocate(#robot, 128, 30, 128) 
    CameraLocate(0, EntityX(#robot),EntityY(#robot)+50,EntityZ(#robot))


  



    Repeat
      ClearScreen(0,0,0)
      
      Screen3DEvents()
     
     
      ;-Regler la hauteur du robot par rapport au terrain
      If EntityY(#robot) <> TerrainHeight(EntityX(#robot), EntityZ(#robot))
      Movey.f=TerrainHeight(EntityX(#robot), EntityZ(#robot))-EntityY(#robot)+2
      MoveEntity(#Robot,0,movey,0)
      EndIf
     
      ;-garder l'angle entre 0 et 360
      If angle>360
      angle=angle-360
      EndIf
      If angle<0
      angle=angle+360
      EndIf 
      
      ;conversion de l'angle du robot en Radian pour le calcul COS/SIN
      AngleR.f = Angle * 0.0174533 

      x.f= Sin(angleR)
      z.f=Cos(angleR)
     
      ;Controle du robot avec le clavier
      If ExamineKeyboard()        
        If KeyboardPushed(#PB_Key_Left)
         RotateEntity(#Robot,5,0,0)
         angle=angle+5
        ElseIf KeyboardPushed(#PB_Key_Right)
         RotateEntity(#Robot,-5,0,0)
         angle=angle-5
        EndIf
        If KeyboardPushed(#PB_Key_Up)
          MoveEntity(#Robot,x*vitesserobot,0,z*vitesserobot)
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveEntity(#Robot,-x*vitesserobot,0,-z*vitesserobot)
        EndIf

      EndIf

      ;gestion camera
      CameraX.f=EntityX(#robot)-(x*distancecamera)
      CameraZ.f=EntityZ(#robot)-(z*distancecamera)
      
      CameraLocate(0,camerax,EntityY(#robot)+50,cameraz)
       
      CameraLookAt(0, EntityX(#robot)-30,EntityY(#robot)+40,EntityZ(#robot)) 
      

      
      RenderWorld()
      Screen3DStats()
      Gosub fps  
      FlipBuffers()
      
      


 
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

  
End

FPS:
  If Val(FormatDate("%ss", Date()))=sek
    FPS+1
  Else
    FPS$=Str(FPS)
    FPS=0
  EndIf
  sek=Val(FormatDate("%ss", Date()))
 
  StartDrawing(ScreenOutput()) 
    DrawingMode(1)
    FrontColor(255,255,255)
    Locate(1,1)
    DrawText("FPS: "+FPS$)
    Locate(1,16)
    Angle$=Str(angle)
    DrawText("angle degrés: "+angle$)
    Locate(1,31)
    AngleR$=Str(AngleR)
    DrawText("Angle Radian: "+angler$)
    Locate(1,46)
    Entityx$=Str(EntityX(#robot))
    Entityz$=Str(EntityZ(#robot))
    DrawText("Position Robot (X,Z): ("+Entityx$+","+entityz$+")")
    Locate(1,61)
    camerax$=Str(CameraX(0))
    cameraz$=Str(CameraZ(0))
    DrawText("Position Camera (X,Z): ("+camerax$+","+cameraz$+")")
  StopDrawing()
Return 
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Message par Liet_Kynes »

Ah c bon j'ai trouvé
chuis fatigué moi lol

Le problème est qu'à certains angles, la camera n'est pas bien orienté vers le robot (malgrès le "CameraLookAt(0, EntityX(#robot)-30,EntityY(#robot)+40,EntityZ(#robot))" )...

J'me demande pourquoi j'ai soustrais 30 a EntityX(#robot)
Faut dire que chuis crevé, j'ai passé la nuit dessus lol


Bon, alors je vais poser une autre question ^^

En fait j'aimerais modeliser un perso qui tiens une épée, et j'aimerais pouvoir changer d'épée au cour du jeu.
J'aimerais savoir si un fichier .mesh peut contenir deux mesh... (le perso+l'épée). Sinon, faudrait que je les mette dans deux fichiers mesh différents, mais il faudrait que ces 2 mesh puissent etre rataché a un seul squellette...

Autre question, j'ai vu dans l'aide qu'un .mesh peut contenir des bones, mais comment se fait il que lors de l'exportation avec Ogre exporter, il me propose de creer un fichier squelette ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

J'aimerais savoir si un fichier .mesh peut contenir deux mesh... (le perso+l'épée). Sinon, faudrait que je les mette dans deux fichiers mesh différents, mais il faudrait que ces 2 mesh puissent etre rataché a un seul squellette...
Tu fais sans doute référence à la possibilité d'attacher un objet à un autre en darkbasic ?

A ma connaissance , ce n'est pas possible en purebasic ? tu devras le gérer toi même en recalculant la position de ton épée en fonction de ton personnage.
Pour la hauteur de l'épée c'est simple
Hauteur épée = Hauteur du personnage + DeltaHauteur
Pour la position X et Z , je pense que tu devras passer par NewXvalue et NewZvalue , tu positionnes ainsi ton épée par rapport à ton personnage ,de la même manière que tu positionnes la caméra .

Sinon , bien que je n'y connaisse rien en modélisation , je pense qu'un fichier Mesh ne peut contenir qu'un seul mesh ( ce mesh peut représenter un personnage avec une épée , mais tu ne peux pas accéder à l'épée indépendamment du personnage, ils sont liés ).
Autre question, j'ai vu dans l'aide qu'un .mesh peut contenir des bones, mais comment se fait il que lors de l'exportation avec Ogre exporter, il me propose de creer un fichier squelette ?
en fait ,tu as deux fichiers ,un fichiers .mesh , et un fichier .skeleton , c'est ce dernier qui contient les bones (je pense),et c'est aussi dans celui ci que tu décris les animations de ton entity.
tu peux regarder le fichier skeleton du robot , tu verras qu'il comporte 4 ou 5 animations , Slump , Walk , etc .
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Message par Liet_Kynes »

ah ok...
Ce que tu dis là complique pas mal de choses...
Je vois mal comment calculer chaques positions de l'épée, sachant que le perso est cencé faire des mouvements avec...

Ah, j'ai une meilleure idée =)
je vais superposer deux squellettes identiques placés aux mêmes coordonnées, avec les même angles, un pour gerer les mouvements du perso, et l'autre les mouvements de l'épée, ca devrait donner l'impression que le perso et l'épée sont homogène...

Deja je modelise le perso avec ses animations, puis je programme, puis je vous montre ca =)
(enfin, ca sera pas pour tout de suite :p )
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Exact je n'avais pas pensé que ton personnage allait se battre à l"épée et qu'il y aurait des positions différentes :)

Sinon tu peux faire plusieurs mesh de ton perso avec une épée différente à chaque fois , et tu as juste à changer ton entity en fonction de l'épée choisie .

tu peux aussi changer la texture , et bosser toujours avec le même mesh , tu auras une épée de même forme , mais de texture différente .
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Message par Liet_Kynes »

oui c'est une possibilité, mais je préfère que l'épée soit séparé du perso, parce que je compte aussi mettre des armures différentes, des casques ect... pour un petit A-rpg sympatique quoi =)

Je voulais demander autre chose, c'est au sujet de #include, j'ai vu qu'on peut inclure un fichier en .pb qu'une seule fois...
en fait, j'aurais voulu faire un fichier central qui gère la boucle principal, et a côté, plusieurs fichiers qui gèrent chacun quelque chose de précis (un pour la gestion des camera, un autre pour les dialogues, un pour gerer les points d'expérience ect...), c'est possible de séparer les taches de cette manière ?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

bien sûr que c'est possible ,c'est même recommandé quand le listing devient trop gros :)

Tu peux faire ça :

Code : Tout sélectionner

XIncludeFile "Include.Pbi"
XIncludeFile "Fonctions.Pbi"
XIncludeFile "Camera.Pbi"
XIncludeFile "Machin.Pbi"
Par contre si tu fais ça

Code : Tout sélectionner

XIncludeFile "Include.Pbi"
XIncludeFile "Include.Pbi"
Le fichier include.pbi ne sera inclu au code qu'une seule fois .
si tu veux qu'il soit inclu plusieurs fois tu fais

Code : Tout sélectionner

IncludeFile "Include.Pbi"
IncludeFile "Include.Pbi"
Ceci dit je n'ai jamais compris l'intérêt d'inclure un fichier plusieurs fois , quelqu'un a une idée à ce sujet ?
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Message par Liet_Kynes »

ahhh, ca c'est une bonne nouvelle ^^
Avec Dark Basic, on peut pas faire ca, et c'est vraiment chiant

Sinon l'interret d'inclure plusieurs fois un même fichier, c'est d'avoir des boucles de ce style:

Repeat
IncludeFile "Include.Pbi"
IncludeFile "Fonctions.Pbi"
IncludeFile "Camera.Pbi"
IncludeFile "controles.Pbi"
until bidule truc
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Liet_Kynes a écrit :ahhh, ca c'est une bonne nouvelle ^^
Avec Dark Basic, on peut pas faire ca, et c'est vraiment chiant


heu ! si !!

en dark basic v 1 page 51 du manuel !!
en version pro elle y est toujours !! la commande deviens violette
mais elle n'est apparament pas presente dans la doc a la rubrique CORE
:?

mais elle marche !!
#include "non_du_fichier.db"
Liet_Kynes
Messages : 12
Inscription : ven. 20/août/2004 11:00

Message par Liet_Kynes »

Ah, j'ai commencé au pro, et la doc n'a pas du le mettre en evidence :p
Répondre