2014-11-23 70 views
2

我試圖圍繞另一個對象旋轉對象,同時保持自己的旋轉。我有每個對象旋轉完成即時通訊只是不知道如何旋轉另一個對象周圍的對象。例如,我有一個名爲Planets [Sun,Mercury]的數組。我想讓太陽靜止不動,讓水銀在一個軸上圍繞太陽旋轉。webgl在一個座標軸上圍繞另一個對象旋轉對象

目前我有太陽和水銀自行旋轉,這是由: 首先改變弧度弧度。

function degToRad(degrees) 
    { 
     return degrees * Math.PI/180; 
    } 
我drawScene函數

然後()我旋轉矩陣:

mat4.rotate(mvMatrix, degToRad(rCube), [0, 1, 0]); 

,然後最後當我動畫場景我移動使用對象:

var lastTime = 0; 

    function animate() { 
     var timeNow = new Date().getTime(); 
     if (lastTime != 0) 
     { 
      var elapsed = timeNow - lastTime; 
      rCube -= (75 * elapsed)/1000.0; 
     } 

     lastTime = timeNow; 
    } 

反正我有可以將原點傳遞到

mat4.rotate(mvMatrix, degToRad(rCube), [0, 1, 0]); 

使它像:

mat4.rotate(mvMatrix, ObjectToRotateAround, degToRad(rCube), [0, 1, 0]); 

我感覺好像我沒有解釋我的代碼。如果你想看看它可以在這裏找到: https://copy.com/iIXsTtziJaJztzbe

回答

0

我認爲你需要做一個矩陣操作序列和矩陣操作的順序很重要。

在這種情況下,您可能需要的是先將水星轉化爲Sun的位置,然後進行旋轉,然後進行第一次翻譯。我自己還沒有實現分層對象,所以我不想混淆你。但這裏是我實現軌道攝像機的代碼偏航功能可使相機圍繞目標點,你會發現它有用:

yaw: function(radian){ 
     this.q = quat.axisAngle(this.q, this.GLOBALUP, radian); 
     vec3.rotateByQuat(this.dir, this.dir, this.q); 
     vec3.cross(this.side,this.GLOBALUP,this.dir); 
     vec3.normalize(this.side,this.side); 

     this.pos[0] = this.target[0] - this.dir[0] * this.dist; 
     this.pos[1] = this.target[1] - this.dir[1] * this.dist; 
     this.pos[2] = this.target[2] - this.dir[2] * this.dist; 
} 

凡this.dir是單位向量總是從指明瞭方向照相機瞄準並且this.dist是照相機和目標之間的距離。您可以使用矩陣旋轉而不是四元數旋轉。

編輯:只需添加方向可以通過取兩個對象的位置差異來計算,然後對其進行歸一化。