2014-02-07 123 views
0

我需要軸和旋轉角度3 固定軸。 我想什麼:圍繞固定軸的3D旋轉

輸入

  • 角度阿爾法(旋轉輪固定x軸)
  • β角(旋轉輪 固定y軸)
  • 角度伽瑪(旋轉輪固定z軸)

輸出中

  • 與角

問題旋轉軸是我總是繞旋轉已經軸線。 到目前爲止我的代碼:

var q1 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 0, 1), alpha) 
var q2 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(1, 0, 0), beta) 
var q3 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 1, 0), gamma) 

var qr = q1.multiply(q2); 
qr = qr.multiply(q3); 
var r = qr.toAxisAngle(); 

this.curNode.attr('rotation', r[0].x + ' ' + r[0].y + ' ' + r[0].z + ' ' + r[1]); 

Video:只有一個旋轉圍繞環(紅色)是正確的。另外兩個圍繞旋轉的對象軸。他們應該是在固定

+0

你的代碼有什麼問題?你是否試圖扭轉旋轉順序? –

+0

這是更多的數學問題 – daniel

+0

我仍然沒有看到你的問題。 –

回答

0

我認爲,它很好地解釋wiki只有而不是正常的兩個回合,你有三個。所以,你必須乘以2,而不是三個矩陣。就這些。

0

問題是你正在旋轉本地節點軸,以mantani軸固定你需要使用反四元數的節點,但只爲節點,計算旋轉,你需要使用原來的四元數。就像這樣:

var q1 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 0, 1), alpha) 
var q2 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(1, 0, 0), beta) 
var q3 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 1, 0), gamma) 

var qr = q1.multiply(q2); 
qr = qr.multiply(q3); 
var r = qr.toAxisAngle(); 

r = r.inverse(); 

this.curNode.attr('rotation', r[0].x + ' ' + r[0].y + ' ' + r[0].z + ' ' + r[1]); 

如果你想恢復之前的節點值,則必須顛倒它來計算它,並倒轉結果再次使用它的節點。