1

3Dポイントを2Dサーフェスにプロットしようとしています(現在、「ゲームエンジン」としてSDL.NETを使用しています)。表面のサイズは800x400ピクセルで、3D座標の範囲は-4000から4000です。私のビューは常にトップダウンビューであり、カメラの動きはまったくありません。誰かがネイティブc#、擬似コード、または3D空間の座標を2Dサーフェスに変換するための簡単な説明を提供できますか?

その間、人々が私に言うこの本を注文することは、私の数学の欠点の多くに対処するでしょう....うまくいけば:)

4

2 に答える 2

12

注:これはテキストの大きな壁であり、私は多くの重要なものを完全に見つめています-しかし、ここでの私の意図は単なる概要です...ここでの用語/概念のいくつかが、適切なチャンクのより良いグーグルにつながることを願っていますウェブ。

「ポイントとしての生活」を歩き回る場合に役立ちます。

これが、ちょっとした3次元のポイントです。

var happyPoint = new Point(0, 0, 0);

そして、これが彼の友人に関連して定義されたその仲間です:

var friendlyPoint = new Point(1, 0, 0);

ここでは、これら2つのポイントを「モデル」と呼びましょう。「モデル空間」という用語を使用して、単一の3次元構造(家、モンスターなど)内のポイントについて説明します。

モデルは真空状態ではありませんが、通常は「モデル空間」と「ワールド空間」を分離して、モデルの調整を容易にします(そうでない場合は、すべてのモデルを同じスケールにする必要があります。同じ向きなどを持っていることに加えて、3Dモデリングプログラムでそれらに取り組むことは非常に不可能です)

そこで、「モデル」の「ワールドトランスフォーム」を定義します(2ポイントは不完全なモデルですが、モデルは残ります)。

「世界の変革」とは何ですか?簡単に言えば:

  • 世界の変容W = T X R X S、ここで
  • T =平行移動-つまり、X、Y、またはZ軸に沿ってスライドします
  • R=回転-軸を基準にしてモデルを回転させる
  • S =スケーリング-軸に沿ったモデルのサイズ変更(内のすべての相対点を維持)

ここで簡単に説明し、世界変換を単位行列として定義します。基本的に、これは、変換、回転、またはスケーリングを行わないことを意味します。

world = [
          1 0 0 0
          0 1 0 0
          0 0 1 0
          0 0 0 1
        ];

Matrixの計算、特に3Dグラフィックスで使用される乗算とVector- >Matrix演算をブラッシュアップすることを強くお勧めします。

したがって、実際の行列の乗算を巧みにスキップして、「ワールド変換」とモデルポイントを乗算すると、モデルポイントが再び生成されることをお伝えします(この楽しい新しい4次元ベクトル表現では、これは行いません)。ここに触れてください)。

だから私たちは私たちのポイントを手に入れました、そして私たちはそれらを「スペース」に絶対に配置しました...今何ですか?

さて、どこから見ているのでしょうか?View Transformationsこれは、またはの概念につながりますCamera Projection-基本的に、それは単なる別の行列の乗算です-観察します:

ポイントXがあるとしましょう...ああ、(4 2)かそこら:

 |
 |
 |
 |    
 |    X
 |
 ------------------------

原点(0 0)の観点から、X(4 2)にありますが、カメラを右に外したとしましょう。

 |
 |
 |
 |    
 |    X         >-camera
 |
 ------------------------

カメラに対するXの「位置」は何ですか?カメラの「上」と「右」の方向に応じて、おそらく(0 9)または(9 0)のいずれかに近いものになります。これがビュー変換です。あるセットの3Dポイントを別のセットの3Dポイントにマッピングして、オブザーバーの観点から「正しい」ようにします。トップダウン固定カメラの場合、オブザーバーは空の固定位置になり、それに応じてすべてのモデルが変換されます。

だから描きましょう!

残念ながら、画面は(まだ)3Dではないため、最初にこのポイントを2Dサーフェスに「投影」する必要があります。投影は...まあ、基本的には次のようなマッピングです。

(x, y, z) => (x, y)

可能な投影の数はほぼ無限です。たとえば、XY座標をZ次のようにシフトすることができます。

func(x, y, z) => new point2d(x + z, y + z);

通常、この投影は、3Dシーンを見るときに人間の網膜が行う投影を模倣する必要がありますが、ビュー投影の概念を取り入れています。OrthographicYawPitchRoll-definedPerspective / FOV-definedなど、いくつかの異なる視野投影があります。これらのそれぞれには、プロジェクションを適切に構築するために必要なデータの重要なビットがいくつかあります。

たとえば、パースペクティブ/FOVベースの投影には次のものが必要です。

  • あなたの「眼球」(すなわち、スクリーン)の位置
  • あなたの「眼球」が焦点を合わせることができる距離までの距離(「遠いクリッピング面」)
  • 角度のある視野(つまり、周辺視野の端で腕を伸ばします)
  • 見ている「レンズ」の幅と高さの比率(通常は画面の解像度)

これらの数値を取得したら、「境界錐台」と呼ばれるものを作成します。これは、上部が切り取られたピラミッドのように見えます。

\-----------------/
 \               /
  \             /
   \           /
    \         /
     \-------/

または正面から:

 ___________________
|   _____________   |
|  |             |  |
|  |             |  |
|  |             |  |
|  |             |  |
|  |             |  |
|  |_____________|  |
|___________________|

ここでは行列の計算は行いません。これは他の場所ですべて明確に定義されているためです。実際、ほとんどのライブラリには、対応する行列を生成するヘルパーメソッドがありますが、おおまかに次のように機能します。

あなたの幸せな小さなポイントがこの錐台にあるとしましょう:

\-----------------/
 \               /
  \ o<-pt       /
   \           /
    \         /
     \-------/

 ___________________
|   _____________   |
|  |             |  |
|  |             |  |
|o |             |  |
|^---- pt        |  |
|  |             |  |
|  |_____________|  |
|___________________|

「クリップ平面の近く」の長方形から外れているところまで、横にずれていることに注意してください。ピラミッドの小さい方の端を「覗き込んだ」としたら、どのように見えるでしょうか。

プリズム(またはレンズ)を調べるのと同じように、ポイントは「曲がって」表示されます。

 ___________________
|   _____________   |
|  |             |  |
|  |             |  |
|>>>o <- pt is   |  |
|  |    shifted  |  |
|  |             |  |
|  |_____________|  |
|___________________|

言い換えると、錐台の後ろに明るい光がある場合、ポイントからの影は近くのクリッピングフィールドに「キャスト」されますか?(小さい方の長方形)これがすべての投影です。あるポイントから別のポイントへのマッピングです。この場合、Zコンポーネントを削除し、それに応じてXとYを「意味のある」方法で変更します。

于 2013-02-26T02:35:36.643 に答える
2

見通しを考慮する必要があります。あなたの視点に応じて、プロットポイントは異なります。正投影の視点が必要な場合 (本質的に視点ではありません)、次のようなマトリックス変換を実行します。

ここに画像の説明を入力

ここで、aは 3D ポイントを表し、 bは 2D ポイントの結果を表します。ベクトルsは任意の倍率で、cは任意のオフセットです

これに似た別の投稿が良い答えです:

カメラを使用した 2D 画面への基本的なレンダリング 3D 透視投影 (opengl なし)

ここにいくつかの詳細情報があります

http://en.wikipedia.org/wiki/3D_projection

于 2013-02-26T01:35:31.820 に答える