Attention à bien limiter la rotation de -90.0 à 90.0 max, sinon tu vas revenir en arrière ! Et puis bon, ça simulerait un FPS de contorsionniste de toutes façons
En faite, j'ai compris d'où viens mon problème xD.
C'est que quand je bouge la caméra de haut en bas, je dois pas déplacer mes objets seulement sur l'axe vertical, mais aussi sur les deux autres !
Si mon personnage regarde dessous lui, les objets seront en position (0,-1,0) ( Avex X,Y,Z. Y positif vers le haut ), s'il regarde vers le haut ça sera (0,1,0), et s'il regarde devant lui X et Z dépendront de sa rotation, et Y sera fixé par ses yeux.
Bon, maintenant j'ai plus qu'à trouver comment faire xD.
( N'empêche, on ( Enfin, surtout moi ) squatte le topic depuis une page ou deux en faite xD )
En fait, tu as tes deux angles principaux, l'axe "oui" de la tête et l'axe "non" de la tête. Personnellement, parce que ça me parle bien même si c'est peut être faux, je les appelle respectivement axe_vertical et axe_horizontal.
Si tu es dans un FPS, ta caméra va se déplacer et ta cible sera placée en fonction d'elle. Si tu es dans un TPS, c'est l'inverse. Dans les deux cas, tu vas avoir besoin de deux variables supplémentaires : la vélocité et la distance entre caméra et cible.
# si déplacement vers l'avant@camera.position.x+= speed *Math::cos(@angle_horizontal *Math::PI /180.0)@camera.position.z+= speed *Math::sin(@angle_horizontal *Math::PI /180.0)# si déplacement vers l'arrière@camera.position.x-= speed *Math::cos(@angle_horizontal *Math::PI /180.0)@camera.position.z-= speed *Math::sin(@angle_horizontal *Math::PI /180.0)# si déplacement vers la droite@camera.position.x+= speed *Math::cos((@angle_horizontal -90.0)*Math::PI /180.0)@camera.position.z+= speed *Math::sin((@angle_horizontal -90.0)*Math::PI /180.0)# si déplacement vers la gauche@camera.position.x-= speed *Math::cos((@angle_horizontal -90.0)*Math::PI /180.0)@camera.position.z-= speed *Math::sin((@angle_horizontal -90.0)*Math::PI /180.0)# ta position est ajustée, maintenant tu positionnes ta cible de la même manière par rapport à la position@camera.target.x=@camera.position.x+ distance *Math::cos(@angle_horizontal *Math::PI /180.0)@camera.target.y=@camera.position.y+ distance *Math::sin(@angle_vertical *Math::PI /180.0)@camera.target.z=@camera.position.z+ distance *Math::sin(@angle_horizontal *Math::PI /180.0)
Et voilà ! Et du coup, tu peux dessiner tes objets à leur position réelle :
gluLookAt(@camera.position.x,@camera.position.y,@camera.position.z,@camera.target.x,@camera.target.y,@camera.target.z,0,1,0)# verticale sur Y
BOUCLE sur tous tes objets à dessiner
glPushMatrix # sauvegarde de la matrice actuelle
glTranslate(x, y, z)# tu déplaces le repère là où tu dois dessiner ton objet# dessin de ton objet...
glPopMatrix # tu remets la matrice à l'état précédent
FIN DE BOUCLE
Maker un jour, maker toujours.
Mack -
posté le 09/05/2014 à 18:39:14 (2310 messages postés)
- -
❤ 0
Çà peut être une bonne idée ce topic, même si on risque d'être principalement nous deux xD.
Bah en faite, pour le déplacement c'est (presque) exactement ce que j'ai fait.
( Dans ton code, tu inverses tout les sin et les cos.
En gros, moi j'ai du position.x = speed * Math.sin(Math.toRadians(Axe_H))
position.z = speed * Math.cos(Math.toRadians(Axe_H))
Pour le déplacement en avant. Et ainsi de suite pour les autres déplacements.
)
Pour le dernier code, c'est ce que je fait pour afficher n'importe quel objet 3D ^^.
Et pour placer mes mains ( parce que je rappelle que c'est ça mon soucis xD. ), la position en Y ne dépend que de l'axe vertical, tandis que les positions X/Z, elles dépendent aussi de l'axe Y.
En gros :
Vue de côté :
Vue de dessus :
Chaque couleur correspond au même point de vue sur les deux images.
Donc en gros, on imagine une sphère et les armes doivent rester aux bords.
Donc si le joueur regarde le sol ( couleur verte ), ou le plafond ( couleur violette ), les objets n'auront pas la même position X/Z que si le joueur regarde droit devant lui ( couleur bleu ).
J'arrive pas à expliquer ce que je veux dire en faite ><.
Sinon, avec ta solution, ça donne ça :
Et pour l'instant, moi j'arrive à avoir ça :
( Ah mince, j'viens de me rendre compte que j'ai aussi modifier autre chose dans la seconde vidéo, normalement les objets sont bien espacé, mais selon l'axe vertical, ils le sont plus ou moins, et finissent par échanger leur place.
Mais bon, en bossant bien j'suis arriver jusque là. )
Donc faut juste que j'arrive à espacer correctement mes objets.
( Je prend note de tout les commentaires, même si je n'y répond pas )
solidboko -
posté le 09/05/2014 à 22:06:04 (292 messages postés)
❤ 0
Vidéo privée
Maker un jour, maker toujours.
Mack -
posté le 09/05/2014 à 22:11:51 (2310 messages postés)
- -
❤ 0
Ah mince ><.
Ça devrait être bon là.
( Je prend note de tout les commentaires, même si je n'y répond pas )
solidboko -
posté le 16/05/2014 à 14:18:12 (292 messages postés)
❤ 0
oui, c'est clairement pas top. L'idée, c'est d'arriver à avoir le pivot au bon endroit, spontanément, je me demande donc comment sont chargés tes objets 3D. Il faudrait dessiner par rapport à la "prise" et faire pivoter la vue en même temps que les objets.