Page 1 sur 1

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

Publié : sam. 19/nov./2005 20:07
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

Publié : dim. 20/nov./2005 9:39
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.

Publié : dim. 20/nov./2005 13:47
par CameleonTH
Ok merci c'est gentil mais petit probléme la fonction M3D_WrapValue vient de kelle librairie?

Publié : dim. 20/nov./2005 13:53
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

Publié : dim. 20/nov./2005 13:55
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

Publié : dim. 20/nov./2005 13:58
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

Publié : dim. 20/nov./2005 14:12
par comtois
ben oui , tu vas de 0 à 360°.

tu n'as pas d'angle négatif , c'est ça qui te gêne ?

Publié : dim. 20/nov./2005 14:14
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.

Publié : dim. 20/nov./2005 14:16
par comtois
euh là faut que tu nous montres un bout de code, moi je n'ai pas ce problème.

Publié : dim. 20/nov./2005 14:37
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.

Publié : dim. 20/nov./2005 15:02
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

Publié : dim. 20/nov./2005 15:14
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 .

Publié : dim. 20/nov./2005 15:33
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

Publié : dim. 20/nov./2005 15:51
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)

Publié : dim. 20/nov./2005 16:19
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.