投稿者 tel | 2013年12月24日

スクリーン座標から指定の距離離れたワールド座標を求める

スクリーン座標(u,v)から、カメラから指定の距離だけ離れたワールド座標(x,y,z)を求める。
マウスでクリックした位置の3D座標を求めてその位置になんか配置するとかで使う。

2Dから3Dの座標に変換した場合、1点は一意には求まらず3D空間で直線になる。
なので3Dの点を一意に求める場合は直線とオブジェクトがぶつかった点とかカメラからの距離を使う。

一般的な3Dから2Dの変換はだいたいこんな感じになっている。(変換や座標系の名前は別名がいろいろある)

transform

カメラからの距離を指定したいのでビュー座標系でZが任意の値になればいい。

perspective

アスペクト比(aspect)、垂直画角(θy)を指定する透視投影行列は上記のようになる。クリップ座標への変換は

clip

クリップ座標は次のようになる。

clip

透視除算すると正規化デバイス座標は

xd yd zd

ビューポート変換してスクリーン座標は

xs ys

wは画面の幅。

さてワールド座標を最終的に求めるためにはビュー座標にビュー変換の逆行列をかければいいので、
ここで求めたいのはビュー座標のx,yがいくつになるか。(zは固定値なので)

xd_xs

xc_xd

x_xc

wを代入してまとめると

xs_x

透視投影行列の逆行列が分かっている場合は、クリップ座標を求めて逆行列をかければいいので

clip2

ワールド座標はビュー変換の逆行列(3×4)と透視投影変換の逆行列をかけて

world

になる。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。