スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

プロジェクション行列(射影行列)

View行列だけピックアップされてずるい!と怒られた気がしないでもないのでプロジェクションも触れてやります。
ワールド行列君もふてくされてますが、いいんです。あの子はそういう子なんです。


さてさて、まず3D描写について大きく触れていきます。

・スクリーンに書き出すときの手順
スクリーン座標 = [モデル座標][ワールド行列][ビュー行列][射影行列][ビューポート行列]


・モデルに戻すときの手順(逆行列を使っただけ)
モデル座標 = [スクリーン座標][ビューポート行列]-1[射影行列]-1[ビュー行列]-1[ワールド行列]-1


この辺の変換はXNAに触れるとすぐ出てくるので問題ないと思います。
少し突き詰めます。

ビューポート行列とは-1.0~1.0にラスタ化されている座標を画面(1024×768など)の大きさに変換するもの
プロジェクション行列=射影行列=カメラ空間から射影空間に変換するもの。


問題なさそうです。
もちっとだけ彫りださげます。

プロジェクション行列=[w, 0, 0, 0,
                0, h, 0, 0,
                0, 0, q, 1,
               -q, 0,-qzn,0]

x'=wx
y'=hy
z'=zq-qzn
w'=Z*1+1*0//結局w'=zってことですね

よくわかりません。
無視します(ダメっ)


もすこしだけ覗いてみます。

[モデル座標][ワールド行列][ビュー行列] ここ [射影行列][ビューポート行列]

↑のここの(X,Y,Z,1)に射影行列を乗算しただけではまだ-1.0~1.0の間には収まっていません。
これが勘違いしやすいところ(私はそうでした)


んじゃどーなってるの?実際はこうなる。
[モデル座標]→[ワールド行列]→[ビュー行列]→[射影行列]
→(ビューポートスケーリング)→(透視変換)→→[ビューポート行列]


透視変換は、
x''= x'/w'(注)w'=zです
y''= y'/w'
z''= z'/w'
RHW = 1/w'


ビューポートスケーリング行列=[ Width/2,      0,       0,   0,
                          0, -Height/2,       0,   0,
                          0,       0,MaxZ-MinZ,  0,
                   X+Width/2,Height/2+Y,     MinZ,  1]


上記のの場所でようやくXとYは-1.0~1.0Zは0~1の間に収まるのです!

w'=zということは分母にZ値がきますね。
奥行きが大きいほど0に近づくってことは画面の真ん中に近くなるってわけです。
このときのイメージは画面の端から端までが-1.0~1.0になっていると考えていいんですね。


z''= z'/w'の計算から次のことが言える。(理解に苦しむ人は曖昧でOK)
・前方のクリップ面に近い程、精度が高い。
・MaxZとMinZの比率差が大きいほど精度が落ちる。

ということはZ値の分散にはばらつきがあるということになる。
シャドウなどでZ値を扱うにしても、Zバッファから直接取得しては使い物にならないことを示唆する。
精度の高いZ値を扱うには[射影行列]後のw値から持ってくるのが良いのです。(余談:wバッファ関係ははまだハードの対応が遅延気味らしいので注意)


ここまでの知識があれば行列を扱えて、X座標とY座標を指定して点を打てる言語であればどんなものであろうと3Dの表現ができることになる。(その二つができない言語のほうが少ないでしょ。。。)

蓋を開けてみるとそこまで怖くないのか?3D!なんて思ってしまいますね。
実際処理速度がネックになりそこまでサクサク描写というわけにはいかないかもしれませんが、3Dで記事がでるBBSなんてのも結構簡単に作れそうですね!需要が問題。

ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。