2012-12-02 63 views
0

這是事情。我有一個由6架飛機組成的Object3d組成一個立方體。現在,在基於鼠標輸入應用四元數旋轉後,立方體停止後 - 我需要立方體直接轉向相機的最近側(平面子)。我現在正在做的是獲取Object3d矩陣的當前歐拉角,將旋轉應用到該矩陣,並使用setFromRotationMatrix()函數將其設置回我的對象​​的四元數。有時候這種方法有效(通常在低角度),有時Z軸行爲錯誤(或者Y,或者甚至全部都不能分辨)。Three.js如何將Object3d的子點指向相機?

現在,我當然可以計算出最接近的一面,並將該面的直接四元數應用於我的對象,該對象可以工作,但這不會給我帶來任何動畫效果。

我使用此代碼來獲取我當前的角度:http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37。根據我計算最接近90度的旋轉,每軸:

 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; 
     } 

和應用,爲把我的立方體:

  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); 

什麼我現在的想法是用我的立方體的單獨的平面嘗試(兒童)和基於他們的法線應用lookAt()方法,但不知道如何去做,因爲我需要旋轉整個對象,而不是一個孩子。有人能讓我走向正確的方向嗎?什麼是最好的方式來實現我的需求?

回答

0

THREE.Quaterion對象包含插值方法。因此,計算原始面法線的四元數值,您從setFromRotationMatrix(ma)中獲得的四元數,然後重複應用THREE.Quaterion.slerp()以獲取中間值,這可應用於cube.quaternion

+0

I以前從來沒有用過slerps,所以有點害怕:)))我找到的解決方案是計算兩個季度之間的差異,用公式TransQ = InitQ^-1 * FinQ,其中^ -1是「共軛()'功能。所以然後我創建一個新的矩陣,對它應用旋轉,最後用'setFromRotationMatrix()'將這個矩陣應用到我的對象的四捨五入中。最難的部分是瞭解如何確定這整個混亂。儘管感謝您的建議!) –

相關問題