3D et flip de camera lors dune rotation

a marqué ce sujet comme résolu.

Bonjour a tous,

Dans un projet, on dispose d’un visualiseur de scène 3D fait maison. Actuellement, lors d’une rotation, si la camera passe au dessus de l’axe Z, la camera va "flipper" (ie, faire une rotation de 180 degrés autour de l’axe Z) pour éviter de se retrouver "la tète en bas". Ce n’est pas agréable et cherche a empercher cela.

Au début, je me suis dit, facile, suffit de bloquer les angles de la camera et le tour est joue. Mais il y’a plusieurs soucis.

  • Tout d’abord la camera est représentée "en position", c’est a dire par :

    • Sa position PP
    • Le point QQ qu’elle vise
    • Un vecteur "up"
  • Ensuite la rotation est actuellement une fonction d’état (au sens physique du terme), c’est a dire que la rotation ne dépends que de la position du clic droit initial pour la démarrer et de la position actuelle de la souris1. Elle est realisee par l’utilisation d’un quaternion.

Actuellement, ma limite de rotation est implémentée en bloquant la souris de l’utilisateur des qu’il s’approche trop de l’axe Z. Mais on me dit qu’il faudrait pouvoir bloquer la rotation tout en laissant la souris libre. Si la souris continue a monter, il ne se passe rien, mais si elle descend, la rotation se fait.

Et la je commence a sécher sur la manière de faire. C’est un problème que je suppose assez classique dans les moteurs 3D/JV, mais pas moyen de trouver une ressource qui explique comment faire. Toutes mes recherches me tombent sur Blender, Unity, Autodesk…

Si vous avez des ressources / lien, je suis preneur /

Merci beaucoup. David


  1. ce qui est en soit logique, pour aller d’un point A a un point B, si on ne passe pas en ligne droite, il faut que la souris fasse le trajet dans un sens, puis dans l’autre, ce qui annule les rotations correspondantes.

+0 -0

Pour référence, j’utilisais les termes comme restrain rotation ou limit rotation. Clamping donne bien meilleurs résultats.

J’ai pu trouver une décomposition swing/twist d’une rotation définie par quaternion autour d’un axe arbitraire. De cette manière, en décomposant sur le projeté sur le plan XY de l’axe rotation, je peux vérifier si l’angle de twist ne va nous faire passer au dessus de 90 deg. Sur le principe ca marche mème si en pratique le résultat dans l’application n’est pas satisfaisant.

Bonjour Davidbrcz,

Je pense avoir le même problème. Bien que dans mon moteur 3D, j’utilise des angles de rotation sur la caméra et pas d’axe de rotation. J’ai également choisi de corréler les positions X et Y de la souris à un pourcentage de l’angle vertical et horizontal … bon sauf que ça ne marche pas mieux.

Voici une preview lite : https://codesandbox.io/s/vqq69kz5xl (lite parce que ça me permet d’effectuer des crash tests avant de l’intégrer à mon moteur final).

J’ai trouvé cet article https://openclassrooms.com/forum/sujet/orientation-3d, pas encore tout compris. Sinon j’ai un codepen intéressant, à décortiquer : https://codepen.io/fraenk/pen/GJYVgd.

Ça ne répond pas à ta problématique mais si l’un de nous trouve l’algorithme approximatif à appliquer ce serait parfait ! Ou que quelqu’un d’autre du forum peut nous répondre (merci d’avance !).

Edit : j’allai oublier ! Pour essayer la preview, il faut cliquer dessus. La souris pour appliquer une rotation à la caméra et les touches ZQSD pour se déplacer.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte