トップページ > 過去ログ > 記事閲覧
某モデルデータテクスチャ表示について(PMD)
名前:GMO 日時: 2011/08/08 23:08

自力解決が厳しいので質問させて頂きます。 PMD形式モデルデータ「初音ミク@七葉1052式物理演算仕様」を表示させたところ、一部テクスチャが 黒く表示されてしまいます。 解決策、もしくはどのような状態なのかご教授頂けると幸いです。 事象の詳細や開発環境については次に書かせていただきます。

Page: 1 |

事象の詳細と開発環境 ( No.1 )
名前:GMO 日時:2011/08/08 23:09

・モデル名称  ※   初音ミク@七葉1052式物理演算仕様 ・モデル配布元   http://loda.jp/nanoha_type1052_lovers/?id=13 ・事象   大まかに、モデルのリボン、ヘッドセット、上半身服、ネクタイ、スカートのテクスチャが黒一色で表示されてしまう   その他の箇所については正常にテクスチャが適用されている    ・当方で確認したこと   DXモデルビューワーでは正常に表示される   当該箇所のポリゴンを裏面から見た場合、表示されるべきテクスチャを確認できる。(MV1SetOpacityRateでも確認可能)   該当箇所に透過要素なし(DXモデルビューワーにて確認)   ・開発環境   OS:Windows Vista SP2(64bit)   グラフィックボード:GeForce 9600 GT   IDE:Microsoft Visual C++ 2010 Express   DXライブラリ:Ver 3.05f ※物理演算仕様無しのモデルでも同じ事象でしたが、報告時点で配布元がよくわからなかったので、 配布元がはっきりしている方で報告させて頂きました。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.2 )
名前:いっち 日時:2011/08/08 23:37

おそらく、トゥーンの輪郭線の問題だと思います。 >://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2014
Re: 某モデルデータテクスチャ表示について(PMD) ( No.3 )
名前:GMO 日時:2011/08/09 01:00

いっちさんありがとうございます。 輪郭線の太さが0.0f(なし)の場合に発生する事象であることが確認できました。 ついでに、基本トゥーンで輪郭無しの表示をする方法を試したところ、太さをありえないくらいの大きさにすれば、 表示可能範囲外になって結果的に輪郭線なしのような表示になることを確認しました。 あまりスマートなやり方ではありませんが、こうする他なさそうですねw
Re: 某モデルデータテクスチャ表示について(PMD) ( No.4 )
名前:いっち 日時:2011/08/09 20:46

少し誤解なさっているように見えるので、念のため、 正常に描画できているであろうというテストコードを載せておきます。 //- 以下、テストコード -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { if ( DxLib_Init( ) == -1 ) return -1; const float kScale = 50.0f; int ModelHandle = MV1LoadModel( "初音ミク@七葉1052式物理演算仕様.pmd" ); MV1SetPosition( ModelHandle, VGet( 320.0f, -240.f, 600.f ) ); MV1SetScale( ModelHandle, VGet( kScale, kScale, kScale ) ); int MaterialNum = MV1GetMaterialNum( ModelHandle ); for ( int i = 0; i < MaterialNum; i++ ) { float DotWidth = MV1GetMaterialOutLineDotWidth( ModelHandle, i ); MV1SetMaterialOutLineDotWidth( ModelHandle, i, DotWidth / kScale ); } SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); MV1DrawModel( ModelHandle ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: 某モデルデータテクスチャ表示について(PMD) ( No.5 )
名前:GMO 日時:2011/08/11 23:22

いっちさんありがとうございます。 MV1SetMaterialOutLineDotWidth ではなく MV1SetMaterialLineWidthを 実行していただければ、当方の先の書き込みで言いたかったことを理解していただけると思います。 Width値に0.0fを設定した場合、振る舞いに違いがあるようです。 描画について、MMD標準ミクにて、MV1SetMaterialLineWidth で Width=0.0f を設定したときに 輪郭線なしが達成できたと思ったんですが、このやり方だとモデルによって、今回のように意図しないところに輪郭線が出てしまうようです。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.6 )
名前:いっち 日時:2011/08/12 19:26

MV1SetMaterialOutLineDotWidth を使用しない理由が分かりません。 また、「輪郭線を消す」のか「モデルビューワーと同等の描画結果を得る」のか話題が分かりません。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.7 )
名前:GMO 日時:2011/08/13 04:24

>「輪郭線を消す」のか「モデルビューワーと同等の描画結果を得る」のか話題が分かりません。 No5については「誤解がある」とされたので、テストコードと自分のプログラムの差とその目的を簡易に書いたに過ぎません。 また、最初に「DXモデルビューワーでは正常に表示される」と記載したのは輪郭線が原因と認識していなかった ためで、正確には求めている描画結果ではありません。 >MV1SetMaterialOutLineDotWidth を使用しない理由が分かりません。 No3で書いたように輪郭線の大きさを見えなくなるくらい大きくするといった対応で凌ぐのであれば、 どちらであってもいいはずです。 MV1SetMaterialOutLineDotWidthを使ったほうがいいというのであればそうしようかなと思います。 MV1SetMaterialOutLineDotWidthを使用「してなかった」理由については、当該部分の開発時点で、 MV1SetMaterialOutLineDotWidthには輪郭線を消すような設定がなく、MV1SetMaterialOutLineWidthではあった(ように見えた) からです。 実際、MV1SetMaterialOutLineWidthのWidth値に0.0fを設定した場合に、開発時に使ったモデル数点では輪郭線が消えたので これを仕様だと思い、とくに疑問も持たず使い続けてました。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.8 )
名前:GMO 日時:2011/08/13 19:18

整理のため、一度スクリーンショットをとりました。 http://ll.la/rX,D パスワード:gmo (ダウンロード/解凍) 確認させていただきます。 MV1SetMaterialOutLineDotWidthまたはMV1SetMaterialOutLineWidthにて、 「輪郭線を出さない」使い方は想定されていますでしょうか?
Re: 某モデルデータテクスチャ表示について(PMD) ( No.9 )
名前:yasi 日時:2011/08/15 00:46

横から失礼します。 GMOさんが確認された事象について当方で確認できた内容を書きます。 >8 今回のモデルではアップされた画像の3と4で黒くなっている部分は、表向き用と裏向き用に ポリゴンとマテリアルが同一座標上で二重になっている部分のようです。 この状態で裏面用マテリアルに対しMV1SetMaterialOutLineWidthに0.0fを設定した時、 裏面の輪郭線が表面より手前に表示されるようです。 これは恐らく輪郭線の表現にメッシュの法線を反転し、少し拡大したような物を 輪郭線カラーで設定された色で表示する事で輪郭線を表示している仕様による物だと思われ、 0.0fに設定する事でメッシュサイズより小さくなる(メッシュ法線が内向きなら逆に大きくなる) ために起こっている物だと思います。 この事象はモデルビューワーでも確認できます。 ただし、元々PMDエディタ上で輪郭線無しの設定をされている、 もしくはモデルビューワーでOutLineWidthとOutLineDotWidth、共に0.0fが設定された場合、 ビューワーではその2つ以外の何らかの処理をしている、 又はそもそも輪郭線を発生させる処理を省いているようで、 画像のようにはなりませんが、プログラム上では2つを設定しただけでは無理なようです。 上記内容はVer3.05fで確認した内容です。 以下は個人的な憶測です。 仕様かどうかまでは私には判りませんが、 恐らくOutLineWidthは「輪郭線を無くす」という使用方法は想定されていないのだと思います。 ただし、裏側が何処からも見えないメッシュに対してはOutLineWidthを0.0fにする事で、 「輪郭線は存在するが外からは見えない状態」にはできるという事ではないかと思います。 又、OutLineDotWidthはスケールやカメラ距離による輪郭線サイズを補正するのが主目的のようです。 ビューワーでは両方を0.0fにすると輪郭線が消えるという処理は、 MV1形式に変換する上でのモデル確認や調整を行うのが主目的なため、もしかすると内部的に特殊な処理 (DxLibとして表に出していない機能)をしているのかもしれませんね。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.10 )
名前:yasi 日時:2011/08/15 01:45

連投すみませんが追記です。 因みにPMDエディタ上で輪郭線無し設定されているpmdモデル、 もしくはビューワー上で両方共に0.0f設定されたmv1モデルのマテリアルに対し、 プログラム上でOutLineWidthやOutLineDotWidthに数値を設定しても輪郭線は発生しません。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.11 )
名前:GMO 日時:2011/08/15 21:15

yasiさんありがとうございます。 こちらもビューワーで確認し、書き込みから仕組み等理解いたしました。 ビューワーでは、両方0.0fを設定した場合に黒い部分が透明になるので、ここに対処のヒントがあるのかも・・と考えてます。 同時に、想定外の使い方である可能性が高いことも理解いたしましたので、 輪郭線を消す方法については一度検討しなおそうと思います。 いっちさん、yasiさん、回答やアドバイスありがとうございました。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.12 )
名前:管理人 日時:2011/08/21 04:50

申し訳ありません、DXライブラリのバグで MV1SetMaterialOutLineDotWidth と MV1SetMaterialOutLineWidth を使用して輪郭線を完全に 0.0f にしても輪郭線の描画が 行われてしまっていました 修正版をアップしましたので、よろしければお試しになってみてください 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/DxLibGCCTest.exe // Gnu C++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) こちらのバージョンで MV1SetMaterialOutLineDotWidth と MV1SetMaterialOutLineWidth を使用して 太さをどちらも 0.0f にすればビューワーで輪郭線を 0.0f にしたときと同じ結果が得られます 以下は原因の解説です、もしご興味がありましたら読んでください DXライブラリは MV1DuplicateModel でモデルの基本的な情報を流用して一つのモデルハンドルから 複数のモデルハンドルを作成できるようになっています、モデルの頂点情報やボーン構成などは 派生元と共有して、モデルのスケールやマテリアルの色や、何のアニメーションがアタッチされているか などの情報はモデルハンドル毎に持ちます そして、MV1SetMaterialOutLineDotWidth や MV1SetMaterialOutLineWidth で設定できる輪郭線の太さも モデルハンドル毎に持っているのですが、いざ描画する処理で行う「太さが0.0fだったら描画しない」の 判定に使用している変数が、モデルハンドル毎に持たせた変数ではなく、モデルハンドル同士で共有する情報の中の 「輪郭線の太さ」の情報を持つ変数を使用してしまっていました これによってモデルファイルの段階で輪郭線をOFFにしていないメッシュは必ず輪郭線を描画するように なってしまっていました( 実際に描画する際にはモデルハンドル毎に持たせた変数を使っているので、 太さ自体は MV1SetMaterialOutLineDotWidth や MV1SetMaterialOutLineWidth で設定した値が反映されます ) ビューワーではこのような現象が発生しないのは、ビューワーではDXライブラリ内部の関数を使って モデルハンドル同士が共有する情報の中の「輪郭線の太さ」の変数を直接変更しているから ( 輪郭線を描画するかどうかの判定で使用される変数の値を変更していたから ) という理由でした ご迷惑お掛けしました m(_ _;m
Re: 某モデルデータテクスチャ表示について(PMD) ( No.13 )
名前:GMO 日時:2011/08/22 19:13

>管理人さん ご対応ありがとうございます。 当方のプログラムにMV1SetMaterialOutLineDotWidthの設定(width=0.0f)を加えテスト版ライブラリを適用したところ、 当初報告したような現象は現れず、かつ輪郭線無しで描画されてます。 バグはさておき、輪郭線調整については輪郭線幅、ドット幅両方を意識しなければいけないってことですね。 実際に使って試したのは上記の通りですが、 「そもそも輪郭線幅ないからドットの調整いらん」 という意識が大きいままで組んでいました。 ビューワーでの確認もおろそかだったのも反省したいと思います。
Re: 某モデルデータテクスチャ表示について(PMD) ( No.14 )
名前:GMO(解決) 日時:2011/09/24 22:05

ライブラリ新バージョンにて輪郭線バグの修正を確認いたしました。

Page: 1 |