我正在使用libGDX(實際上它相當新穎)和Android。而且我想按照它所面對的方向移動三維物體(使用一定的速度)。我認爲這是一個基本問題,但無法找到一個直接的要求。我有一個四元數表示對象的旋轉(方向),我有一個Vector3表示對象的位置。問題是如何使用來自Quaternion的信息來更新位置Vector3,以便在由Quaternion表示的方向上移動對象。 (另一種方法是從Quaternion中提取滾動節距和偏航,並通過應用三角函數計算得到新的座標系,但我認爲必須有一種方法可以使用Vector3和Quat來實現這一點)。Android。如何將對象朝向它所面向的方向(使用Vector3和四元數)
3
A
回答
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)
相關問題
- 1. 將攝像頭朝向它所面向的方向
- 2. 將對象朝向它的方向移動? C#
- 3. 使用2d html5Canvas和ctx.rotate函數將對象移動到其朝向的方向
- 4. 使SCNText對象始終朝向前方
- 5. 將對象朝向觸摸點旋轉
- 6. 面對和朝向有什麼區別?
- 7. Monogame朝着方向
- 8. 歐拉角和四元數方向
- 9. Vector3的方向不影響
- 10. android中的面向對象的方法
- 11. 如何使用面向對象的PHP
- 12. 面向對象的方式使用jQuery
- 13. 面向對象的方法使用ColdFusion
- 14. 如何將Vector3轉換爲四元數?
- 15. 方向,方向對象
- 16. 面向對象的Tkinter函數 - 我將如何把它放在?
- 17. 如何在面向對象的方式
- 18. UIViewController和方向是我朝着正確的方向?
- 19. 面向對象和非面向對象之間的區別javascript
- 20. 矢量(0,0,0)面朝什麼方向?
- 21. 是否有任何Google多段線地圖對象朝向哪個方向?
- 22. android面向對象編程
- 23. 如何計算屏幕朝向的方向
- 24. 如何讓英雄滑塊始終朝向相同的方向
- 25. iOS示例「GLPaint」無法支持朝向縱向,縱向朝下
- 26. 「面向對象」方案
- 27. 如何將向量和四元數映射到特定的gameObjects?
- 28. 編輯腳本使角色朝着他所面對的方向移動
- 29. 使用面向對象的Python對象進行面向對象或精化
- 30. 使物體朝正確的方向看?
Hi Xoppa!謝謝你的回答。它看起來像我一直在尋找的東西。但不幸的是,它不能按預期工作。我用你的代碼,我得到奇怪的結果。我的對象開始向右(X軸)。然後我繞Z軸旋轉35度。該物體看起來有點向上。我應用你的代碼,並期待對象向右和向上移動。但是它被移到了右邊,並且位置非常小。 35度應該給dY/dX = 0.7(tan(35))。你能幫忙嗎? – Taras
你好再一次Xoppa。經過一番調查後,我感覺到我得到的Quaternion有問題。我在Rajawali(3d引擎)中創建了相同的場景。將物體旋轉相同的35度。並用你的代碼使用它們的四元數。它像一個魅力。 dY/dX = 0.7。無瑕。所以答案是正確的。但是我從libgdx得到的四元數是錯誤的(與Rajawali工作的數值相比,錯誤值))。我使用它:modelInstance.transform.getRotation(quaternion)。這是正確的方法嗎? – Taras
你模型實例是否縮放? iirc可以直接使用Matrix4旋轉Vector3,因此您可以跳過四元數direction.set(baseDirection).rotate(modelInstance.transform).nor()'。或者如果你使用後一種方法:'translation.set(baseDirection).rotate(modelInstance.transform).nor().scl(speed * delta)'。請注意,我不知道'rotate()'方法,它可能被稱爲'rot()'(但不是'mul()')。 – Xoppa