トップページ > 過去ログ > 記事閲覧
3Dモデルが上手く表示されない
名前:Ike_SDK 日時: 2010/10/16 10:34

始めましてIke_SDKといいます。 毎回、DXライブラリを使わせてプログラミングしたりしているのですが、今回はDXライブラリで初の3Dに挑戦してみたのですが、以下の画像のようにモデルが上手く表示されません。 DxLibModelViewer.exeでは正確と表示されているのですが、プログラムを走らせると画像のように輪郭というかエッジの部分が黒く太くなります。 問題の画像 http://www1.axfc.net/uploader/He/so/297783 画像のモデルデータはMMDのマシンさんのタコルカを使わせてもらいました http://www10.plala.or.jp/masisi/DL_MMD.html 他にもいろいろなモデルデータを使って試してみましたが全て同じ結果になってしまいます。 以下はプログラムになります #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //3Dモデルの変数 int ModelHandle ; //カメラ座標の関数 float VRotate, HRotate, TRotate ; // タイトルを test に変更 SetMainWindowText( "3Dテストプログラム" ) ; // 画面モードの変更 SetGraphMode( 800 , 600 , 32 ) ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } // Zバッファを有効にする SetUseZBuffer3D( TRUE ) ; // Zバッファへの書き込みを有効にする SetWriteZBuffer3D( TRUE ) ; // ニア、ファー クリップの距離を設定 SetCameraNearFar( 100.0f, 2000.0f ) ; // カメラの回転値を初期化 VRotate = 0.0f ; HRotate = 0.0f ; TRotate = 0.0f ; // モデルの読み込み ModelHandle = MV1LoadModel( "モデルデータ保存ディレクトリ" ); ///////////////////////////////////////////////////////////////////////////////// //メインループ ///////////////////////////////////////////////////////////////////////////////// while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){ // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; DrawBox( 0 , 0 , 800 , 600 , GetColor( 255 , 255 , 255 ) , TRUE) ; // 四角形を描画 // 左シフトキーを押しているかどうかで処理を分岐 if( CheckHitKey( KEY_INPUT_LSHIFT ) == 1 ){ // 左右キーでカメラの捻り方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { TRotate -= PHI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { TRotate += PHI_F / 60.0f ; } }else{ // 左右キーでカメラの水平方向回転値を変更 if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) { HRotate -= PHI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) { HRotate += PHI_F / 60.0f ; } } // 上下キーでカメラの垂直方向回転値を変更 if( CheckHitKey( KEY_INPUT_UP ) == 1 ){ VRotate += PHI_F / 60.0f ; } if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ){ VRotate -= PHI_F / 60.0f ; } // カメラの位置と回転値をセット、カメラの位置は原点 SetCameraPositionAndAngle( VGet( 0.0f, 0.0f, 0.0f ), VRotate, HRotate, TRotate ) ; //モデルの拡大 MV1SetScale( ModelHandle, VGet(10.0f, 10.0f, 10.0f) ); //モデルの座標 MV1SetPosition( ModelHandle, VGet( 0.0f, -50.0f, 100.0f ) ) ; // モデルの描画 MV1DrawModel( ModelHandle ) ; // 裏画面の内容を表画面に反映させる ScreenFlip() ; // 画面をクリア ClearDrawScreen() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } 動作環境は OSが32bitのWindows 7 Home Premium CPUはIntel Corei7 870 メモリ4G グラフィックボードがGeForce GTS 250

Page: 1 |

Re: 3Dモデルが上手く表示されない ( No.1 )
名前:いっち 日時:2010/10/16 14:13

MV1SetScale の仕様ではないでしょうか? > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1895
Re: 3Dモデルが上手く表示されない ( No.2 )
名前:管理人 日時:2010/10/16 14:53

いっちさんも仰られていますが、MV1SetScale は輪郭線の太さにも影響を与えてしまうので アップしていただいた画像のような結果になってしまいます 拡大したサイズ分だけ輪郭線の太さを MV1SetMaterialOutLineDotWidth を使用して 細くすればこの現象を回避できますので、よろしければお試し下さい 例えば書き込んで頂いたサンプルプログラムでは MV1LoadModel の後、メインループに入る前の箇所に 以下のプログラムを挿入すれば問題は解消されます int MaterialNum, i ; float DotWidth ; // マテリアルの数を取得 MaterialNum = MV1GetMaterialNum( ModelHandle ) ; for( i = 0 ; i < MaterialNum ; i ++ ) { // マテリアルの元々の輪郭線の太さを取得 DotWidth = MV1GetMaterialOutLineDotWidth( ModelHandle, i ) ; // マテリアルの輪郭線の太さを10分の1にする MV1SetMaterialOutLineDotWidth( ModelHandle, i, DotWidth / 10.0f ) ; }
Re: 3Dモデルが上手く表示されない ( No.3 )
名前:Ike_SDK 日時:2010/10/16 14:57

リンク先を拝見させていただきました。 どうやらそのようですね。 >実装側としては、モデルを拡大する際に、各マテリアルに対して、 >MV1SetMaterialOutLineDotWidth(mh, num, MV1GetMaterialOutLineDotWidth(mh, num) / 倍率 ); >という処理をするようにしておけば、問題は解決しそうです。 リンク先に上記のような条件で対処できるかもとありましたが最後の部分の / 倍率ってのですが * 倍率にすると解決できるんですが、最初の描写の時だけ輪郭が広がっていく瞬間が見えます MaterialNum = MV1GetMaterialNum( ModelHandle ) ; for( i = 0 ; i < MaterialNum ; i ++ ){ MV1SetMaterialOutLineDotWidth( ModelHandle , i ,MV1GetMaterialOutLineDotWidth(ModelHandle, i) * 10.0f); } こんな感じにしてみたんですが、これではダメなのでしょうか?
Re: 3Dモデルが上手く表示されない ( No.4 )
名前:Ike_SDK 日時:2010/10/16 14:58

ありゃ・・・書き込んでる最中にあらたな書き込みがありましたか。 いっちさん、管理人さんありがとうございます。 試してみたいと思います
Re: 3Dモデルが上手く表示されない ( No.5 )
名前:Ike_SDK 日時:2010/10/16 15:00

無事に表示されることができました。 お手数おかけしてすみませんでした。 大変感謝いたします。

Page: 1 |