3Dコンピュータグラフィックス:あなたの世界をモデル化する

あなたの世界を探検

私の知る限り、私たちは自分たちの世界の一部をコンピューターの中に直接突き刺すことはできません(とにかく、コンピューターに損傷を与えることなく)。私たちにできる最善のことは、私たちの世界のコンピューターモデルを作成することです。その制限を考えると、たとえば椅子のようなものをどのようにモデル化するのでしょうか。

私たちの世界のオブジェクトには、形状、サイズ、重さ、位置、向き、色などの特性があります(リストはどんどん増えていきます)。少しの間、それらの形状、位置、および方向のみを考えてみましょう。これらのプロパティは、私たちが空間プロパティと呼んでいるものです。そして、椅子よりも扱いやすいもの、たとえば立方体から始めましょう。

図1の図を見てください。それ以外の場合は空の部屋に座っている立方体を示しています。(まあ、部屋にもドアがありますが、それは部屋を部屋のように見せるためだけにあります。)

図1:立方体のある部屋

立方体の形状、位置、および方向を指定するには、各角の位置を指定する必要があります。そのために、次のような言語を使用できます。

最初のコーナーは、床から1フィート(または必要に応じてメートル)、後ろの壁から2.5フィート(またはメートル)です。2番目のコーナーも床から1フィート、壁から左に1フィートです。

両方のコーナーが他の何か(壁や床)を基準にして指定されていることに注意してください。私たちのコンピュータモデルでは、床と壁を定義してそれらを参照点として使用できますが、1つの参照点(これを原点と呼びます)を選択して代わりに使用する方がはるかに簡単であることがわかります。原点は、2つの壁と床で形成されたコーナーを使用します。図2は、私たちの起源の場所を示しています。

図2:原点と座標軸

次に、原点に対して各コーナーがどこにあるかを示す必要があります。原点から立方体の角までのパスは、さまざまな方法で指定できます。簡単にするために、標準に同意する必要があります。次のことをしましょう。

壁と壁、または壁と床の交差によって形成される各エッジに名前が付けられていると想像してください。示されているように、それらをx軸y軸、およびz軸と呼びます。図2で、次のレシピに従ってコーナーの位置を決定することにも前もって同意しましょう。

  • まず、x軸に平行な直線で原点からどれだけ移動する必要があるかを測定します
  • 次に、y軸に平行な直線でその点からどれだけ移動する必要があるかを測定します
  • 最後に、z軸に平行な直線でその点からどれだけ移動する必要があるかを測定します

図3は、立方体の角の1つに到達するためにたどるパスを示しています。

図3:パスを見つける

省略表記として、これらすべての距離を次のように記述しましょう。

  • x軸に平行な原点からの距離
  • y軸に平行な原点からの距離
  • z軸に平行な原点からの距離

または(さらに短い):

(距離x、距離y、距離z) 

この値のトリプレットは、コーナーの座標と呼ばれます。同様の方法で、各コーナーの空間内の位置を指定できます。たとえば、この例の立方体には次の場所に角があることがわかります。

(3 feet, 1 foot, 2 feet)

または

(3 feet, 1 foot, 3 feet)

または

(4 feet, 1 foot, 2 feet)

等々。

測定単位(フィートやメートルなど)は、私たちの目的にとって重要ではありません。重要なのは、単位が画面領域の標準単位であるピクセルにどのようにマッピングされるかです。そのマッピングについては、後で詳しく説明します。

少しエッジの効いた

立方体の角の位置によって、立方体の位置と方向が決まります。ただし、その角の座標だけを考えると、立方体を再構築することはできません(ましてや椅子)。エッジが形状を決定するため、エッジがどこにあるかを本当に知る必要があります。

すべてのエッジには1つの非常に優れた特性があります。つまり、常にコーナーで開始および終了します。したがって、すべてのエッジがどこにあるかがわかれば、すべてのコーナーがどこにあるかは確実にわかります。

ここで、1つの大きな単純化の仮定を行います。私たちの世界のモデルでは、湾曲したエッジを非合法化します(理由は後で学びます)。エッジは常に直線でなければなりません。湾曲したエッジを近似するために、図4のように、まっすぐなエッジを端から端まで配置します。

図4:曲線の直線近似

その場合、エッジは単純な線分にすぎません。また、線分は、始点と終点の座標によって指定されます。したがって、オブジェクトのモデルは、その形状を表す線分のコレクションにすぎません。

視覚化:それはもはやリラックスのためだけではありません

オブジェクトをモデル化する方法がわかったので、コンピューター画面でモデルを表現する問題に取り組む準備が整いました。

コンピューターの画面を仮想世界への窓と考えてください。私たちは窓の片側に座り、仮想世界は反対側に座ります。図5は、この概念を示しています。

図5:仮想世界へのウィンドウ

ウィンドウ(またはコンピューター画面)のモデルに情報を配置する方法はたくさんあります。おそらく最も単純なのは、いわゆる等角投影です。

モデルには3次元があり、コンピューター画面には2つしかないため、最初にモデルの各ポイントからz座標(3つの座標の3番目)を削除することで、モデルを画面にマップできます。これにより、各ポイントのx座標とy座標が残ります。 x座標とy座標は、(モデルの単位に基づいて)適切にスケーリングされ、画面上のピクセルにマッピングされます。モデル内の任意のポイントでこれらの手順を使用して、画面のどこに表示されるかを見つけることができます。

結局のところ、モデルのすべてのポイントをこのように変換する必要はありません。モデルのすべてのエッジを線分で近似した結果の1つは、線分のすべての点ではなく、線分の端点を変換するだけでよいということです。これは、単純な投影(等角投影など)が常に線分を線分に変換するためです。線分は曲線にはなりません。したがって、変換されたエンドポイントの位置がわかれば、AWTの組み込みの線描​​画ルーチンを使用して線分自体を描画できます。

例が正しいかもしれないと思います。同じ形状の3つの単純なモデルを異なる方向で作成します。

表1には、最初の位置にある単純な形状を説明するデータが含まれています。テーブルの各行はエッジに対応します。この表は、エッジの開始点と終了点の座標を示しています。z軸に沿って外側から形状を見ていると仮定しましょう。

セグメント ベギン 終わり
バツ y z バツ y z
A 25 0 -70 25 35 -35
B 25 35 -35 25 0 0
C 25 0 0 25 -35 -35
D 25 -35 -35 25 0 -70
E 25 0 -70 -25 0 -70
F -25 0 -70 -25 35 -35
G -25 35 -35 -25 0 0
H -25 0 0 -25 -35 -35
-25 -35 -35 -25 0 -70
表1:単純な形状のデータ-最初の位置

図6のアプレットは、私たちが目にするものを示しています。

このアプレットを表示するには、Java対応のブラウザが必要です。 図6:単純な形状-最初の位置

次に、シェイプを数度回転させます。表2には、2番目の位置にある同じ形状を説明するデータが含まれています。形状ではなく、位置と方向のみが変更されていることに注意してください。

セグメント ベギン 終わり
バツ y z バツ y z
A 45 0 -58 34 35 -25
B 34 35 -25 23 0 7
C 23 0 7 34 -35 -25
D 34 -35 -25 45 0 -58
E 45 0 -58 -2 0 -74
F -2 0 -74 -12 35 -41
G -12 35 -41 -23 0 -7
H -23 0 -7 -12 -35 -41
-12 -35 -41 -2 0 -74
表2:単純な形状のデータ-2番目の位置

図7のアプレットは、私たちが目にするものを示しています。

このアプレットを表示するには、Java対応のブラウザが必要です。 図7:単純な形状-2番目の位置

スリーは魅力なので、もう一度回転させましょう。今回は数度上向きに回転させます。表3には、3番目の位置の形状を説明するデータが含まれています。

セグメント ベギン 終わり
バツ y z バツ y z
A 45 -26 -52 34 19 -38
B 34 19 -38 23 3 6
C 23 3 6 34 -42 -6
D 34 -42 -6 45 -26 -52
E 45 -26 -52 -2 -33 -66
F -2 -33 -66 -12 12 -52
G -12 12 -52 -23 -3 -6
H -23 -3 -6 -12 -49 -20
-12 -49 -20 -2 -33 -66
表3:単純な形状のデータ-3番目の位置

図8のアプレットは、私たちが目にするものを示しています。

このアプレットを表示するには、Java対応のブラウザが必要です。 図8:単純な形状-3番目の位置

まとめ

これまでに、オブジェクトの向きを手動で変更することはそれほど楽しいことではないという結論に達したと思います。そして、結果もあまりインタラクティブではありません。来月は、オブジェクトをインタラクティブに操作する方法を紹介します(そして、コンピューターにすべての数値計算を実行させます。結局のところ、コンピューターが得意とするタイプの作業ではないでしょうか?)。また、遠近法の問題についても見ていきます。特に、それをモデルのビューに組み込む方法を示します。

Todd Sundstedは、コンピューターがデスクトップモデルで利用できるようになって以来、プログラムを作成してきました。もともとC ++で分散オブジェクトアプリケーションを構築することに興味がありましたが、Javaがその種のものの明白な選択になったとき、ToddはJavaプログラミング言語に移行しました。Toddは、Java Language API SuperBibleの共著者であり、現在、あらゆる場所の書店にいます。Toddは執筆に加えて、Etceeの社長であり、Java中心のトレーニング、メンタリング、およびコンサルティングを提供しています。

このトピックの詳細

  • 3Dグラフィックスに関連するすべてのことについては、以下を参照してください。

    //www.3dsite.com/3dsite/

  • Yahooは、3Dグラフィックトピックの検索を開始するための便利な方法を提供します

    //www.yahoo.com/Computers_and_Internet/Graphics/3D/

  • この記事、ソースコード、およびクラスファイルをgzip圧縮されたtarファイルとしてダウンロードできます。

    /javaworld/jw-05-1997/howto/jw-05-howto.tar.gz

  • 以前のハウツーJava記事
  • 「静止画像がうまくいかないとき」-アプレットとアプリケーションにスパイスを加える方法を学ぶ

    アニメーション画像付き。

  • 「Javaがプロデューサー/コンシューマーモデルを使用して画像を処理する方法-インサイダーの外観」-Javaの強力な画像処理技術の詳細を学び、独自のプロデューサーおよびコンシューマーコンポーネントを構築するための簡単な手順に従います。
  • 「アプレットがネットワークベースの画像を非同期でロードする方法を学ぶ」-Javaアプレットがネットワークベースの環境で画像を処理する方法を詳しく見てみましょう。
  • 「3つのJavaクラスを使用すると、テキストの描画が簡単になります」-使用するクラスとそれらがどのように連携するかについてのこの説明を通じて、視覚的に魅力的なテキストを作成する方法を確認してください。
  • 「オブジェクト指向の描画プログラムであるHotSpotの調査」-このJavaの研究を通じて、Java言語とクラスライブラリの各部分がどのように組み合わされているかを学びます。プログラム
  • 「Graphicsクラスの使用」-Graphicsクラスとそれが提供する描画プリミティブの詳細、およびその使用法のデモンストレーション。
  • 「ObserverとObservable」-Model / View / Controllerアーキテクチャをガイドとして使用したObserverインターフェイスとObservableクラスの概要。
  • 「効果的なユーザーインターフェイス」-Model / View / Controllerアーキテクチャをガイドとして使用したObserverインターフェイスとObservableクラスの概要。
  • 「Javaおよびイベント処理」-イベントがユーザーインターフェイスコンポーネントに渡される方法、イベントハンドラーを作成する方法など。
  • 「AWTの概要」-Javaのユーザーインターフェイスツールキットの説明。

この物語「3Dコンピュータグラフィックス:あなたの世界をモデル化する」は、もともとJavaWorldによって発行されました。