スキンニングメッシュではない場合は簡易的な可視チェックを行い、
カメラの視界に入っていないと判断された場合は描画を行わないようにしています
( ただ、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