問題タブ [arcball]

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 に答える
1307 参照

flash - Papervision3D の Arcball 実装

Papervision3D のアークボールの実装はありますか?

Flash/ActionScript 用のアークボールの実装は多数ありますが、Papervision3D 専用のものはありません。

フラッシュのアークボール実装の例を次に示します。

http://www.unitzeroone.com/blog/2009/09/08/source-better-flash-10-3d-interaction-arcball/

DirectX ArcBall クラスに基づいて独自の実装を作成することにしました。

しかし、それは正しく機能しません。その理由については途方に暮れています。

立方体の最初の位置から、アークボールをクリックしてドラッグすることができます。

ただし、クォータニオンで軸/角度の累積を開始すると、立方体が十分に回転すると方向が逆になります。回転方向の反転やその他の奇妙な動作があってはなりません。

私はインターネットを精査しましたが、Papervision3D とアークボールに直接関連するものは何も見つかりませんでした。(別の 3D Flash エンジン用のアークボールの実装があるのではないでしょうか?)

この問題で何か助けていただければ幸いです。

** 編集 ** Papervision3D (シーンに少なくとも 1 つのオブジェクト (つまり) キューブが必要) のアークボール実装が機能している回答に対して 500 ポイントの報奨金を追加しました。

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

opengl - openglでクォータニオンを使用して画面の中心を回転させる方法は?

アークボール/トラックボールの回転を実装しようとしていますが、回転の中心に問題があります。何があっても中心を画面の中心にしたい。

私がこれまでに行ったことを説明しましょう。

クォータリオンを作成しました (回転軸: vector_start x vector_end、角度: vector_start * vector_end)

そのクォータニオンから、glMultMatrixf(matrix) で使用して目的の回転を取得するために、回転マトリックスを作成しました。

問題は、モデルが本来のようにアークボール回転しているように見えますが、常にローカル原点を中心に回転していることです。ローカルの原点がどこにあるかに関係なく、画面の中心を中心に回転させるにはどうすればよいですか?

その問題の解決策は、回転軸全体を画面の中央に移動してから回転を適用することだと思いますが、これは可能ですか? ここで何かが恋しいですか?

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

c++ - 90 度でのアークボールの回転

クォータニオンを使用して Arcball 回転を正常に実装しましたが、カメラの方向ベクトルがアップ ベクトルと平行である場合にどうすればよいか混乱しています。現在、方向ベクトルとアップ ベクトルの内積が 0.99 を超える場合、x 軸 (ピッチ) に沿った回転を制限しています。たとえば、Maya (または Max、アークボール回転が使用される XSI) では、非常にスムーズに完全な円を描くように回転できます。Maya のローテーションと同様の解決策を期待しています。

ありがとうございました

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

opengl - opengl でアークボールの正しいスクリーン マッピングを取得する

アークボール インターフェースを実装しようとしていますが、90 度回転した後、モデルがその特定の方向に回転しなくなったようです。画面上のクリックをアークボールにマッピングすることに問題があると思われますが、計算が間違っている可能性があります。 /または間違った変換の蓄積、助けをいただければ幸いです。ベクトルを操作する場合、問題に関連するコードは次のとおりです。^演算子は外積を表し、*演算子は内積を表します

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 に答える
279 参照

java - 通常の実装でトラックボールの中心を変更するには?

以下の 2 つのチュートリアルを使用して、Java でトラックボールを正常に実装しました。

  1. http://nehe.gamedev.net/tutorial/arcball_rotation/19003
  2. http://www.java-tips.org/other-api-tips/jogl/arcball-rotation-nehe-tutorial-jogl-port.html

このトラックボールは画面中央に配置されます。今、私はそれを画面上の任意の点に配置したいと考えています。センター ロジックを既存のコードに組み込むにはどうすればよいですか? 中心の導入により、マウス座標の正規化はどのように変化しますか?

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

ios - クォータニオンを使用したアークボール回転(iOS GLKitを使用)

特にiOSでGLKitを使用して、クォータニオンを使用した3Dモデルでのアークボール回転の簡単な実装を探しています。これまで、次の情報源を調べてきました。

私はまた、ここここからソースコードと数学を理解しようとしています。オブジェクトを回転させることはできますが、特定の角度でジャンプし続けるため、ジンバルロックが機能しているのではないかと心配しています。ジェスチャレコグナイザーを使用して回転を制御しています(パンジェスチャはロールとヨーに影響し、回転ジェスチャはピッチに影響します)。クォータニオン処理とモデルビュー行列変換のコードを添付しています。

変数:

  • GLKQuaternion rotationE;

クォータニオン処理:

Modelviewマトリックス変換(描画ループ内):

どんな助けでも大歓迎ですが、私はそれをできるだけシンプルに保ち、GLKitに固執したいと思います。

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

c++ - Opengl: Arcball カメラのアップベクターを y 軸に揃える

基本的に、Maya でカメラが回転する方法を模倣しようとしています。Maya のアークボールは常に y 軸に位置合わせされます。したがって、アップ ベクトルがどこを指していても、y 軸に沿ってアップ ベクトルで回転または登録されます。

C++ と Qt を使用して、OpenGL でアークボールを実装することができました。しかし、アップベクターの位置合わせを維持する方法がわかりません。以下のコードによって、時々整列させることができました。

これは、位置が 90 度になるまで機能し、その後、右のベクトルが変化し、すべてが反転します。

代わりに、総回転 (クォータニオン単位) を維持し、それによって元の位置 (上、右、正) を回転させています。これはすべての一貫性を維持するのに最適ですが、アップベクターを y 軸に揃えることができません。以下は、回転の関数です。

QQuaternion q は、マウスのドラッグから派生した軸と角度のペアから生成されます。これは正しく行われていると確信しています。回転自体は問題ありませんが、向きが揃っていないだけです。

選択した実装で気づいたのは、コーナーをドラッグすると、ビュー方向を中心に回転し、常にアップベクターを再調整して、ワールドの y 軸方向にまっすぐにすることができることです。したがって、どれだけ転がすかがわかれば、毎回2回転して、すべてがまっすぐになるようにすることができます. ただし、これについてどうすればよいかわかりません。

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

c++ - Qt と OpenGL を使用したアークボール コントロール

Open GL と Qt を使用して、アークボール/トラックボール コントローラーを実装しようとしています。ただし、私は OpenGL にはまったく慣れていません。私は物事を機能させるのにひどい、ひどい、ひどい時間を過ごしています。

このビデオをフォローすることから始めました: https://www.youtube.com/watch?v=3IQV65ApWGs

QtWidget クラスを使用して、ウィンドウに Qt を使用しています。

基本的に、原点の周りに立方体があります。マウスで立方体の周りにカメラを周回させたいです。現在、カメラをドラッグすると、立方体が球の周りを周回している間、カメラが動かないように見えます。私が必要としているものとは正反対です。

皆さんが助けてくれることを願っています。ここでほぼすべてを試したような気がします。

最初に私のマウスの取り扱い:

次に、アークボール関連の数学:

そして、これは私がすべてをレンダリングする部分です:

void GLWidget::paintGL() { QMatrix4x4 モデルビュー;

私は何を間違っていますか?私のアプローチは不健全ですか?

更新そこで、マウス処理の一部を修正しました。今私の問題は、立方体がカメラではなく球の表面の周りを回転していることです。これは、lookat コマンドを使用しているからですか?

また、立方体を回転させると背景色によって遮られます。これは投影の問題ですか?

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

opengl - クォータニオンの合成

現在、マウスをドラッグして回転させる必要がある 3D シーンに取り組んでいます。これを行うために、ArcBall の実装を利用しています。

使用されたフレームワークは、結果の四元数をすぐに回転行列に変換しました。後続の回転も行列に変換されます。次に、これらの行列が乗算されます。

単純に回転クォータニオンを乗算することで、これを最適化したかったのです。元のバージョンは問題なく動作していましたが、シーンが制御不能に回転しているように見えます。

クォータニオンを乗算するための私のコード:

乗算は次のように行われます (結果は適切な測定のために正規化されます)。

最後に、回転は次のように適用されます。

私が間違っていることを誰かが知っていますか?