スポンサーサイト

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

View行列

ぐー ちょき ぱー
ほっぷ すてっぷ じゃ~んぷ!
サイン コサイン タンジェント~
ワールド ビュー プロジェクション

ついつい流れで口にでる3つの単語繋がり。
どれも切って切り離せない関係ですね。(冷たい目が気になります)

さて最後の三つはXNAを始めるとすぐに出会うのですが結構無視して通り過ぎる人もいるでしょう。
(私がそうです)
そこで少しだけ(本当に少し)かじってみたいと思います。

View行列(ViewMatrix)とは「そっちから見てるように切り替えるための行列」です。

終わり。
ねよっと。






むくっ  っとな。
ここに3Dがうつっているとして、見えているということは2Dで表現されています。PC画面は2Dなわけですから当然です。こいつを別の角度から見るときにこの2D座標は当然かわります。
どう変わるの?どう計算したらいいの?
これの答えが

「その座標にView行列をかければいいよ~」

となります。んじゃ座標にあった三つの要素XYZがスクリーンの2D座標であるXYになったら後の一個どこいっちまったんだよ!ってなりますね。
それがZ値なのですが、こいつはなくなったわけじゃないです。画面に垂直にちゃんと値を持って存在しています。
実際「物が後ろに隠れる様子」「遠くのものが小さく見える様子」などの表現にこのZ値は必要になりますから非常に大切な値です。


さてさて、ではこのView行列はどうやって求めるのでしょうか。
なんともない我らがCreateLookAt関数にお任せあれ。

public static Matrix CreateLookAt (
Vector3 cameraPosition,
Vector3 cameraTarget,
Vector3 cameraUpVector
)
cameraPosition:カメラの位置、見る人の位置
cameraTarget:カメラが指す方向、注視点
cameraUpVector:カメラの視点から "上" の方向、通常(0,1,0)でよい



ここまでは資料がたーっぷりありますね。
んでんでこの先からガクンと情報がなくなりました。
したかったのは「シャドウマップを点光源で使わせてよ!」って内容なのですが、これはまた次回。
しかもこのシャドウマップは前回から言っている「あるプロジェクト」のための序章です。
これもまた今度。(もったいぶるようなすごい内容じゃないんだけど・・)

話は戻って、具体的には「ビュー行列自前で作りたいんだけど?」ってのが課題となりました。
説明省いて答えから。
XNA上でのMatrix.CreateLookAtの中身を自前でつくるとこうなる。

Vector3 At = new Vector3(10, 10, 10);//注視点
Vector3 Eye = new Vector3(0, 0, 0);//視点
Vector3 zaxis = Vector3.Normalize(Eye-At);//左手系なら逆(Eye-At)にする
Vector3 xaxis = Vector3.Normalize(Vector3.Cross(new Vector3(0, 1, 0), zaxis));
Vector3 yaxis = Vector3.Cross(zaxis, xaxis);

Matrix これが欲しかったMatrix =new Matrix(
xaxis.X ,yaxis.X ,zaxis.X ,0,
xaxis.Y ,yaxis.Y ,zaxis.Y ,0,
xaxis.Z ,yaxis.Z ,zaxis.Z ,0,
-Vector3.Dot(xaxis,Eye) ,-Vector3.Dot(yaxis,Eye) ,-Vector3.Dot(zaxis,Eye) , 1
);


HLSL内ではこうなる。

//ビュー変換行列を作成
float3 At = float3(0,0,0);//注視点
float3 Eye = LightPosition;//視点

float3 zaxis = normalize(Eye-At);
float3 xaxis = normalize(cross(float3(0,1,0),zaxis));
float3 yaxis = cross(zaxis, xaxis);

float4x4 ViewMatrix =float4x4( xaxis.x, yaxis.x, zaxis.x, 0,
xaxis.y, yaxis.y, zaxis.y, 0,
xaxis.z, yaxis.z, zaxis.z, 0,
-dot(xaxis,Eye),-dot(yaxis,Eye),-dot(zaxis,Eye),1);


ブログ、タブが認識されないらしくちょっと見た目が汚いけど自分でインデントしてください。
XNA上でこれを使う人は相当変わり者だと思いますが、シェーダ上で使えるのは嬉しい人もいるはず?
xaxisを求める部分に(0,1,0)を決めうちしちゃってるので変える必要がある場合はそこを弄ってね!

内容説明は・・・
ぉ!お腹が痛くなってきた!

ねよっと。

コメントの投稿

非公開コメント

プロフィール

あしゅ

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

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

この人とブロともになる

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