2012-12-02 4 views
0

Voici la chose. J'ai un Object3d qui est composé de 6 plans installés pour former un cube. Maintenant, après l'application de la rotation du quaternion basée sur l'entrée de la souris et après l'arrêt du cube - j'ai besoin que le cube tourne directement à la caméra de son côté le plus proche (avion enfant). Ce que je fais maintenant, c'est que j'obtiens les angles d'Euler actuels de ma matrice Object3d, en appliquant une rotation à cette matrice et en la replaçant dans le quaternion de mon objet avec la fonction setFromRotationMatrix(). Parfois, cette méthode fonctionne (généralement à des angles bas) et parfois l'axe Z se comporte mal (ou peut-être Y, ou même tous, ne peut pas dire).Three.js Comment pointer l'enfant d'Object3d pour faire face à la caméra?

Maintenant, je pourrais juste calculer le côté le plus proche et appliquer le quaternion direct de ce côté à mon objet, ce qui fonctionne, mais cela ne me donne aucune animation. J'utilise ce code pour obtenir mes angles actuels: http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37. Sur la base de ce que je calcule le plus proche rotation de 90 degrés pour chaque axe:

 function lookAtCamDeg(val){ 
      var d = 1; 
      var s = 1; 
      var newAngle; 

      if(val < 0)d*=-1; 

      val = Math.abs(val); 

      if(val <= 45)s*=-1; 
      if(val > 45)val=90-val; 

      newAngle = val*d*s; 

      return newAngle; 
     } 

et l'application que de tourner le cube:

  var angles = getAngles();http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37 
      var newX = lookAtCamDeg(angles.x); 
      var newY = lookAtCamDeg(angles.y); 
      var newZ = lookAtCamDeg(angles.z); 

      var ma = cube.matrix; 
      ma = ma.rotateX(-newX*DEGREES) 
      ma = ma.rotateY(-newY*DEGREES) 
      ma = ma.rotateZ(-newZ*DEGREES) 
      cube.quaternion.setFromRotationMatrix(ma); 

Ce que je pense est maintenant d'essayer d'utiliser des plans séparés de mon cube (enfants) et basé sur leurs normales appliquent la méthode lookAt(), mais ne savent pas comment le faire, car j'ai besoin de faire pivoter l'objet entier, pas seulement un enfant. Quelqu'un pourrait-il me conduire dans la bonne direction? Quelle est la meilleure façon de répondre à mes besoins?

Répondre

0

L'objet TROIS.Quatériel contient des méthodes d'interpolation. Calculez donc la valeur de quaternion du visage original, le quaternion que vous obtenez ici à partir de setFromRotationMatrix (ma), puis appliquez THREE.Quaterion.slerp() à plusieurs reprises pour obtenir des entrevous, qui peuvent s'appliquer à cube.quaternion

+0

I 'ai jamais utilisé de slerps avant, donc pour en dire un peu peur :))) La solution que j'ai trouvée est de calculer la différence entre 2 quat avec la formule TransQ = InitQ^-1 * FinQ, où^-1 est ' conjugate() 'fonction. Alors je crée juste une nouvelle matrice, j'applique une rotation et enfin j'applique cette matrice au quat de mon objet avec 'setFromRotationMatrix()'. Le plus dur était de comprendre comment exactement mettre tout ce gâchis. Merci pour le conseil, cependant!) –

Questions connexes