2013-08-28 43 views
3

我正在使用libGDX(實際上它相當新穎)和Android。而且我想按照它所面對的方向移動三維物體(使用一定的速度)。我認爲這是一個基本問題,但無法找到一個直接的要求。我有一個四元數表示對象的旋轉(方向),我有一個Vector3表示對象的位置。問題是如何使用來自Quaternion的信息來更新位置Vector3,以便在由Quaternion表示的方向上移動對象。 (另一種方法是從Quaternion中提取滾動節距和偏航,並通過應用三角函數計算得到新的座標系,但我認爲必須有一種方法可以使用Vector3和Quat來實現這一點)。Android。如何將對象朝向它所面向的方向(使用Vector3和四元數)

回答

8

四元數用於指定迴轉。您首先需要指定不旋轉時的方向。例如,如果你想沿X軸移動時不施加旋轉:

Vector3 baseDirection = new Vector3(1,0,0); 

確保基本方向是歸一化(長度= 1),則可以使用nor()方法是安全的:

Vector3 baseDirection = new Vector3(1,0,0).nor(); 

下一步,你需要旋轉使用四元數方向:

Vector3 direction = new Vector3(); 
Quaternion rotation = your_quaternion; 
direction.set(baseDirection); 
direction.mul(rotation); 

現在,你有方向,你可以與你要移動它的量縮放。你可能會想要每幀都做這個,並且取決於自上一幀以來的時間。

final float speed = 5f; // 5 units per second 
Vector3 translation = new Vector3(); 
translation.set(direction); 
translation.scl(speed * Gdx.graphics.getDeltaTime()); 

最後,您需要翻譯添加到位置

position.add(translation); 

當然,這取決於你的實際的實施可以分批多次操作,例如:

translation.set(baseDirection).mul(rotation).scl(speed * Gdx.graphics.getDeltaTime()); 
position.add(translation); 

更新: 從Xoppa評論中添加工作代碼:

translation.set(baseDirection).rot(modelInstance.transform).nor().scl(speed * delta) 
+0

Hi Xoppa!謝謝你的回答。它看起來像我一直在尋找的東西。但不幸的是,它不能按預期工作。我用你的代碼,我得到奇怪的結果。我的對象開始向右(X軸)。然後我繞Z軸旋轉35度。該物體看起來有點向上。我應用你的代碼,並期待對象向右和向上移動。但是它被移到了右邊,並且位置非常小。 35度應該給dY/dX = 0.7(tan(35))。你能幫忙嗎? – Taras

+0

你好再一次Xoppa。經過一番調查後,我感覺到我得到的Quaternion有問題。我在Rajawali(3d引擎)中創建了相同的場景。將物體旋轉相同的35度。並用你的代碼使用它們的四元數。它像一個魅力。 dY/dX = 0.7。無瑕。所以答案是正確的。但是我從libgdx得到的四元數是錯誤的(與Rajawali工作的數值相比,錯誤值))。我使用它:modelInstance.transform.getRotation(quaternion)。這是正確的方法嗎? – Taras

+1

你模型實例是否縮放? iirc可以直接使用Matrix4旋轉Vector3,因此您可以跳過四元數direction.set(baseDirection).rotate(modelInstance.transform).nor()'。或者如果你使用後一種方法:'translation.set(baseDirection).rotate(modelInstance.transform).nor().scl(speed * delta)'。請注意,我不知道'rotate()'方法,它可能被稱爲'rot()'(但不是'mul()')。 – Xoppa