3Dオブジェクトの変換を操作するための移動、スケール、回転ギズモを実装する方法は?


11

基本的な3Dエディタを開発中です。OpenGLを使用して3Dワールドをレンダリングします。現在、私のシーンはサイズの異なるいくつかのボックスであり、各ボックスを選択して移動/スケーリング/回転して必要な変換を実現できるようにしたい段階にあります。

これらのツールのギズモ(またはハンドル、または通常はどのように呼び出すか)のレンダリングを実装する問題と、マウスで変換の変更を実行するために各軸でそれらを選択する問題をどのように解決できますか?明確にするために: ここに画像の説明を入力してください

これまでの私の研究は、最もクリーンなアプローチはギズモの矢印ごとに軸に沿って境界ボックスを配置し、正方形ごとにもう1つ(単一の軸ではなく平面内でオブジェクトを移動するもの)に境界線ボックスを配置し、マウスから光線を投射することを提案しました配置し、衝突するものを確認します。しかし、これはまだ私には少し抽象的すぎます。このアルゴリズムがどうなるかについてのさらなるガイダンスに感謝します(疑似コードは十分すぎるほどです)


1
通常は、マウスの位置を使用して世界にレイキャストし、ギズモに当たるかどうかを確認します。ギズモを画面空間に変換して、そこで衝突を検出することもできます。通常は、光線から線分タイプの物までの距離を測定します。回転は通常、仮想トラックボールとして行われます。ゲームプログラミングジェムのMelaxを参照してください。
RandyGaul 14

回答:


9

e-onのある時点で、Vue製品ラインのギズモを維持しました。
私はあなたに言うことができます、それはあなたに数日、フルタイムかかります。
いくつかのライブラリまたは非常に賢い方法が見つからない限り、古典的な方法は、クリックしたときにウィンドウ内のマウスの座標を取得することです。ビューポートに対する相対座標の場合、幅と高さでxとyを単純に除算できます。 [0,1]の範囲のベクトル(float 2d)を取得します。(0.5,0.5)を減算して、xとyの両方の[-0.5、0.5]の範囲に入ります。
次に、xとyを単に光線のxとyとして使用して、この座標から光線を作成し、zを焦点距離に設定します。時々アスペクト比は、この操作でお尻の痛みです。少しいじると試行錯誤すると、修正されます。
次に、ギズモ要素との交差をチェックする必要があります。生成したメッシュか、ブレンダーまたはその他のDCCでモデル化したものか、相互に接続できるメッシュパーツ...これらのメッシュパーツを光線として使用します/三角交差クエリ。
または、ギズモの外観とパーツに応じて、光線/円柱、光線/球体がある場合。
衝突するプリミティブに変換行列を適用できる交差ルーチンが必要です。ギズモは移動するオブジェクトと平行移動し、回転し、カメラまでの距離の逆数でスケーリングするため、画面上での固定投影サイズを維持するため、非常に重要です。
次に、相互作用部分があります。最も簡単なのは、マウスが最初に「マウスダウン」イベントされたときのポイントのデルタと、現在の「マウス移動」位置を純粋な2Dで取得し、このデルタを現在の軸の動きとして使用することです。ワールドスペースでは、k経験的に決定した値を掛けます。内部単位、ピクセル、ズームの現在のスケールなどに応じて
。最後の手順は、ギズモのマトリックスを操作対象のオブジェクトに適用し、それに従うようにすることです。

私はそれを実装するのは地獄のかなりの旅であり、あなたがあなたの自由な時間にそれをしているのなら1週間以上は期待しないと言います。フィールドを完全に発見している場合は数週間。週末が他のアクティビティで忙しい場合は、1か月以上:)

IntelからEmbree 2.0をダウンロードして光線/三角形の交差クエリを実行することをお勧めします。そのため、コーディングについて心配する必要はありません。または、ブレンダーからコードを簡単にコピー/貼り付けおよび適応することができます...私はそれらがApacheライセンスに移動したと思いますか?法的に可能であるべきです。


1
答えてくれてありがとう。それは本当に役に立ちます。明らかに簡単な作業に圧倒されているとき、私は狂っていないことを知っていました。私はその難しさを過小評価し、結局同じ問題に何日も行き詰まってしまいました。次にこれを処理するとき、私はきっと良い計画を立てたでしょう。ありがとう
Grimshaw

0

マニピュレータトランスレータの場合は、次のアルゴリズムを使用します。

1)マウスが下にあるとき、光線が矢印と交差するかどうかを確認する必要があります。たとえば、X矢印を考えます。ワールド空間でレイを構築します(カメラの錐台とマウスの位置に基づきます)。X軸がある平面を作成します。その法線はVクロスXクロスVに等しく、V-中心からカメラへのベクトル、X-はX軸を表します。次に、光線を平面と交差させるため、世界座標で交差点を見つけます。次に、x軸セグメントと結果のポイントをスクリーンに投影し、投影されたセグメントとスクリーン上の投影されたポイントの間の距離を求めます。数ピクセル未満の場合、マウスは軸と交差します。また、選択の中心と交差点の間のワールドスペースデルタベクトルを計算します。

この手順は3軸に対して行うため、すべての軸までの距離を求めます。最小距離を見つけます。マウスが交差する軸を見つけました。

2)マウスが動いたとき。オブジェクトが(1から)移動する軸がわかります。(1のように)光線と平面の交差するワールド空間を見つけます。さらに、オブジェクトが移動する線に交点を投影します。最終マニピュレータの位置=交差+デルタ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.