5

OpenGLでのローテーションタスクの最良のアプローチに関するいくつかの指針が必要です。クォータニオンを使用して3D空間でオブジェクトを回転させる方法を知っています。それらをすべてうまく変換できます。

しかし、回転の目的で、さまざまなオブジェクトのコレクションを単一のエンティティとして扱うための最良の方法を知りたいと思います。たとえば、オブジェクトが置かれた机があるとします。それぞれに独自の回転と回転がありますが、今度は、部屋の他のオブジェクトを所定の位置に保ちながら、机全体とその上のすべてを回転させたいと思います。つまり、机の外縁にあるオブジェクトは回転し、机の中心を中心に移動しますが、中央にあるオブジェクトは回転するだけで、それ以外の場合は所定の位置に留まるか、単に移動が少ない場合があります。回転軸。

これを行うためのかなりエレガントでない方法は、回転軸がどこにあるかを知って、机上の各オブジェクトと机自体を個別に回転および平行移動することであるように思われます。おそらくこれが唯一の良い方法ですが、この目的のために異種のオブジェクトを「グループ化」する手法はありますか?

4

2 に答える 2

3

あなたが探しているのは変換階層です。机の上のオブジェクトは、机に対して相対的に配置されます。つまり、机の座標系に配置されます。それではM_Desk、机の配置とそのローカル座標系を定義する変換として指定しましょう。次にM_Pencilbox、机との関係で机の上に立っている筆箱の変形を見てみましょう。そして、鉛筆箱の中の鉛筆は、鉛筆箱に対して配置されます。

したがって、鉛筆は変換の階層を通過します。OpenGL で使用される列優先表記では、最後の変換から最初の変換 (または書き留めた場合は右から左) への変換チェーンを "流れる" ことに注意してください。

たとえば、各変換M_Deskは、回転、平行移動、スケーリングなどの通常の方法で構築できる 4×4 行列です。

したがって、鉛筆の頂点を変換するには、次の変換を適用します

… · M_Desk · M_Pencilbox · v_Pencil

もちろん、机自体は部屋のように別のものと関係しているかもしれません。その変換チェーンの最初にあるのは、ビューの変換です。したがって、効果的にここでモデルビュー マトリックスを構築しています。

最新の OpenGL に関して言えば、変換階層 (ファイル システムのディレクトリを考えてください) でブランチに遭遇するたびに、これまでに構築された変換チェーンのコピーを作成するため、最初からやり直す必要はありません。枝ごとに。

さらに明確にする必要がある場合はお知らせください。

于 2013-03-22T09:23:31.817 に答える
3

これは一般に、変換階層を組み込んだある種のシーングラフを使用して実現されます。

単純な最小バージョンは、各ノードにオブジェクト、変換、および子ノードのリストが含まれるツリーを持つことです。トランスフォームは、親ノードに相対的です。

したがって、机の上のオブジェクトは机自体の子になります。

特定のオブジェクトの変換は、そのオブジェクトの変換とツリー内のすべての親を連結したものです。それを達成する方法はたくさんありますが、「古い学校」の GL 機能は、この目的のためにマトリックス スタックを提供します。ノードのローカル マトリックスを乗算し、そのノードのジオメトリを描画し、すべての子ノードを再帰的に描画してから、マトリックスを元に戻します。

于 2013-03-22T09:23:48.043 に答える