好了,所以這就是我正在做它:四元數角
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);
謝謝,但我該如何將矩陣/四元數應用於矢量? – William 2010-12-14 02:30:14
對於3x3旋轉矩陣M和列向量V,旋轉向量U由矩陣乘積U = MV給出。 – 2010-12-14 02:39:25
好的,它工作得非常好,但它大約-45度。有什麼辦法解決這個問題?嗯,使-90度關閉 – William 2010-12-14 03:03:55