2016-03-30 61 views
0

問題:我的播放器模型應該轉變爲最後一次鼠標點擊的方向,但不是慢慢轉動,它會以各種可能的方式旋轉(遊戲具有等軸視圖,模型應該是僅圍繞Y軸旋轉,但也圍繞X軸和Z軸旋轉)。Java/libgdx 3D模型旋轉錯誤

以下方法(稱爲渲染())負責模型的轉彎行爲:

public static void turnUnit(){ 
    if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){ 
     mX = Gdx.input.getX(); 
     mY = Gdx.input.getY(); 
     angle = (float) (180+Math.atan2(mX-Gdx.graphics.getWidth()/2, mY-Gdx.graphics.getHeight()/2)*(180/Math.PI)); 

     newAngle = ((((currentAngle - angle) % 360) + 540) % 360) - 180; 
     turning = newAngle/60*turnRate; 

     currentAngle = currentAngle-turning; 
    } 
    TestGround.player.transform.setToRotation(Vector3.Y, currentAngle).setTranslation(posX,0,posZ); 
} 

和運行法(也稱爲渲染()):

public static void movement(){ 
    if(northM==true){ 
     TestGround.player.transform.trn(0,0,-1f); 
    } 
    if(southM==true){ 
     TestGround.player.transform.trn(0,0,1f); 
    } 
    if(westM==true){ 
     TestGround.player.transform.trn(-1f,0,0); 
    } 
    if(eastM==true){ 
     TestGround.player.transform.trn(1f,0,0); 
    } 

    posX = TestGround.player.transform.getTranslation(Vector3.X).x; 
    posY = TestGround.player.transform.getTranslation(Vector3.Y).y; 
    posZ = TestGround.player.transform.getTranslation(Vector3.Z).z; 

} 

試圖在最後一行使用「旋轉」,但它只是旋轉得更快。

此外,即使這對我來說沒有意義,但經過一些測試後,似乎移動方法會干擾轉動方法(沿特定方向移動將以某種方式旋轉模型)。

我在這裏做了一些根本性的錯誤嗎?

附加信息:

  • 原來我用簡單的投票來獲得所有鍵盤和鼠標輸入
  • 計算的移動/旋轉在一個大的方法,一切工作 精細
  • 決定使用的inputprocessor libgdx使代碼更具可讀性和開放性
+0

我剛剛看到180/Math.PI - 你確定要用180(180弧度)來分割180嗎? – Krab

+0

爲什麼你失去控制可能是因爲render()方法每1/60(ish)秒被調用一次。考慮到你想要做什麼,這是非常非常快的。相反,您可能需要使用增量時間來緩和每個幀的旋轉變化。下面是如何使用德爾塔的一個很好的例子:http://stackoverflow.com/questions/22405390/delta-value-in-render-method-libgdx?answertab=votes – Fish

+0

Krab:是的數學有一種不可思議,但newAngle中的計算修復了所有可能的問題 魚:好的,我會嘗試deltatime,如果它有效,我會報告回來。也許我原來的代碼真的很慢,這就是爲什麼它沒有失去控制? – Boskop88

回答

0

Matrix4#getTranslation(Vector3)方法將設置指定向量爲轉換矩陣的組件並將其返回以進行鏈接。這意味着您將作爲參數提供給TestGround.player.transform.getTranslation(vector)方法的向量將被設置(讀取:覆蓋)到模型實例的翻譯(位置)。

所以,在通話的情況下:

TestGround.player.transform.getTranslation(Vector3.Y) 

這將切實從默認[x:0, y:1, z:0],對什麼矩陣的平移組件設置爲修改Vector3.Y變量。這將導致使用Vector3.Y變量的任何其他呼叫(例如您對setToRotation的呼叫)的行爲不同。

爲了解決這個問題,你可以修改的最後幾行:

Vector3 pos = new Vector3(); 
TestGround.player.transform.getTranslation(pos); 
posX = pos.x; 
posY = pos.y; 
posZ = pos.z; 

請注意,您應該移動Vector3創建出來的方法和爲此還不如去掉posXposYposZ成員贊成pos成員。

所以,你可能想知道兩個問題:

爲什麼getTranslation方法修改它的參數?這是因爲libGDX旨在避免創建垃圾,因爲這會在某些平臺(如Android)上創建垃圾回收。因此,每次調用方法時都不會創建新的Vector3,而是允許您指定要重用的那個類的實例。由於這個原因,您會在多個地方看到這種模式。

爲什麼甚至有可能修改Vector3.Y,使其無用並導致所有類型的問題?這是因爲Vector3類是可變的,並且不封裝其成員。所以幾乎可以讓你做vector.x += 3;,而不是強迫你致電vector.setX(vector.getX() + 3);。這是出於可讀性和性能原因(儘管後者可能會在您的目標平臺上有所不同)。另外,java不支持與const相媲美的東西。

+0

謝謝你,現在有效。此外,感謝您解釋getTranslation是如何工作的,而不僅僅是傾銷代碼(最初沒有工作,但後來我意識到相機也依賴於它)。 – Boskop88