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.