問題タブ [quaternions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
6758 参照

math - 回転軸ベクトルの結合

趣味のゲーム エンジンで回転に軸角度ベクトルを使用して実験しています。これは、ラジアン単位の回転の長さを持つ、回転軸に沿った 3 成分ベクトルです。私が好きな理由:

  • quats や回転行列とは異なり、実際に数字を見て、頭の中で回転を視覚化できます
  • それらは四元数や行列よりもメモリが少し少ないです。
  • -Pi から Pi の範囲外の値を表すことができます (これは、角速度を保存する場合に重要です)

ただし、角速度に基づいてすべてのオブジェクト (数万) の回転を更新するタイトなループがあります。現在、2 つの回転軸ベクトルを結合する唯一の方法は、それらをクォータニオンに変換し、乗算してから、結果を軸/角度に戻すことです。プロファイリングを通じて、これがボトルネックであることを特定しました。もっと簡単なアプローチを知っている人はいますか?

0 投票する
1 に答える
593 参照

math - レート マッチングによるクォータニオン補間

私は、方向と体軸のそれぞれについての回転速度を備えたオブジェクトを持っています。この状態から別のレート セットを持つ 2 番目の状態へのスムーズな遷移を見つける必要があります。さらに、各軸を中心に回転/加速できる速度に制限があります。

私は Quaternion slerp を調査しました。それらを使用して状態間をスムーズに補間することはできますが、レート マッチングを取得する簡単な方法はわかりません。

これは微分方程式と経路計画の演習のように感じますが、そこにあるアルゴリズムが機能するように問題を定式化する方法が正確にはわかりません.

これを解決するのに役立つアルゴリズムの提案や、これらのアルゴリズムで問題を解決するためのヒントをいただければ幸いです。

[編集 - これは私が取り組んでいる問題のタイプの例です]

ヘリコプターが飛行しているときにターゲットを追跡する必要があるヘリコプターの砲手について考えてみてください。議論のために、彼は目標が地平線上に昇る時からそれが見えなくなる時まで目標にいる必要があります。このターゲットの相対レートは一定ではありませんが、いくつかの「レート マッチング」操作を集約することで、この追跡をかなりうまく近似できると思います。いつでも必要な銃の向きと追跡速度を計算できます。それは、私を困惑させているいくつかの個別の向きと速度からプロファイルを生成するだけです。

ありがとう!

0 投票する
2 に答える
1195 参照

c++ - マヤのような回転を取得するには?

プロジェクトで Maya と同じ回転効果を実現しようとしています。四元数とトラックボールの例についてある程度の知識があります。

残念ながら、クォータニオンを使用して目的の効果を得るという概念に頭を悩ませることはまだできません。

基本的に、以前の 3D トラックボールと同じ問題がまだ発生しています。オブジェクトを上下逆さまにしてから右に回転しようとすると、オブジェクトは左に回転します。実際、私のカメラは焦点を中心に反対方向に回転しています。

問題は、画面座標とトラックボールを使用して古い/新しいベクトルを取得し、それらの 2 つのベクトルから回転角度を取得していることです。この方法では、常に間違った回転軸が得られます。

この問題を解決するにはどうすればよいですか?

0 投票する
1 に答える
1813 参照

c# - C# でクォータニオンを使用してジャイロスコープの角度を表す

WiiM+ジャイロを使って回転を計算しています。

ヨー軸、ピッチ軸、ロール軸に沿って回転率を統合し、angleSum というベクトルに格納します。

したがって、各読み取り値について、 angleSum(reading) は初期方向からの y、p、および r 回転を表します。

次に、クォータニオン (まったくなじみがありません) を使用して、次のように表します。

q = Quaternion.createfromyawPitchRoll(angleSum.yaw, angleSum.pitch, angleSum.roll*(-1))

しかし、wiimote をある方向に 90 度回転させて、回転方向の qx、qy、qz を印刷すると、すべての読み取り値が回転の影響を受けます (それらはすべて 90 度回転して戻ってきますが、そのうちの 2 つは大きさが小さくなっています)。

私の質問は非常に基本的なものです。この四元数構造を使用して向きを正確に表すにはどうすればよいですか? ヨー、ピッチ、ロールに関して、絶対的な (または少なくとも相対的な) 向きが必要です。

ありがとう!

0 投票する
2 に答える
30355 参照

java - クォータニオンを1軸で回転させますか?

クォータニオンで回転させたモデルがあります。回転を設定することしかできず、何も足したり引いたりすることはできません。軸の値を取得し、それに角度(おそらく度またはラジアン?)を追加してから、変更されたクォータニオンを再度追加する必要があります。

これどうやってするの?(各軸で答えてください)。

0 投票する
2 に答える
310 参照

c++ - C++で代数的構造の行列にクラスを使用するオーバーヘッド

私はC++を使用して複雑なFFTアルゴリズムをコーディングしているので、クォータニオンやハミルトン-アイゼンスタインコードなどの代数的構造を実装する必要があります。アルゴリズムは、その構造の2D配列で機能します。それらをクラスとして実装することのオーバーヘッドは何でしょうか?別の方法で、クォータニオンクラスで構成される[M] [N]次元の配列を作成する必要がありますか、それとも[M] [N] [4]配列を作成し、[4]配列をクォータニオンとして使用する必要がありますか?クラスを使用する方が便利ですが、配列だけで作業するのではなく、M * Nクラスを作成してそのメソッドにアクセスするのは、それほどオーバーヘッドではないでしょうか。私は大きな画像処理のアルゴリズムをコーディングしているので、パフォーマンスは私にとって重要です。

0 投票する
2 に答える
1016 参照

iphone - OpenGL ES アークボール変換の問題

使用していたアークボール クラスを vb.net から iPhone に客観的な C++ を使用して移植しましたが、現在問題が発生しています。オブジェクトを回転させると、すべて問題ありません。ビューをパンするとすぐに、以前のように回転の中心がオブジェクトの原点の中心になくなりました。理想的には、オブジェクトの参照フレームのどこに回転ポイントがあるかを設定できるようにしたいと考えています。これを行うには、アークボール ルーチンのどこを変更する必要があるかわかりません。私がベースにした実装は、以下のリンクにあります。

http://www.codeproject.com/KB/openGL/Tao_Arcball.aspx

動作を少し変更してタッチ インターフェイスに変換しましたが、問題に関する限り、動作はこの実装と同じです。

これらのリンクは、四元数と行列の回転の背後にある数学の詳細を説明しています。

http://www.j3d.org/matrix_faq/matrfaq_latest.html http://www.gamedev.net/reference/articles/article1095.asp http://en.wikipedia.org/wiki/Quaternion_rotation

変更する必要があると思われるコードの主要部分は以下のとおりです (vb.net 内):

編集:

私はこれを行う方法をほとんど理解しました。アークボールの回転中心を設定できるようになったのですが、別の問題が発生しました。指定した中心点を中心に回転する変換を適用すると、次の 2 つの問題があります。

  1. モデルが別の場所にジャンプします。モデルをまったく同じ位置と向きに保ちたいと思います。

  2. モデルは新しい中心点を中心にスケーリングしますが、ユーザーが 2 本の指で触れた場所の平均であるポイントを中心にモデルをスケーリングしたいと考えています。

2 番については、やり方はわかったと思いますが、2 番を正しく機能させるには 1 番を理解する必要があります。番号 2 については、平均的なタッチ ポイントをニア プレーンに平行であるがパーツの原点を通過するプレーンに投影し、ユーザーが指を離すまでそれを回転の中心にします。1番のアイデアはありますか?回転の中心を変更するために使用するコードは次のとおりです。

参考までに、OpenGL は、そのスタックがどのように機能するかにより、マトリックス変換を逆の順序で適用します。したがって、私のコードでは、一番下の行が最初に実行され、次にそこから実行されます。効果的にモデルを移動して、回転の中心が原点にあるようにし、回転/スケーリングしてから、モデルをパンに移動する必要がある場所に移動します。

私が遭遇していると私が信じている問題は、パンを行うときに centerOfRotation を追加する必要があることですが、問題は、モデルが回転すると、centerOfRotation ポイントを何らかの方法で変換して別のモデル空間に配置する必要があることです。モデルを回転する前は正常に動作しますが、回転が導入されると、すべてが爆発します。

0 投票する
1 に答える
5343 参照

vector - 単位ベクトルを四元数に変換する

だから私は四元数に非常に慣れていませんが、四元数を操作する方法の基本を理解しています。私が現在やろうとしているのは、既知の四元数を空間内の 2 つの絶対点と比較することです。私ができることは、ポイントを2番目のクォータニオンに変換するだけで、2つを簡単に比較できることを願っています。

これまでに行ったことは、2 つの点を単位ベクトルに変換することです。そこから、ゼロのスカラーを使用して、ijk をクォータニオンの虚数部分に直接プラグインできることを望んでいました。そこから、1 つの四元数を他の共役で乗算して、3 番目の四元数を得ることができます。この 3 番目の四元数を軸角度に変換すると、元の 2 つの四元数の差の度合いがわかります。

この思考プロセスは正しいですか?したがって、[ 0 ijk ] である必要があります。後で四元数を正規化する必要があるかもしれませんが、それについてはわかりません。

ベクトルからクォータニオンへの直接マッピングではないというのが悪い気がします。単位ベクトルを軸角度に変換しようとしましたが、入力としてどの角度を指定すればよいかわからないため、これが機能するかどうかはわかりません。

0 投票する
1 に答える
3723 参照

math - Unity3D とベクトル演算 - Slepr、Lerp、Quaternions

私は Unity3d を数か月間研究しており、オブジェクトを移動/回転するときに使用できるこの数学的概念についていくつかの調査を行いました。

いくつかの数学的な説明を読みましたが、unity3d で自分のニーズにどのように適用/適合するかわかりません。

誰かがこれらの 2 つの概念についての良い資料を指摘してくれたり、クォータニオンとスラープを使用する必要があるときに説明してくれたりできますか? なぜ私はそれを使わなければならないのですか?いつ?

私が得ることができるどんな助けにも感謝します。

0 投票する
1 に答える
1961 参照

flash - クォータニオンキューブ回転アニメーション

このルービックキューブはPapervison3Dで作成しました。いくつかのリソースを使用して、27個のミニキューブ(3 * 3 * 3 = 27)を含むキューブを作成しました。マウスの移動時にルービックキューブを回転させることはすでに行われています。(私はカメラを回転させません。)

ルービックキューブのすべての動作はすでにそこにあります。しかし、私は最終段階で少し立ち往生しています。

通常のルービックキューブと同じように遊んでみると、問題なく動作しています。さらに、デフォルトのオイラー回転値はしばらくすると信頼できなくなります。必要なのは、ルービックキューブを選択した側に回転させ、その後、ルービックキューブをz軸上で回転させて、ミニキューブの面が上を向くようにすることです。TweenMaxでアニメートするのが好きですが、クォータニオン回転が必要なため、本当に行き詰まっています。

ルービックキューブ自体の選択された面を知っています。ルービックキューブのオイラー回転は、Matrix3D.matrix2euler(_rubiksCube.transform);たとえば現在の回転がx: -20, y: 35, z: 10であるときに選択した面に回転させる必要があることを知っています。ルービックキューブの背面を選択すると、回転する必要がありx:0, y: 180, z: 0ます。

必要なのは、これをクォータニオン値に変更し、ルービックキューブを新しいクォータニオン値に回転させることです。その後、選択したミニキューブを上に向けるために、ルービックキューブをそのz軸上で回転させる必要があります。

これは、ルービックキューブをドラッグ/回転するときに使用するコードです。