タグ付けされた質問 「quaternion」

数学的構造、数体系。3Dグラフィックでは、クォータニオンがベクトルや行列と共に使用されます。四元数の利点の1つは、ベクトルと行列に固有のいくつかの回転問題(ジンバルロックと呼ばれる)を克服することです。

3
球面上のルート-測地線を見つけますか?
私は、2Dマップ上を移動できるブラウザベースのゲームで友人と作業しています。ほぼ7年になりますが、まだこのゲームをプレイしているので、何か新しいものを提供する方法を考えています。それ以来、ゲームマップは制限された平面であり、人々は(0、0)から(MAX_X、MAX_Y)に量子化されたXとYの増分で移動できます(大きなチェス盤と想像してください)。 私たちはそれを別の次元にする時が来たと信じているので、ほんの数週間前に、ゲームが他のマッピングでどのように見えるか疑問に思い始めました: 継続的な動きのある無制限の飛行機:これは一歩前進かもしれませんが、それでも私には確信がありません。 トロイダルワールド(継続的または量子化された動き):以前はトーラスを使用して作業してきましたが、今回はもっと何かを求めています... 連続的な動きのある球形の世界:これは素晴らしいことです! 我々が望むものを ユーザーのブラウザは球面マップ上の各オブジェクトの(緯度、経度)のような座標のリストを与えられています。ブラウザは、これをユーザーの画面に表示して、Web要素内にレンダリングする必要があります(キャンバスでしょうか?これは問題ではありません)。人々が飛行機をクリックすると、(mouseX、mouseY)を(lat、lng)に変換し、現在のユーザーの位置からクリックされたポイントまでのルートを計算する必要があるサーバーに送信します。 私たちは 、回転行列、四元数、オイラー角、平行移動などを操作するための多くの有用な数学を備えたJavaライブラリの作成を開始しました。それらをすべてまとめて、球点を生成し、それらをレンダリングしてユーザーに表示するプログラムを作成しましたJPanel内。クリックをキャッチして球面座標に変換し、ビューの回転、スケール、変換などの他の便利な機能を提供することができました。現在、クライアントとサーバーの相互作用をシミュレートする小さな(非常に小さな)エンジンのようになっています。クライアント側は画面上のポイントを表示し、他の相互作用をキャッチし、サーバー側はビューをレンダリングし、現在の位置とクリックされたポイントの間のルートを補間するような他の計算を行います。 問題はどこだ? 明らかに、2つのルートポイント間を補間する最短パスが必要です。クォータニオンを使用して、球の表面上の2点間を補間します。これは、球の表面上で最短経路が得られないことに気付くまで、問題なく機能するように見えました。 問題は、ルートがX軸とY軸を中心とした2つの回転の合計として計算されることでした。そこで、目的地のクォータニオンの計算方法を変更しました。方向と呼ばれる3番目の角度(1番目は緯度、2番目は経度、3番目は現在の位置を指すベクトルを中心とした回転)を取得します。これで「向き」の角度ができたので、Z軸を回転し、結果のベクトルを宛先クォータニオンの回転軸として使用します(回転軸は灰色で表示されます)。 取得したのは正しいルートです(大きな円上にあることがわかります)。ただし、これはルートの始点が緯度、経度(0、0)にある場合にのみ取得されます。つまり、開始ベクトルは(sphereRadius、0)です。 、0)。以前のバージョン(画像1)では、開始点が0、0であっても良い結果が得られないため、解決策に向かっていると思いますが、このルートを取得するために実行する手順は少し「奇妙です」 " 多分? 次の画像では、開始点が(0、0)ではない場合に発生する問題のビューが表示されます。これは、開始点が(sphereRadius、0、0)のベクトルではなく、目的点を確認できるためです。 (正しく描かれています!)はルート上にありません。 マゼンタポイント(ルート上にあるもの)は、(-startLatitude、0、-startLongitude)の球の中心を中心に回転したルートの終点です。つまり、回転行列を計算してルート上のすべてのポイントに適用すると、実際のルートが得られる可能性がありますが、これを行うにはもっと良い方法があると思い始めます。 たぶん私は球の中心とルートポイントを通る平面を取得し、それを球と交差させて測地線を取得しようとする必要がありますか?しかし、どうやって? あまりにも冗長で、多分間違った英語で申し訳ありませんが、これは私の心を吹き飛ばしています! 編集: 以下のコードは問題なく動作します!みんなに感謝: public void setRouteStart(double srcLat, double srcLng, double destLat, destLng) { //all angles are in radians u = Choords.sphericalToNormalized3D(srcLat, srcLng); v = Choords.sphericalToNormalized3D(destLat, destLng); double cos = u.dotProduct(v); …

2
ボーンが指定された方向を指すようにクォータニオンを計算する
この質問を解決するために、ソースポーズの各ジョイントの絶対(ワールドスペース)方向を(正規化された単位ベクトルとして)把握し、ターゲットのジョイントを回転させてその方向に合わせることにしました。問題は、ボーン(ジョイントからその子へのベクトル)がワールド空間で指定された方向になるように回転クォータニオンを計算する方法です。 更新:これが私の現在の考えです。ボーンごとに、変換行列は次のようになります。 (1) absolute transform = local rotation * relative transform to parent in bind pose * parent absolute trasform したがって、3つの関節があるとします:肩->肘->手首。肩の絶対変換が既にあり、肘->手首がソースアニメーションと同じ方向になるように肘の回転を計算しようとしています。(1)から、絶対変換は次のようになります。 (2) ELBOW absolute = ELBOW local * SHOULDER to ELBOW relative * SHOULDER absolute (3) WRIST absolute = WRIST local * ELBOW to WRIST relative * ELBOW absolute 代入すると、次のようになります。 …

2
オブジェクトの回転と平行移動にデュアルクォータニオンを正しく使用するにはどうすればよいですか?
これまでは、回転に通常のクォータニオンを使用し、移動にベクトルを使用して、特定のオブジェクトの回転と移動を個別に処理していました。ただし、後でリジッドボディダイナミクスに使用する予定があるため、オブジェクトの移動と回転の両方を処理するためにデュアルクォータニオンを使用したいと思います。基本的にそれが欲しいので、最初のデュアルクォータニオンを持つオブジェクトを作成し、このデュアルに、変位の変化を表す2番目のデュアルクォータニオンを掛けて、変更が適用された後の最終的な位置を表す3番目のデュアルクォータニオンで終わります。特定のオブジェクト(例として球体を使用します)が自身の重心を中心にローカルに回転し、グローバルに移動するようにします。これは、デュアルクォータニオンを使用して達成されたと思われるタイプのモーションのビデオです。 http://www.youtube.com/watch?v=k9I7Bbj02O8 残念ながら、この例のソースコードへのリンクは読み込まれません。今、私はこれを数回動作させようとしましたが、変位しているオブジェクト(ここでも球体)はグローバルに移動しますが、ローカルには回転しませんか、ローカルに回転しますがグローバルには移動しません(その動きは、回転します)。基本的にこれは私がやっていることを要約しています: 1)プログラムの最初に、位置と回転を表す最初のデュアルクォータニオンを持つオブジェクトがあります(このクォータニオンをQ1と呼びます)。 2)オブジェクトの回転速度または並進速度を変更します。これから、回転と加速度の変化を表す2番目の四元数Q2を計算します。 3)次に、2つの四元数を乗算します(この時点では両方の乗算の次数を試しましたが、正しい次数はQ2 * Q1になるはずです)。それらを乗算するために使用している式は、Q1 * Q2 = r1 * r2 + e(r1 * d2 + d1 * r2)です。 4)この時点で、オブジェクトの新しい位置と方向を説明する3つ目のデュアルクォータニオンがあります。双対の実数部はその向きを表すクォータニオンであり、双対部は式t = 2 * dual *(real ')を使用して変換ベクトルに変換できます。ここで、実数'は3番目の双対の実数部の共役です。四元数。 ただし、この方法では希望する結果が得られません。私が得ている結果は予測可能です。それらは、私が探しているタイプではありません。つまり、ローカルローテーションですが、グローバル変換です。誰かがこれを行う正しい方法を教えてもらえますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.