トップページ > 過去ログ > 記事閲覧
3Dモデルの表示について
名前:獅子 日時: 2012/03/26 09:08

ttp://2style.net/leonhardt/cap.png ttp://lowe.client.jp/model.zip いつもお世話になっています。 3Dモデルをなんとか作ってみたのですが、表示について質問させてください。 先に張ったURL、二つ目は作ったテストモデルです。 そしてそれをDXライブラリの関数で描画したさいに、交差するポリゴンが異様にジャギジャギしてしまいます。(一つ目の画像 DXModelViewerで読み込むと美しく表示されるのですが、これはモデルに問題があるのか、あるいは何か設定を行なう必要があるのか、 ご教授していただけませんでしょうか。 それとジャギとは別にもう一点聞かせてください。 うpしたモデルはmqoファイルなのですが、メタセコイアで表示されるモデルと DXライブラリで表示したモデルで形が全く違う場所があるのですが、これは何故なのでしょうか? 二点よろしくお願いします。

Page: 1 |

Re: 3Dモデルの表示について ( No.1 )
名前:獅子 日時:2012/03/26 09:10

すいません、環境はVisualStudio2010、Windows7です。
Re: 3Dモデルの表示について ( No.2 )
名前:いっち 日時:2012/03/27 19:16

描画順序の問題ではないでしょうか? 半透明要素のあるフレームをZソートしてから描画なさってみてください。
Re: 3Dモデルの表示 ( No.3 )
名前:獅子 日時:2012/03/27 20:46

いいえ、Zソートは行っております。
Re: 3Dモデルの表示について ( No.4 )
名前:いっち 日時:2012/03/27 21:30

私の環境で試しましたが、特にそれらしい部分が見当たりませんでした。 画像も拝見したのですが、近すぎてモデルのどの部分に注目しているのか分かりませんでした。 可能であれば事象を再現するためのコードをご提供下さい。
Re: 3Dモデルの表示について ( No.5 )
名前:sin 日時:2012/03/28 01:02

ひょっとしたら、mqoモデル内でのパーツ順の問題ではないでしょうか? 提示していただいたmqoファイル内では、パーツが 1>2>3の順になっていますが、正しく表示させるには 1>3>2の順に並び替えたほうが良いかと。 これで駄目なら単純にビデオカードの問題かもしれません。 断定は出来ませんが・・・。
Re: 3Dモデルの表示について ( No.6 )
名前:獅子 日時:2012/03/28 05:55

>sinさん 確かに名前はそうなっているのですが、これは作った順に番号を振っただけでしてコードでは1>3>2の順に描画しております。 >いっちさん 確かに画像が近すぎました。少し引いた上でメタセコイアと比較した画像も用意してみました。 ttp://lowe.client.jp/img/ss/cap_2.png ttp://lowe.client.jp/img/ss/cap_3.png(文字入り とりあえず同じことがおきるコードを作りました。 具体的な位置ですが、1点目は島と海の境界すべて、2点目はだいたいzが500,600、xがマイナス200のあたりです 私の環境でしか起きないのでしょうか・・・ #include <DxLib.h> #include <math.h> class CBattleCamera{ VECTOR Position; // カメラ座標 VECTOR Target_position; // 注視点 unsigned Range; // 注視点までの距離 float Angle_down; // 見下ろす角度(単位:ラジアン) float Angle_rotation; // 回転角度(単位:ラジアン) ただし( 0, 0, -1 )のベクトルを0ラジアンとする VECTOR Target_position_now;// 現在の注視点 unsigned Range_now; // 現在の注視点までの距離 float Angle_down_now; // 現在の見下ろす角度(単位:ラジアン) float Angle_rotation_now; // 現在の回転角度(単位:ラジアン) ただし( 0, 0, -1 )のベクトルを0ラジアンとする float Angle_down_speed; // 見下ろし変化スピード public: CBattleCamera() :Target_position( VGet( 0.0f, 0.0f, 0.0f )) ,Target_position_now( VGet( 0.0f, 0.0f, 0.0f )) ,Range( 800 ) ,Range_now( 800 ) ,Angle_down( PHI_F/5.0f ) ,Angle_down_now( PHI_F/5.0f ) ,Angle_rotation( PHI_F/4.0f*3 ) ,Angle_rotation_now( PHI_F/4.0f*6 ) { this->Position.y = this->Range * sin( this->Angle_down ); this->Position.x = sin( this->Angle_rotation )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down))); this->Position.z = cos( this->Angle_rotation )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down))); } ~CBattleCamera(){} bool Process(){ this->Position.x = this->Target_position_now.x + sin( this->Angle_rotation_now )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down))); this->Position.z = this->Target_position_now.z + cos( this->Angle_rotation_now )*(sqrt(this->Range*this->Range-sin(this->Angle_down)*sin(this->Angle_down))); this->Target_position_now.x += ( this->Target_position.x - this->Target_position_now.x ) / 10; this->Target_position_now.y += ( this->Target_position.y - this->Target_position_now.y ) / 10; this->Target_position_now.z += ( this->Target_position.z - this->Target_position_now.z ) / 10; if( this->Angle_down != this->Angle_down_now ){ if( this->Angle_down > this->Angle_down_now ){ this->Angle_down_now += this->Angle_down_speed; this->Angle_down < this->Angle_down_now && ( this->Angle_down_now = this->Angle_down ); } else { this->Angle_down_now -= this->Angle_down_speed; this->Angle_down > this->Angle_down_now && ( this->Angle_down_now = this->Angle_down ); } } if( this->Angle_rotation != this->Angle_rotation_now ){ if( this->Angle_rotation > this->Angle_rotation_now ){ this->Angle_rotation_now += PHI_F/72.0f; this->Angle_rotation < this->Angle_rotation_now && ( this->Angle_rotation_now = this->Angle_rotation ); } else { this->Angle_rotation_now -= PHI_F/72.0f; this->Angle_rotation > this->Angle_rotation_now && ( this->Angle_rotation_now = this->Angle_rotation ); } } SetCameraPositionAndTarget_UpVecY( this->Position, this->Target_position_now ); return true; } void AddCameraTargetPosition( VECTOR pos ){ this->Target_position = DxLib::VAdd( this->Target_position, pos ); this->Position = DxLib::VAdd( this->Position, pos ); } void AddCameraAngleRotation( float angle ){ this->Angle_rotation += angle; } }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ DxLib::SetGraphMode( 640, 480, 32 ) ; // 解像度設定 DxLib::ChangeWindowMode(TRUE); // ウィンドウモードに変更 DxLib::DxLib_Init(); // DXライブラリ初期化 DxLib::SetDrawScreen( DX_SCREEN_BACK ); // 描画先を裏画面に設定 DxLib::SetUseZBuffer3D(TRUE); // Zバッファを有効にする DxLib::SetWriteZBuffer3D(TRUE); // Zバッファへの書き込みを有効にする DxLib::SetMouseDispFlag(TRUE); // マウスを表示状態にする DxLib::SetUseBackCulling( TRUE ); // バックカリングを行う DxLib::SetCameraNearFar( 1.0f, 20000.0f ); DxLib::SetupCamera_Perspective( PHI_F/5 ); int ModelHandle = MV1LoadModel( "fie.mqo" ); float u = 0.0f; CBattleCamera Camera; while( !DxLib::ScreenFlip() && !DxLib::ProcessMessage() && !DxLib::ClearDrawScreen() && !DxLib::clsDx() ){ u+=0.0025f/60.0f; if( u > 1.0f ){ u = 0.0f; } VECTOR CameraPos = VGet(0.0f,0.0f,0.0f); if( DxLib::CheckHitKey( KEY_INPUT_UP ) > 0 ) { CameraPos.z += 10.0f ; } if( DxLib::CheckHitKey( KEY_INPUT_DOWN ) > 0 ) { CameraPos.z -= 10.0f ; } if( DxLib::CheckHitKey( KEY_INPUT_LEFT ) > 0 ) { CameraPos.x -= 10.0f ; } if( DxLib::CheckHitKey( KEY_INPUT_RIGHT ) > 0 ) { CameraPos.x += 10.0f ; } if( DxLib::CheckHitKey( KEY_INPUT_A ) == 1 ) { Camera.AddCameraAngleRotation( PHI_F/4.0f/20.0f ); } Camera.AddCameraTargetPosition( CameraPos ); Camera.Process(); DxLib::MV1SetFrameTextureAddressTransform( ModelHandle, 1, u, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f ) ; DxLib::MV1SetFrameTextureAddressTransform( ModelHandle, 2, 0.0f, u, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f ) ; DxLib::MV1DrawFrame( ModelHandle,0 ) ; DxLib::MV1DrawFrame( ModelHandle,2 ) ; DxLib::MV1DrawFrame( ModelHandle,1 ) ; DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 500.0f, 0.0f, 0.0f ), GetColor( 255,0,0 ) ) ; DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 500.0f, 0.0f ), GetColor( 0,255,0 ) ) ; DxLib::DrawLine3D( VGet( 0.0f, 0.0f, 0.0f ), VGet( 0.0f, 0.0f, 500.0f ), GetColor( 0,0,255 ) ) ; DxLib::printfDx("Aで視点回転できます。"); } DxLib::DxLib_End(); return 0; }
Re: 3Dモデルの表示について ( No.7 )
名前:いっち 日時:2012/03/28 19:24

以下の行をコメントにするとうまくいっているように見受けられました。 > DxLib::SetCameraNearFar( 1.0f, 20000.0f ); "1.0f" と "20000.0f" が不適切な値なのかどうか、 また、どういった理由でこのような事象になるのかは分かりません。
Re: 3Dモデルの表示について ( No.8 )
名前:獅子 日時:2012/03/28 22:23

> いっちさん ご返答ありがとうございます。 本当ですね、なぜなのかわかりませんが・・・ とりあえずNearを増やしてみたところ、5.0fあたりだとまだジャギィが見受けられるものの若干マシになり、 10.0fほどにするとまぁ許容できるレベルにはなりました。 テストコードはカメラを引いていますが、実際はかなり近づくので2.0fほどにはしたいのですが・・・ リファレンスでも1.0fを使っていますし、何かDXライブラリ側の問題なのでしょうかね。 バグ・・・あるいは仕様かどうか管理人様の見解を待つことにします。
Re: 3Dモデルの表示について ( No.9 )
名前:管理人 日時:2012/04/01 06:43

3Dシーンの描画では画面の1ピクセル毎に書き込まれたピクセルの奥行きは如何程かを記録するZバッファを使用して 後から描画した物体がその以前に描画した物体よりも奥にあるときは描画しない、という処理をしているのですが、 このZバッファの精度は SetCameraNearFar の設定で変化します Near と Far の範囲が狭ければ狭いほど精度が上がるのですが、Far の値を小さくしても殆ど精度は上がらず、 実質的に Near の値をどれだけ大きくするかで精度がほぼ決定します 精度が悪くなると奥行き方向の前後関係の判定が荒くなるので結果としてアップして頂いたスクリーンショットのようにZバッファ由来のジャギが発生します なので、描画に支障が無い範囲で Near の値を大きくするようにしてみてください > リファレンスでも1.0fを使っていますし、何かDXライブラリ側の問題なのでしょうかね。 リファレンスでは小さなモデルを扱う例として1.0fを使っていますが、mqoモデルのように 大きなモデルでは Near が 1.0 だと今回ご報告いただいたような現象が発生してしまうと思います
Re: 3Dモデルの表示について ( No.10 )
名前:獅子 日時:2012/04/01 09:31

> 管理人様 ご返答ありがとうございます。 なるほど、そういうことでしたか。ありがとうございます。 ですが、メタセコイアで表示した場合とDXライブラリで表示した場合に形が違う点についてのご回答は頂けないのでしょうか? 読み落としでしたらご解説いただけるとありがたいです。宜しくお願いします。
Re: 3Dモデルの表示について ( No.11 )
名前:管理人 日時:2012/04/01 16:49

すみません見落としていました m(_ _;m 確認してみたところ件の箇所は4頂点が同一平面上に無い4角形ポリゴンのようです DXライブラリとメタセコイアで4角形ポリゴンを3角形ポリゴン2個にする際に使う頂点の順番が違うために 結果が違ってしまっていたようです 4角ポリゴンを構成する4頂点→0,1,2,3 DXライブラリの場合 0,1,3 と 1,2,3 の3角形ポリゴン2つに変換 メタセコイアの場合 0,1,2 と 2,3,0 の3角形ポリゴン2つに変換 メタセコイアと同じ結果になるように分割処理を変更してみたバージョンをアップしましたので、 よろしければお試しになってみてください 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)」をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip
Re: 3Dモデルの表示について ( No.12 )
名前:獅子(解決 日時:2012/04/01 21:58

> 管理人様  ご返答と素早いご対応ありがとうございます。 暫定バージョンで想定と同じ結果が得られました。有難う御座いました。

Page: 1 |