トップページ > 過去ログ > 記事閲覧
3D描画関数について
名前:獅子 日時: 2012/02/24 11:55

お世話になっております。獅子です。 3Dモデル描画関数等において、 視野に入っていないモデル(ポリゴン)は描画しないなどの処理は DXライブラリ側で行なわれていますのでしょうか? 行なわれていない場合、視野にはいっているか どう判定したらよいのでしょうか? ご教授お願いします。

Page: 1 |

Re: 3D描画関数について ( No.1 )
名前:管理人 日時:2012/03/04 20:40

スキンニングメッシュではない場合は簡易的な可視チェックを行い、 カメラの視界に入っていないと判断された場合は描画を行わないようにしています ( ただ、MV1DrawMesh の場合は常に可視チェックは行いません ) スキニングメッシュの場合はボーンのパラメータ次第でどんな形にも変形するので 頂点単位で可視チェックをしない限り正確な可視チェックが行えないということで 常に描画するようにしています ( スキニングメッシュとアニメーションを作成した本人には無茶な変形はしないと 分かっていても、それはDXライブラリには分からないので ) 視野に入っているかどうかを判定するための処理は少し計算が面倒なので関数を追加しました よろしければこちらをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数はこちらの関数です // 二つの座標で表されるボックスがカメラの視界に入っていないかどうかを判定する // ( 戻り値 TRUE:視界に入っていない FALSE:視界に入っている ) int CheckCameraViewClip_Box( VECTOR BoxPos1, VECTOR BoxPos2 ) ; 2点を使って表現されたボックスが視野に入っているかどうかをこれで判定します ↓は3D空間を左右に飛び回るボックスが視野に入っているかを画面左上に表示するサンプルです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VECTOR Position ; VECTOR BoxPos1, BoxPos2 ; float XAdd ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // Zバッファを使用する SetUseZBuffer3D( TRUE ) ; // Zバッファへの書き込みを行う SetWriteZBuffer3D( TRUE ) ; // 飛び回るボックスの座標を初期化 Position = VGet( 320, 240, 0.0f ) ; // 飛び回るボックスのX軸の移動速度をセット XAdd = 8.0f ; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面を初期化 ClearDrawScreen() ; // ボックスの座標を更新 Position.x += XAdd ; // もし画面内から大きく外れたら方向を反転する if( Position.x < -200.0f || Position.x > 840.0f ) { XAdd = -XAdd ; } // ボックスを現す2点の座標を準備 BoxPos1 = VSub( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ; BoxPos2 = VAdd( Position, VGet( 10.0f, 10.0f, 10.0f ) ) ; // 画面内にボックスが入っていないかどうかを描画する if( CheckCameraViewClip_Box( BoxPos1, BoxPos2 ) == TRUE ) { DrawString( 0, 0, "Screen Out:Yes", GetColor( 255,255,255 ) ) ; } else { DrawString( 0, 0, "Screen Out:No", GetColor( 255,255,255 ) ) ; } // ボックスを描画する DrawCube3D( BoxPos1, BoxPos2, GetColor( 255,255,255 ), GetColor( 0,0,0 ), TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } モデルが納まるサイズのボックスの座標を引数に渡してこの関数を呼ぶことで視野に入っているかどうかを 判定することができます よろしければお試しください m(_ _)m
Re: 3D描画関数について ( No.2 )
名前:獅子(解決 日時:2012/03/05 08:41

> スキンニングメッシュではない場合は簡易的な可視チェックを行い、 > カメラの視界に入っていないと判断された場合は描画を行わないようにしています なるほど、では基本的には描画の是非をこちらで全て確認していく必要はないのですね。 > モデルが納まるサイズのボックスの座標を引数に渡してこの関数を呼ぶことで視野に入っているかどうかを > 判定することができます わざわざ関数を作って頂いてありがとうございます。正常な動作を確認できました。 ありがとうございましたm(_ _)m

Page: 1 |