プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
現在自作で3Dゲームを制作しています。
ワールド座標からスクリーン座標への変換に成功したので
今度は逆にスクリーン座標からワールド座標への変換に挑戦していたのですが
どうにもうまくいかずに詰まってしまい、質問にきました。

ワールド→スクリーン変換にて得たスクリーン座標(sx, sy, sz)を使用して
スクリーン→ワールド変換を行うと成功するのですが
直接スクリーン→ワールド変換を行おうとすると失敗します。
というのも、直接スクリーン→ワールド変換時には sz にあたる値を
どうしたらいいものか・・・となってしまったからです。

今回、手計算(ヘルプ関数は使わず)で行っているのですが、計算していることは
ビューポート行列、プロジェクション行列、ビュー行列の逆行列を使用し
スクリーン座標(とりあえずszを0にして対応)に対して座標変換をおこなっています。
何か計算が足りていないのか、はたまた勘違いをしているのか・・・


詳しいご教授お願いいたします。


ワールド行列:単位行列
ビュー行列:視点と視線は動的に変動、上向き(0,1,0)
プロジェクション行列:視野角45度、アスペクト比 800/600
画面サイズ:800×600
テストに使用しているスクリーン座標:(200,300)

A 回答 (2件)

そもそもスクリーンに映っているのは奥行き情報が消えた「2D な絵」ですよね. だとしたら, 「視点から当該スクリーン座標に向かう (無限に長い) 視線」の上にある点はすべて「3D なワールド座標」の候補になってしまいます. そして, そのうちのどれが「正しいワールド座標」なのかをこれだけの情報から求めることは不可能です.



夜空に光る星までの距離を求めるには, 「ここで光ってる」という情報だけでは不足ですよね.

もちろん, スクリーンに映っている画像を作る元になった (ワールド座標における) オブジェクトの配置がすべてわかっているなら, 「視線の先にあるオブジェクト」を調べることはできます. もっと難しくして鏡面反射とか屈折とかを考慮すると, 結局レイトレになっちゃいますがここではそこまでの処理は不要でしょう.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど、確かにその通りですね。
参考になりました。 ありがとうございます。

お礼日時:2011/06/22 20:21

たとえば、ワールド座標の点をスクリーン座標への変換式を



P = M・r { P:スクリーン座標値、M:変換行列、r:ワールド座標値 }

とすると、スクリーンからワールドへの変換は

r = M^(-1)・P

となる。

スクリーン上の座標(x,y)に対して、下記式によってワールド座標の2点を求めると、

r0 = M^(-1)・(x,y,0,1)
r1 = M^(-1)・(x,y,1,1)

これら2点はそれぞれスクリーン上で(x,y)に表示され、クリッピング領域の前後方向の端に位置します。

この2点を結ぶ直線上にある点は画面上で同じ位置に表示されるため、一意にワールド座標の一点を求めることはできません。

たとえば、スクリーン座標のある点にあるオブジェクトの表面上の1点を求めたい等の場合、上記式に限らず何らかの方法で、スクリーン座標の点に対応するレイを求め、オブジェクトとの交差判定を行う、といった処理がひつようになります。
    • good
    • 0
この回答へのお礼

お返事をお待たせして大変申し訳ありませんでした。

参考にされていただき、解決することができました。

ありがとうございました。

お礼日時:2011/09/13 18:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!