トップページ > 過去ログ > 記事閲覧
DrawRotaGraph3Dについて
名前:とりねこ 日時: 2010/01/22 00:46

こんばんは、いつもDXライブラリを利用させて頂いております。 さっそく質問ですが、タイトルの通りDrawRotaGraph3Dについてです。 現在、ビットマップなどの【画像】,【平面のポリゴン(DrawPolygon3D系)】,Xファイルなどの【モデル】データを用いて、Zバッファを使った描画の優先度の実験をしています。(ライブラリのバージョンは3.01です) その為、SetUseZBuffer3DとSetWriteZBuffer3D、およびMV1SetUseZBufferとMV1SetWriteZBufferをTRUEに設定して上記の画像などを表示してみたところ、ビットマップから読み込んだ【画像】だけが表示されませんでした。 原因を調べてみると、SetUseZBuffer3DをTRUEに設定してDrawRotaGraph3Dを実行すると、うまく表示されないことが分かりました。 このDrawRotaGraph3Dでは、Zバッファ関係の処理は使えないのでしょうか? 念のため、実験に使ったソースを載せておきます(サンプルプログラム実行用フォルダで実行できると思います) #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphID; //画像用のハンドル int ModelID; //モデル用のハンドル VERTEX3D ver[4]; //平面ポリゴン用の頂点データ VERTEX3D dver[4]; //描画用の一時頂点データ unsigned short index[6]; //Index用の配列 VECTOR drawgraphPos; //画像の位置を表すベクトル VECTOR polygonPos; //平面ポリゴンの位置を表すベクトル VECTOR modelPos; //モデルの位置を表す int i; //汎用のイテレータ(for文用) SetGraphMode(640,480,32);//画面を640×480 32bitにする SetDrawScreen(DX_SCREEN_BACK);//描画先をバックバッファへ ChangeWindowMode(TRUE); //ウィンドウモードで起動する // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } GraphID = LoadGraph("test1.bmp"); //画像"test1.bmp"を読み込む ModelID = MV1LoadModel("AddressTest.mqo");//モデル"AddressTest.mqo"を読み込む MV1SetScale(ModelID,VGet( 0.2f, 0.2f, 0.2f));//モデルが大きいので、元の20%まで縮小させる //--------------平面ポリゴンの頂点情報をセットする-------------------------- ver[0].pos = VGet(-50.0f ,50.0f ,0.0f ); ver[1].pos = VGet(50.0f ,50.0f ,0.0f ); ver[2].pos = VGet(-50.0f ,-50.0f ,0.0f ); ver[3].pos = VGet(50.0f ,-50.0f ,0.0f ); index[0] = 0; index[1] = 1; index[2] = 2; index[3] = 1; index[4] = 3; index[5] = 2; for(i = 0;i < 4;i++) { ver[i].norm = VGet(0.0f ,0.0f ,-1.0f ); ver[i].dif = GetColorU8(255,255,255,255); ver[i].spc = GetColorU8( 0, 0, 0, 0); ver[i].u = 0.0f; ver[i].v = 0.0f; ver[i].su = 0.0f; ver[i].sv = 0.0f; } //------------------ここまで------------------------------------------------- drawgraphPos = VGet(270,240,0);//画像の位置を設定 polygonPos = VGet(320,240,0);//平面ポリゴンの位置を設定 modelPos = VGet(370,240,0);//モデルの位置を設定 MV1SetRotationXYZ(ModelID, //モデルの立体が分かりやすいように、Y軸に少し回転 VGet( 0.0f,(45.0f * PHI_F / 180.0f),0.0f ) ); while(ProcessMessage() != -1)//ループ開始、エラーが出たらループを抜ける { //----------------------------キー入力処理-------------------------------------------- //--------Zキーの処理---------------------------- if( CheckHitKey(KEY_INPUT_Z) == 1) { if( CheckHitKey(KEY_INPUT_UP) == 1) { drawgraphPos.z -= 10.0f; }else if( CheckHitKey(KEY_INPUT_DOWN) == 1) { drawgraphPos.z += 10.0f; } } //--------Xキーの処理------------------------- if( CheckHitKey(KEY_INPUT_X) == 1) { if( CheckHitKey(KEY_INPUT_UP) == 1) { polygonPos.z -= 10.0f; }else if( CheckHitKey(KEY_INPUT_DOWN) == 1) { polygonPos.z += 10.0f; } } //---------Cキーの処理----------------------- if( CheckHitKey(KEY_INPUT_C) == 1) { if( CheckHitKey(KEY_INPUT_UP) == 1) { modelPos.z -= 10.0f; }else if( CheckHitKey(KEY_INPUT_DOWN) == 1) { modelPos.z += 10.0f; } } //-------------------------------ここまで----------------------------------------------- //------------------------------描画用前処理-------------------------------------------- for(i = 0;i < 4;i++)//描画用一時頂点データにコピー { dver[i] = ver[i]; } MATRIX moveMAT;//移動用行列 moveMAT = MGetTranslate(polygonPos);//単位行列生成 for(i = 0;i < 4;i++)//行列を用いて頂点を変換 { dver[i].pos = VTransform(ver[i].pos,moveMAT); } MV1SetPosition( ModelID, modelPos);//モデルの位置を設定する //----------------------------描画処理---------------------------------------------------- ClearDrawScreen();//画面をクリア SetUseZBuffer3D(TRUE); //DrawPolygonIndexed3Dの描画にZバッファを使用する SetWriteZBuffer3D(TRUE); //DrawPolygonIndexed3DのZバッファへの書き込みを許可 DrawPolygonIndexed3D(dver,4,index,2 ,DX_NONE_GRAPH,FALSE);//平面のポリゴンを表示 MV1SetUseZBuffer(ModelID,TRUE); //モデルの描画にZバッファを使用する MV1SetWriteZBuffer(ModelID,TRUE);//モデルのZバッファへの書き込みを許可 MV1DrawModel(ModelID); //モデルを表示 //*****************************問題の箇所********************************************** //************************************************************************************* //    ↓のコメントをはずすと正常に表示される // SetUseZBuffer3D(FALSE); //画像の表示にZバッファを使用しない(?) DrawRotaGraph3D(drawgraphPos.x //画像を表示(DrawRotaGraph3Dを使用) ,drawgraphPos.y ,drawgraphPos.z ,1.0f,0.0,GraphID,FALSE,FALSE); //************************************************************************************* //************************************************************************************* //画面を更新 ScreenFlip(); } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }

Page: 1 |

Re: DrawRotaGraph3Dについて ( No.1 )
名前:とりねこ 日時:2010/01/22 00:51

追記です。 実験用のプログラムは、Zキー or Xキー or Cキーと、 カーソルキーの↑キーまたは↓キーを同時に押すことによって、表示されている画像などのZ値を上下するものです(それによって、Zバッファの効果を確かめていました) Zキーと↑↓キーでビットマップの画像が、 同じくXキーで平面のポリゴンが、 さらにCキーでモデルが、それぞれ画面から近づいたり離れたりします。
Re: DrawRotaGraph3Dについて ( No.2 )
名前:管理人 日時:2010/01/28 01:54

再現プログラムのご掲載ありがとうございます すいません、Zバッファを有効にすると DrawRotaGraph3D で何も描画されないのはバグです 修正版をアップしましたので、お手数ですがこちらをお使いになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: DrawRotaGraph3Dについて ( No.3 )
名前:とりねこ(解決済み) 日時:2010/01/31 22:05

修正作業お疲れ様です。  さっそく実験用プロジェクトに修正版を入れてみたところ、 問題のあった箇所が正常に処理されるようになったことを確認しました。  実は、元々Zソートを使って2Dグラフィックスで擬似3Dを表現していた STGの、一部完全3D化の作業中だったのでこの関数が対応してくれる ことが重要なカギだったのです。 これで作業を再開することが出来ます。 ありがとうございました。

Page: 1 |