2016-04-19 6 views
1

私は、2D空間の入力がどのように回転するかに基づいて、回転させたいオブジェクトを2D空間に持っています。基本的には、指やマウスを画面上で時計回りまたは反時計回りに動かすと、オブジェクトは指の回転方向に相対的に回転します。オブジェクトの位置はまったく重要ではありません。つまり、回転は指の動きからオブジェクトに変換されるだけであり、オブジェクトの位置と指の移動位置の間には関係がありません。デルタx、yタッチまたはマウスの動きに基づいて回転度を計算する

libGdxを使用していますが、メソッド「touchDragged」の呼び出しでXとYのデルタ移動(移動方向に応じて正の整数と負の整数)が得られます。

このデルタXとYを使用して、オブジェクトに適用できる移動度を計算する方法を教えてください。好ましくは、私はちょうどラジアンまたは度の値に追加したいと思います。

1つの軸だけを使用すると問題なく動作します。私。指を上下に動かしたり、時計回りまたは反時計回りに回転させたりします。私の問題は、XとYの両方の動きの結果として動作するようになっていることです。

PS:この質問を投稿する前に少し調べてみましたが、同様の質問がありますが、それに基づいてそれを理解することはできませんでした。なぜ私は正確に分かりませんが、異なる質問がすべて私とは異なるそれぞれのユースケースに取り組んでいるように思えました。

+0

[GestureDetector](https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.html)と[GestureListener](https:// libgdx。 badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/input/GestureDetector.GestureListener.html)クラスとthis [post](https://github.com/libgdx/libgdx/wiki/Gesture-detection) – Hllink

+0

はい、GestureListenerは、パンやピンチなどにいくつか余分なものを追加しますが、回転メソッドがないので、実際には私の問題には役立ちません。 – simernes

答えて

2

[EDIT:Barodaprideで述べたように、libgdxベクトル2 API Vector2.angle(ベクトル2参照)を提供し、既にあなたにフロート角値を返しますが、それはフードの下で何が起こっているかを知って良いことだ]

デカルト座標を極座標にして、あなたのデカルト座標系の軸の位置が0,0になるようにしてください。今はテストできませんが、私が書いた次のコードで考えてみましょう。this参照:

public boolean touchDragged(InputEvent event, float posX, float posY, int pointer){ 
    //Declare and get the position of your axis (in screen coords, you can get that by camera.project() 
    Float axisX,axisY; 
    axisX = getAxisX(); 
    axisY = getAxisY(); 
    //Transform the clicked position to the cartesian plane given the axis 
    Float cartesianX,cartesianY; 
    cartesianX = posX-axisX; 
    cartesianY = posY-axisY; 
    //Calculate de radius 
    Float radius = Math.sqrt(cartesianX * cartesianX + cartesianY * cartesianY); 
    //Get the angle in radians 
    Float angleInRadians = Math.acos(cartesianX/radius); 
    //Get the angle in degrees 
    Float angleInDegrees = angleInRadians *57.2958; 
    return true; 
} 

逆の場合、giからx、yを得るVEN半径と角度:

double x = getAxisX() + Math.cos(angleInRadians) * radius; 
double y = getAxisY() + Math.sin(angleInRadians) * radius; 
+0

getAxis()はここで何をしていますか?それはなぜ必要なのですか?また、私は、touchDraggedが位置を提供していないが、最後のtouchDraggedが呼び出されて以来の移動のデルタを指摘したいと思います。デルタではなくポジションを使用しているようです。 これを行うためにデルタだけを使用することはできません。また、onTouchDownイベントの開始位置を使用する必要がありますか? – simernes

+0

あなたのオブジェクトの位置をスクリーンに投影し、それらの2つのベクトルの間の角度を計算するには、同じ平面上のemの位置で作業する必要があります.Bardaprideで指定したVector APIを使用してください。 – Hllink

+0

私は間違っているそれがポジションを提供していないと言って、それを指摘したいだけでした。 – simernes

1

は、x軸にベクトルの角度を取得するために)XとY使用Vector2.angle(差からベクトル2を作ります。その角度をスプライトオブジェクトに適用します。

Vector2 API

0

(x軸からの角度差を見つけ)Math.atan2(y, x);を使用して、[X1、Y1]を[X0、Y0]から角度を取得する最も簡単な方法。

本質的に、あなたはこのようなことをすることができます。

//direction from old to new location in radians, easy to convert to degrees 
dir = Math.atan2(dy, dx); 

(今日はまっすぐに考えていない、寒さを持って、これはちょうどそれを反転するPIまたは180°またはW/Eを追加した場合には正反対の方向を、与えるかもしれません)。

関連する問題