トップページ > 記事閲覧
ウィンドウサイズ可変プログラムの3D描画の画角について
名前:まさすけ 日時: 2019/06/09 15:09

ウィンドウサイズ可変のプログラムで3D描画をしようとしているのですが、 ウィンドウサイズが変更された場合にもウィンドウ内に描画されるグラフィックの画角を一定に保ちたいと考えております。 現在、作成中のプログラムの抜粋をお伝えさせていただきます phm_wid = GetSystemMetrics(SM_CXMAXTRACK) - 12; phm_hei = GetSystemMetrics(SM_CYMAXTRACK) - 12; SetGraphMode(phm_wid, phm_hei, 32); SetWindowStyleMode(7); SetWindowSizeChangeEnableFlag(TRUE, FALSE); SetUse3DFlag (1) ; SetWindowSize(800, 600); if (DxLib_Init() == -1) return -1;     【諸々初期化】 while (1){ GetWindowSize( &wwid, &whei ) ; SetupCamera_Perspective(M_PI/3.0 *(float)phm_wid/(float)wwid); 【描画処理】 ScreenFlip(); if (ProcessMessage() == -1){ break; } } DxLib_End(); return 0; ウィンドウが初期サイズより大きく変更される可能性があることを考慮し DxLib_Init の前に SetGraphMode でデスクトップ全体サイズを指定しています。 この結果3Dエリアの描画エリアがデスクトップサイズになるのでしょうか、 実際にウィンドウ内に描画される画角は非常に狭いものとなってしまいます。 ウィンドウサイズが変更されてもウィンドウ内に60度の画角でCGを描画したいため 上記のように デスクトップ幅/ウィンドウ幅 を掛けて大きくした画角を SetupCamera_Perspectiveに設定しています。 しかしながらこの方法ではウィンドウサイズが小さくなると画角が大きく変化し、 特に、SetupCamera_Perspectiveに設定する値が3.14に近くなると画像が歪み 3.14を超えると画像がひっくり返ってしまいます。 SetGraphModeのようなスクリーンモード変える関数とは別に 描画スクリーンのサイズを変更するよう関数があり その描画領域に対して画角を指定できるとよいと思うのですが、 そのような方法はないでしょうか? ご指南の程よろしくお願いいたします。
メンテ

Page: 1 |

Re: ウィンドウサイズ可変プログラムの3D描画の画角について ( No.1 )
名前:まさすけ 日時:2019/06/09 15:31

お騒がせして申し訳ありません。 ループ内のSetupCamera_Perspectiveを SetupCamera_Perspective( atan(tan(M_PI/3.0/2.0) *(float)phm_wid/(float)wwid)*2.0 ) ; とすることで一応、解決しました。 とはいえ、なんとなく腹落ちしない気分でおります。 よりよい解決法がありましたらご指南ください。
メンテ
Re: ウィンドウサイズ可変プログラムの3D描画の画角について ( No.2 )
名前:管理人 日時:2019/06/10 00:29

> SetGraphModeのようなスクリーンモード変える関数とは別に > 描画スクリーンのサイズを変更するよう関数があり > その描画領域に対して画角を指定できるとよいと思うのですが、 > そのような方法はないでしょうか? ぴったりな機能はありませんが、射影行列とビューポート行列を直接指定する関数( SetTransformToProjection と SetTransformToViewport )を使用すれば Fov の計算式はシンプルになります // 現在のクライアント領域のサイズを取得 int wwid, whei ; GetWindowSize( &wwid, &whei ) ; // 射影行列を設定 MATRIX ProjectionMatrix ; CreatePerspectiveFovMatrix( &ProjectionMatrix, tan( DX_PI_F / 3.0 / 2.0 ) * whei / wwid, 0.001f, 1000.0f, ( float )whei / wwid ) ; SetTransformToProjection( &ProjectionMatrix ) ; // ビューポート行列を設定 MATRIX ViewportMatrix ; CreateViewportMatrix( &ViewportMatrix, wwid / 2.0f, whei / 2.0f, ( float )wwid, ( float )whei ) ; SetTransformToViewport( &ViewportMatrix ) ; // 描画領域を設定 SetDrawArea( 0, 0, wwid, whei ) ; 行数は増えてしまいますが… (- -;;
メンテ
Re: ウィンドウサイズ可変プログラムの3D描画の画角について ( No.3 )
名前:まさすけ 日時:2019/06/11 00:35

ありがとうございます。 ご教授いただいた方法で、 描画領域に対して画角が設定できているようで ウィンドウの拡縮に対して描画が非常に安定しました。 ところで、ご教授いただいたプログラムそのままですと、画角が30度強しかないようです CreatePerspectiveFovMatrix の引数を  CreatePerspectiveFovMatrix( &ProjectionMatrix, DX_PI_F / 3.0 * whei / wwid, 0.001f, 1000.0f, ( float )whei / wwid ) ; としたところ、ほぼ60度の画角の画像が描画できました。 ご報告まで。 リファレンスページに説明の無い関数も是非使いこなしてみたいと思いました。 ゆっくりでもかまいませんので、リファレンスページやDxLib.hのご説明を拡充してください。 よろしくお願いいたします。 ありがとうございました。
メンテ
Re: ウィンドウサイズ可変プログラムの3D描画の画角について ( No.4 )
名前:管理人 日時:2019/06/12 23:35

> リファレンスページに説明の無い関数も是非使いこなしてみたいと思いました。 > ゆっくりでもかまいませんので、リファレンスページやDxLib.hのご説明を拡充してください。 > よろしくお願いいたします。 使用される率が低そうな関数をリファレンスページに追加すると初心者の方が 『沢山関数があるけど何を使えばいいのか分からない』という状態になりそうなので、 現状では DxLib.h の説明の追加となりそうです とはいえ、リファレンスにない関数も大量にありますので、漠然と関数の説明を充実させる作業は 幾ら時間があっても足りそうになく、なかなか実行できそうにありません… 具体的に現在より詳細な説明を追加してほしい関数がありましたら仰っていただければ対応します (・・;;
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存