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. 

 
			
					
				
				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 
 
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.