LibGDX を使用して構築されたアプリケーションで、カメラを回転させたり、ユーザーが移動したり、ズームしたりできるようにする必要がある状況になりました。カメラを移動およびズームするためのカメラ コントロールは美しく機能しますが、カメラを回転させると、その回転に基づいてカメラが移動します。たとえば、カメラが左に 45 度回転している場合、ユーザーがカメラを移動するために右にドラッグすると、カメラの右側が現在指している場所であるため、カメラは右上に向かって移動します。代わりに、回転に関係なく、カメラが画面/ユーザー入力に対して常に移動する必要があります。
この問題の解決策は 1 つあります。それは、現在使用しようとしている「ウィンドウ座標」に基づくのではなく、単純に「ワールド座標」を使用してカメラを配置することです。ただし、これにより、カメラがかなり途切れ途切れになり、ズームシステムに問題が発生するため、非常に不快なユーザーエクスペリエンスが作成されます. これらの問題は、多くの微調整で修正できると思いますが、ウィンドウ座標を使用すると非常にスムーズになるため、その方法を使用したいと思います。
この一見単純な問題に対するエレガントな解決策があると思います。行列またはそれらの線に沿った何かで簡単な計算を行うことができますが、OpenGL に関する私の知識はまだかなり不足しており、正確に何が必要なのかを理解できないようです。それを修正します。OpenGL とこのすべての行列に詳しい人からのアイデアは大歓迎です!
===編集===
ここで値を保持するために使用されるオブジェクトは、基本的に、アプリケーションの別の部分で必要とされた私自身のバージョンの Vector2 です。そこにある0.7fの正確な理由はよく覚えていませんが、おそらくムーブメントの感度を下げるためであり、それを削除しても問題は解決しません.
camera.position.set(cameraStartPosition.getX() - ((zoomCurrentPosition.getX() - zoomStartPosition.getX()) * 0.7f), cameraStartPosition.getY() + ((zoomCurrentPosition.getY() - zoomStartPosition.getY()) * 0.7f), 0);
cameraStartPosition - ユーザーがカメラを動かし始めたときのカメラの X 座標と Y 座標。
zoomStartPosition - ズームを開始する最初のタッチの X 座標と Y 座標
zoomCurrentPosition - ズームを制御するタッチが現在ある X 座標と Y 座標
これらの x 値と y 値は、 touchDown メソッドと touchDragged メソッドから直接取得されます。代わりに、次のコードの後にそれらを設定するコードを配置すると、元の投稿で言及した問題が発生し、本来の方法で移動しますが、非常に途切れます。
Vector3 vector = new Vector3(x, y, 0);
camera.unproject(vector);
x = (int) vector.x;
y = CanvasAnywhereMain.HEIGHT - (int) vector.y;