2015-02-06 57 views
0

我正在爲我的Android應用程序使用LibGDX。我需要沿樣條線移動和定向3D對象(ModelInstance)。在我的情況下,它是CatmullRomSpline。我得到了運動的工作,但是沿着樣條線定位了ModelInstance方面存在問題。Android。 LibGDX。如何沿樣條線移動和定向3D對象

我的代碼:

public void update() { 
    float t = SPEED * Gdx.graphics.getDeltaTime(); 
    elapsedTime = elapsedTime + SPEED * Gdx.graphics.getDeltaTime();  

    //Movement 
    catmull.valueAt(value, elapsedTime); 
    myObject3d.transform.setTranslation(value); 

    //Rotation 
    derivative = catmull.derivativeAt(derivative, t); 
    derivative = derivative.nor(); 

    //Tried to bring object into default position before rotating 
    //Vector.X - is the default direction of my Object - facing right 
    //myObject3d.transform.rotate(Vector3.X, Vector3.X); 

    myObject3d.transform.rotate(derivative, Vector3.X);    
} 
+1

嘗試'myObject3d.transform.setToRotation(derivative,Vector3.X).trn(value);'。請注意,儘管存在旋轉的無限可能性。根據樣條曲線的不同,您可能還需要一個「向上」和/或「向右」的向量。 – Xoppa 2015-02-06 17:10:30

+0

謝謝!會嘗試讓你知道結果。 – Taras 2015-02-08 20:25:55

+0

嗨。我嘗試過這個。這比以前好多了。對象沿着樣條線旋轉。但實際的方向是錯誤的。我的對象最初面對着X軸。所以我期望setToRotation(派生,Vector3.X)將使我的對象的臉看向導數的方向。還是我在這裏錯了?我還記得有LibGDX demo/exmaple,其中一個3D箭頭導航樣條線。這很容易完成。就像一些遵循路徑的功能一樣。現在找不到它:(你能幫忙嗎? – Taras 2015-02-09 10:31:42

回答

1

Matrix4#rotate方法有兩個參數,basetarget。在你的情況下,基矢量應該是Vector3.X,而目標是derivative。你需要交換這個參數。此外,Matrix4#rotate方法將旋轉後乘以現有旋轉。或換句話說:這將在每次通話中積累絕對輪換。您可能想要使用Matrix4#setToRotation方法,它會在每次調用時重置旋轉(清除矩陣)。

myObject3d.transform.setToRotation(Vector3.X, derivative); 
myObject3d.transform.setTranslation(value); 

雖然這可能會在大多數情況下,您可能會收到意外的結果取決於路徑。就像所說的那樣,無限的旋轉將導致這個方向。因此,最好使用兩個額外的矢量來指定向上(Y)和向右(Z)向量。

right.set(Vector3.Y).crs(derivative).nor(); 
up.set(right).crs(derivative).nor(); 
myObject3d.transform.set(derivative, up, right, position).rotate(Vector3.X, 180); 

這裏叉積來計算向右和向上矢量,假設其中該Vector3.Y通常接近向上矢量。然後使用Matrix4#set方法來設置矩陣以反映這些值。第一個參數指定「新」X軸,第二個參數指定「新」Y軸,第三個指向「新」Z軸,最後一個參數指定平移(位置)。

這裏有一個工作示例:https://gist.github.com/xoppa/7558c0c75e9534795e9f

雖然無關,請記住,path.valueAt方法使用0 <= t <= 1。換句話說,您的代碼中的telapsedTime)不應低於0或高於1.

+0

除了當我做了花鍵掉頭(所以我的對象可以掉頭),我的對象開始做奇怪的旋轉,即使樣條是直的在你的例子中嘗試了代碼 - 在所有的階段都完全不同步,我的對象被扭曲了,並且朝着錯誤的方向轉動(但是奇怪的旋轉已經消失),我會添加圖片,不知道把它們放在哪裏?也許更新這個問題? – Taras 2015-02-11 08:16:50

+0

我爲此創建了另一個問題http://stackoverflow.com/questions/28450272/android-lidgdx-following-catmullrom-spline-produces-weird-results-in- 3d – Taras 2015-02-11 09:04:53

+1

如果它傾斜了,那麼你可能還需要在交叉產品之後對向量進行歸一化。爲了修復旋轉(例如,如果它是顛倒的),你可以添加一個額外的旋轉,我已經更新了答案以反映這一點。 – Xoppa 2015-02-11 17:36:00