Petit probléme en 3D avec les camera et les angles

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Petit probléme en 3D avec les camera et les angles

Message par CameleonTH »

Voila mon probléme je n'arrive pas a retrouver l'angle d'une camera, pour la tourner pas de probléme mais aprés comment fait-on pour retrouver son angle car j'ai essayer de les retrouver en fonction fonction du mouvement que l'on fait mais le mouvmement et fais avec la souris et c'est pas précis du tous (en fonction d'un geste trop brusque la variable est totalement fausse, ex: au lieu de 360° j'ai 380°)

alor si quelqu'un sait comment retrouver l'angle d'une camera ou entité sa m'aiderais beaucoup merci. :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

pour l'instant tu n'as pas le choix il faut mémoriser toi même les angles et je te l'accorde ,c'est vraiment pas terrible.Fred a dit qu'il allait voir ce qu'il pouvait faire dans la version 4 , souhaitons qu'il nous les ajoute ces angles , faire de la 3D sans angles c'est difficile :)

En attendant , je fais comme ça :

Code : Tout sélectionner

   ;Rotation de la caméra avec la souris
   If ExamineMouse()
   	MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
   	MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
   EndIf 
  ;Mémorise les angles 
  Camera\AngleX = M3D_WrapValue( Camera\AngleX + MouseX)
  Camera\AngleY = M3D_WrapValue( Camera\AngleY + MouseY)
  ;Oriente la caméra  
  RotateCamera(0,MouseX,MouseY,0) 
M3D_WrapValue est une fonction qui me maintient l'angle entre 0 et 360°.
C'est pas indispensable , ça devrait fonctionner sans ça .

Et bien sûr , au départ j'ai initialisé ma caméra dans une position pour mettre son angle Y à zéro. L'angle X est moins génant pour ce que je fais , je n'ai pas besoin qu'il corresponde au monde 3D.

En clair , j'ai ajouté un cameralocate() avant la boucle principale et je fais un cameralookat() de façon à ce qu'elle regarde droit devant , à angle 0 sur l'axe y.

Code : Tout sélectionner

CameraLocate(0,X,Y,Z)
CameraLookAt(0,X+CosD(Camera\AngleX)*100,Y,-SinD(Camera\AngleX)*100)
CosD() et SinD() <<< c'est pour gérer les angles en degrés.
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.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Ok merci c'est gentil mais petit probléme la fonction M3D_WrapValue vient de kelle librairie?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

de M3D_Matrix3D (les sources sont disponibles)

mais voila le code

Code : Tout sélectionner

ProcedureDLL.f M3D_WrapValue(Angle.f) 
	Angle/360 
  	Angle-Int(Angle) 
  	If Angle<0 
    	ProcedureReturn (Angle+1)*360 
  	Else 
    	ProcedureReturn Angle*360 
  	EndIf 
EndProcedure
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.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Non en faite c'est bon j'ai trouver le lien sur ton site
http://perso.wanadoo.fr/comtois/M3D_Mat ... rix3D1.zip
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Mais petit probléme encore quand je fais un quart de tour avec ton code sa marque que je fais 360°
Bizar
Tan pis j'attend la prochaine version de PureBasic
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ben oui , tu vas de 0 à 360°.

tu n'as pas d'angle négatif , c'est ça qui te gêne ?
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.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Ce qui me géne c'est que normalement sa marque 360° quand on fait un tour et quand on fait un quart de tour c'est 90° mais moi sa marque 360° pour un quart de tour.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

euh là faut que tu nous montres un bout de code, moi je n'ai pas ce problème.
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.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Voila un petit bout de code qui me pose probléme=, c'est pas celui avec le lequelle sa me pose probléme mais li me pose probléme ossi.

Code : Tout sélectionner

InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
 
OpenWindow(0,100,100,800,600,0,"test")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
  
CreateCamera(0, 0, 0, 100, 100) 
CameraLocate(0,0,0,0)
CameraLookAt(0,0,0,0)

#PlayerSpeed  = 10
#RobotMesh    = 0
#RobotTexture = 0
#Robot        = 0
#RobotMat     = 0

LoadMesh   (#RobotMesh   , "robot.mesh")
LoadTexture(#RobotTexture, "r2skin.jpg") 
CreateMaterial(#RobotMat, TextureID(#RobotTexture)) 

CreateEntity(0,MeshID(#RobotMesh),MaterialID(#RobotMat),x,y,z) 

Repeat
  
  If ExamineKeyboard() 
    If KeyboardPushed(#PB_Key_Left)
      KeyX = -#PlayerSpeed
    ElseIf KeyboardPushed(#PB_Key_Right)
      KeyX = #PlayerSpeed
    Else
      KeyX = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      KeyY = -#PlayerSpeed
    ElseIf KeyboardPushed(#PB_Key_Down)
      KeyY = #PlayerSpeed
    Else
      KeyY = 0
    EndIf
  EndIf
    
  ;Rotation de la caméra avec la souris
  If ExamineMouse()
      MouseX = -(MouseDeltaX()/10)*#PlayerSpeed/2
      MouseY = -(MouseDeltaY()/10)*#PlayerSpeed/2
  EndIf
  ;Mémorise les angles
  AngleX = M3D_WrapValue( AngleX + MouseX)
  AngleY = M3D_WrapValue( AngleY + MouseY)
  ;Oriente la caméra 
  
  RotateCamera(0,MouseX,MouseY,0)
  MoveCamera(0, KeyX, 0, KeyY)
  
  RenderWorld()
  
  If StartDrawing(ScreenOutput())
    FrontColor(255, 255, 255)
    DrawingMode(1)
    Locate(0, 0)  : DrawText(StrF(Engine3DFrameRate(0),1)+" FPS")
    Locate(0, 20) : DrawText(Str(CountRenderedTriangles())+" Triangles")
    Locate(0, 60) : DrawText(Str(AngleX))
    Locate(0, 80) : DrawText(Str(AngleY)) 
    StopDrawing()
  EndIf
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) 
bien sur il faut les fichier robot.mesh et r2skin.jpg.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

comtois a écrit :ben oui , tu vas de 0 à 360°.

tu n'as pas d'angle négatif , c'est ça qui te gêne ?
en théorie 0 <= WrapValue() < 360
Je trouve intéressante ta facon de coder cette fonction ^^ je vais faire des tests de vitesse avec la mienne :D

Dri
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

C'est filperj qui a codé ça , ma façon était horrible :)

Sinon j'ai fait quelques tests , et effectivement , on dirait que ça merde avec la version actuelle d'ogre, par contre ça fonctionne bien avec la version beta.

C'est pour ça que je n'avais rien remarqué , j'utilise la version beta en ce moment :)

Donc voila , essaye avec la version beta .
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.
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Seulement la version beta deconne avec les texture et materiel, quand je charge une texture sa me dit "textureid is null". Donc je suis un peu degouter
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oui avec la beta il faut ajouter Add3DArchive() pour indiquer où se trouve les textures ou les meshs .

Extrait de mon code :

Code : Tout sélectionner

Add3DArchive("Robot\"          , #PB_3DArchive_FileSystem)
Add3DArchive("Textures\"          , #PB_3DArchive_FileSystem)
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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

autre détail , si tu veux un mouvement souple , n'oublie pas de mettre
MouseX et MouseY en flottant, idem pour AngleX et AngleY.
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.
Répondre