2016-03-30 32 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のラジアン)で除算してもよろしいですか? – Krab

+0

render()メソッドが1/60秒(ish)ごとに1回呼び出されるため、なぜ制御不能になっているのかについて考えられる1つの理由が考えられます。それはあなたがしたいことを考えれば非常に非常に速いです。代わりに、デルタ時間を使用して、フレームごとのローテーションの変更を調整することができます。ここでデルタを使用する方法の良い例です: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などの一部のプラットフォームでhick-upsを作成するためです。したがって、メソッドが呼び出されるたびに新しいVector3を作成するのではなく、再利用するクラスのインスタンスを指定することができます。この理由から、libの中に複数の場所でこのパターンが表示されます。

なぜVector3.Yを変更しても役に立たず、あらゆる種類の問題が発生する可能性がありますか?これは、Vector3クラスが可変であり、メンバーをカプセル化しないためです。実際には、の代わりにvector.setX(vector.getX() + 3);と呼ぶことを余儀なくされます。これは、可読性とパフォーマンスの両方の理由からです(後者はターゲットプラットフォームによって異なる可能性があります)。また、javaはconstに相当するものをサポートしていません。

+0

ありがとう、それは今動作します。また、getTranslationがどのように動作するのかを説明してくれてありがとうございます。コードをダンプするだけでなく、最初は動作しませんでしたが、カメラがそれに頼っていることに気付きました。 – Boskop88

関連する問題