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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
うましゅー

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

#1

投稿記事 by うましゅー » 2ヶ月前

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

camera

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

#2

投稿記事 by camera » 2ヶ月前

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

うましゅー

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

#3

投稿記事 by うましゅー » 2ヶ月前

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

コード:

//透視投影
		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)を使用した際の表示オブジェクトのサイズ

#4

投稿記事 by みくみ » 2ヶ月前

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

たぼーる

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

#5

投稿記事 by たぼーる » 2ヶ月前

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

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

返信

“C言語何でも質問掲示板” へ戻る