ページ 11

【DirectX9】平行投影(D3DXMatrixOrthoLH)を使用した際の表示オブジェクトのサイズ

Posted: 2019年10月01日(火) 22:55
by うましゅー
現在平行投影と透視投影を切り替えるゲームを作成しており、その際にD3DXMatrixOrthoLHを使用しているのですが、Z座標が無視される為ポリゴンのサイズが透視投影に比べてとても小さくなってしまいます。
カメラの視点Z分オブジェクトのサイズを変えれば問題解決かとは思いますが、いちいち投影方法を変更するごとにすべてのオブジェクトのサイズを変更するのはいかがなものかと思ってしまいます。
何か別のアイデアはないのでしょうか…?

Re: 【DirectX9】平行投影(D3DXMatrixOrthoLH)を使用した際の表示オブジェクトのサイズ

Posted: 2019年10月02日(水) 12:16
by camera
小さいなら、投影の行列にスケーリング行列をかませて、”拡大”してやればよいのでは。
全てのオブジェクトを個別に拡大するのではなく、
画面を拡大(ズーム)するという事です。

Re: 【DirectX9】平行投影(D3DXMatrixOrthoLH)を使用した際の表示オブジェクトのサイズ

Posted: 2019年10月02日(水) 21:53
by うましゅー
camera さんが書きました:
5年前
小さいなら、投影の行列にスケーリング行列をかませて、”拡大”してやればよいのでは。
全てのオブジェクトを個別に拡大するのではなく、
画面を拡大(ズーム)するという事です。
上記の通り変更を行い大きさに関してはなんとかなりましたが、軽く描画位置に関するずれがおきてしまいます。
画面上の中心に関してはずれを感じませんが上下左右にオブジェクトの位置が中心から遠ざかるとズレを大きく感じてしまいます。

コード:

//透視投影
		D3DXMatrixPerspectiveFovLH(&m_matProj, D3DXToRadian(45.0f), (float)SCREEN_WIDTH / SCREEN_HEIGHT, 1.0f, 10000.0f);
//平行投影
D3DXMatrixOrthoLH(&m_matProj, (float)SCREEN_WIDTH, (float)SCREEN_HEIGHT, 1.0f, 10000.0f);
		D3DXMatrixIdentity(&matScale);
		D3DXMatrixScaling(&matScale, fabsf(vEyePt.z), fabsf(vEyePt.z), 1.0f);	//	透視投影の場合Z軸が基本マイナスなのでfabsfを使用
		D3DXMatrixMultiply(&m_matProj, &m_matProj, &matScale);
上記のコードはキー入力で投影方法が変わるように組んでいるのですが、スケーリング以外に何か行う必要があるのでしょうか?
予想では視野角が関係してるのでは?と思うのですが…

Re: 【DirectX9】平行投影(D3DXMatrixOrthoLH)を使用した際の表示オブジェクトのサイズ

Posted: 2019年10月03日(木) 12:11
by みくみ
ちょっと思ったのですが、ずれていると言うよりもそれが本来の平行投影での正しい表示結果だという可能性はありませんか?思った結果とは違うというだけで。
平行投影は遠近法を全く無視した投影方法ですから全体が小さすぎるとか大きすぎるといったことはあっても、画面に対する場所によって位置や大きさがずれるといった問題はそもそも発生しない気がします。

Re: 【DirectX9】平行投影(D3DXMatrixOrthoLH)を使用した際の表示オブジェクトのサイズ

Posted: 2019年10月04日(金) 19:13
by たぼーる
3Dを2Dに落とし込む際、透視投影の場合はカメラの距離Zに応じてXYをスケーリングします。
なので近いものは大きく、遠いものは小さく見えます。
平行投影の場合その名の通り視野角はありませんので弄れません。
なのでオブジェクトとカメラの距離にかかわらず大きさは一定となります。

見え方の差異を少なくしたいというのでしたら、
平行投影行列を弄るのではなく透視投影行列の視野角を狭くする(平行投影に近づける)と良いかと思います。