正射影。簡単にいうと、画面の奥行きの概念をなくした射影変換である。
この射影変換をすれば、普段の3Dの画面が2Dになる。そして奥行き、つまり遠近感がなくなる。
その事に関して長い間引っかかったことがあったので・・・メモる。
DirectXでは、D3DXMatrixOrthoLH()という関数を使えば、簡単に正射影変換ができる。
で、その関数の引数に、幅、高さ、ニアプレーン、ファープレーンを設定するわけなんだが・・・。
それで普通にゲームを作っていたら、何かがおかしい。
具体的に言うと、当たり判定がバグった。
画面の右下に行けば行くほど、当たり判定がずれていくのだ。
「なんじゃこりゃ?」と、悩むこと1週間。
原因はこの正射影だった。
幅と高さに、ウィンドウの幅、高さを渡していたのだ。それが間違い。
ウィンドウには、外枠が存在する。ウィンドウの名前とか、終了ボタンとかがある場所がそれだ。
ウィンドウの幅、高さというのは、その外枠を含めてのサイズになる。
つまり、実際の画面のサイズ(クライアント領域という)とウィンドウのサイズは微妙に違うのだ。
それ故に、当たり判定がずれた。
正確には、自分の思っていた位置とは少しずれた位置に描画されていたのだ。
正射影をするときには、クライアント領域の幅、高さを渡してやらないといけない。
同じ現象にもしも悩まされている人は、ぜひとも試していてほしい。
この射影変換をすれば、普段の3Dの画面が2Dになる。そして奥行き、つまり遠近感がなくなる。
その事に関して長い間引っかかったことがあったので・・・メモる。
DirectXでは、D3DXMatrixOrthoLH()という関数を使えば、簡単に正射影変換ができる。
で、その関数の引数に、幅、高さ、ニアプレーン、ファープレーンを設定するわけなんだが・・・。
それで普通にゲームを作っていたら、何かがおかしい。
具体的に言うと、当たり判定がバグった。
画面の右下に行けば行くほど、当たり判定がずれていくのだ。
「なんじゃこりゃ?」と、悩むこと1週間。
原因はこの正射影だった。
幅と高さに、ウィンドウの幅、高さを渡していたのだ。それが間違い。
ウィンドウには、外枠が存在する。ウィンドウの名前とか、終了ボタンとかがある場所がそれだ。
ウィンドウの幅、高さというのは、その外枠を含めてのサイズになる。
つまり、実際の画面のサイズ(クライアント領域という)とウィンドウのサイズは微妙に違うのだ。
それ故に、当たり判定がずれた。
正確には、自分の思っていた位置とは少しずれた位置に描画されていたのだ。
正射影をするときには、クライアント領域の幅、高さを渡してやらないといけない。
同じ現象にもしも悩まされている人は、ぜひとも試していてほしい。