注:これはテキストの大きな壁であり、私は多くの重要なものを完全に見つめています-しかし、ここでの私の意図は単なる概要です...ここでの用語/概念のいくつかが、適切なチャンクのより良いグーグルにつながることを願っていますウェブ。
「ポイントとしての生活」を歩き回る場合に役立ちます。
これが、ちょっとした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)
可能な投影の数はほぼ無限です。たとえば、X
とY
座標をZ
次のようにシフトすることができます。
func(x, y, z) => new point2d(x + z, y + z);
通常、この投影は、3Dシーンを見るときに人間の網膜が行う投影を模倣する必要がありますが、ビュー投影の概念を取り入れています。Orthographic、YawPitchRoll-defined、Perspective / FOV-definedなど、いくつかの異なる視野投影があります。これらのそれぞれには、プロジェクションを適切に構築するために必要なデータの重要なビットがいくつかあります。
たとえば、パースペクティブ/FOVベースの投影には次のものが必要です。
- あなたの「眼球」(すなわち、スクリーン)の位置
- あなたの「眼球」が焦点を合わせることができる距離までの距離(「遠いクリッピング面」)
- 角度のある視野(つまり、周辺視野の端で腕を伸ばします)
- 見ている「レンズ」の幅と高さの比率(通常は画面の解像度)
これらの数値を取得したら、「境界錐台」と呼ばれるものを作成します。これは、上部が切り取られたピラミッドのように見えます。
\-----------------/
\ /
\ /
\ /
\ /
\-------/
または正面から:
___________________
| _____________ |
| | | |
| | | |
| | | |
| | | |
| | | |
| |_____________| |
|___________________|
ここでは行列の計算は行いません。これは他の場所ですべて明確に定義されているためです。実際、ほとんどのライブラリには、対応する行列を生成するヘルパーメソッドがありますが、おおまかに次のように機能します。
あなたの幸せな小さなポイントがこの錐台にあるとしましょう:
\-----------------/
\ /
\ o<-pt /
\ /
\ /
\-------/
___________________
| _____________ |
| | | |
| | | |
|o | | |
|^---- pt | |
| | | |
| |_____________| |
|___________________|
「クリップ平面の近く」の長方形から外れているところまで、横にずれていることに注意してください。ピラミッドの小さい方の端を「覗き込んだ」としたら、どのように見えるでしょうか。
プリズム(またはレンズ)を調べるのと同じように、ポイントは「曲がって」表示されます。
___________________
| _____________ |
| | | |
| | | |
|>>>o <- pt is | |
| | shifted | |
| | | |
| |_____________| |
|___________________|
言い換えると、錐台の後ろに明るい光がある場合、ポイントからの影は近くのクリッピングフィールドに「キャスト」されますか?(小さい方の長方形)これがすべての投影です。あるポイントから別のポイントへのマッピングです。この場合、Zコンポーネントを削除し、それに応じてXとYを「意味のある」方法で変更します。