2010-12-14 102 views
2

好了,所以這就是我正在做它:四元數角

float xrot = 0; 
float yrot = 0; 
float zrot = 0; 

Quaternion q = new Quaternion().fromRotationMatrix(player.model.getRotation()); 
if (q.getW() > 1) { 
    q.normalizeLocal(); 
} 

float angle = (float) (2 * Math.acos(q.getW())); 
double s = Math.sqrt(1-q.getW()*q.getW()); 

// test to avoid divide by zero, s is always positive due to sqrt 
// if s close to zero then direction of axis not important 
if (s < 0.001) { 
    // if it is important that axis is normalised then replace with x=1; y=z=0; 
    xrot = q.getXf(); 
    yrot = q.getYf(); 
    zrot = q.getZf(); 
    // z = q.getZ(); 
} else { 
    xrot = (float) (q.getXf()/s); // normalise axis 
    yrot = (float) (q.getYf()/s); 
    zrot = (float) (q.getZf()/s); 
} 

但它似乎沒有工作,當我試圖把它投入使用:

player.model.addTranslation(xrot * player.speed, 0, zrot * player.speed); 

AddTranslation需要3個數字來移動我的模型超過許多空間(x,y,z),但是我給它上面的數字不會將模型沿着它已經旋轉的方向移動(在XZ平面上)

爲什麼這不起作用?

編輯:新代碼,儘管它現在是大約45度。

Vector3 move = new Vector3(); 
move = player.model.getRotation().applyPost(new Vector3(1,0,0), move); 
move.multiplyLocal(-player.speed); 
player.model.addTranslation(move); 

回答

1
xrot

yrotzrot限定由四元數所指定的旋轉軸線。我認爲你不想在你的addTranslation()呼叫中使用它們......一般來說,這與運動方向沒有任何關係。

我的意思是:你的三維物體 - 比方說爲了爭辯它是一架飛機 - 將在其原始座標 系統中有一定的運動方向。因此,如果原始方位在原點處具有質量中心,並且螺旋槳沿着+ X軸的某個位置,則飛機想要沿+ X方向飛行。

現在介紹一些將飛機旋轉到其他方向的座標轉換。該旋轉通過旋轉矩陣來描述,或者相當於由四元數描述。旋轉後飛機想要移動哪種方式?

你可以找到 ,通過採取在+ X方向上的單位矢量:(1.0,0.0,0.0),然後將所述 旋轉矩陣或四元數到載體中以將其轉換爲新的座標系統 。 (然後按照上面的步驟按速度縮放)。變換後的縮放矢量的X,Y和Z分量 給出了沿每個軸的所需增量運動。該變換後的矢量一般是而不是將成爲四元數的旋轉軸,我認爲這可能是你的問題。

+0

謝謝,但我該如何將矩陣/四元數應用於矢量? – William 2010-12-14 02:30:14

+0

對於3x3旋轉矩陣M和列向量V,旋轉向量U由矩陣乘積U = MV給出。 – 2010-12-14 02:39:25

+0

好的,它工作得非常好,但它大約-45度。有什麼辦法解決這個問題?嗯,使-90度關閉 – William 2010-12-14 03:03:55