トップページ > 過去ログ > 記事閲覧
PMDの質感調整について
名前:バトーキン 日時: 2010/08/04 05:01

いつもお世話になります。 DXライブラリ上でPMDを読み込んだモデルの、 質感をMMD上で見た時に近づけるように調整してみました。 質感調整したMV1データをアップしておきます。 www1.axfc.net/uploader/Sc/so/140556.zip&key=dxlib この中で幾つか気付いたことを報告します。 >トゥーンテクスチャについて MMDでは、トゥーン用のグラデーションテクスチャを、 toon01.bmp 〜 toon10.bmp までを、MMD側で用意していて、 PMD内にどのテクスチャを使うかという指定がありました。 おそらく、DxModelLoader3.cpp の1049行付近、 マテリアルの、アンビエント色を取得した直後に、 このテクスチャに対応したインデックスが入っていて、 トゥーンテクスチャリストに対応しているのだと思いますが、 blog.goo.ne.jp/torisu_tetosuki/e/9eadd0b861dd0300f38b0e6ae5c297af ファイル名か、インデックス番号、どちらでもいいんですが、 この情報を、モデルデータのどこかに保存するのは難しいでしょうか? 自動的にグラデーションテクスチャとして割り当てると、 対応するテクスチャを用意してない時に問題になりそうですが。 >スペキュラ色、スペキュラの強さについて DxModelLoader3.cpp の 1033行〜付近で、 スペキュラ色RGBに、PmdMaterialSpecularity が掛かっていて、 Material->Power が、16.0f 固定になっていますが、 ここは、スペキュラ色RGBそのままで、 Material->Power = PmdMaterialSpecularity となるのがいいんじゃないでしょうか? >DxLibModelViewer の「ディフューズグラデーションマップ」設定 新しい DxLibModelViewer で、マテリアル→トゥーンの、 「ディフューズグラデーションマップ」の指定が反映されませんでした。 ちょっと古い版の ModelViewer では、普通に反映されたので、 ↑でアップしたMV1モデルは、この古い Viewer で作りました。 DxLibModelViewerTestも試してみましたが、やはり同じようでした。

Page: 1 |

Re: PMDの質感調整について ( No.1 )
名前:バトーキン 日時:2010/08/04 19:16

ModelViewer について、少し情報を追加します。 「ディフューズグラデーションマップ」の設定が反映されなかったのは、 3.03付属版のビューアでした。 3.01付属版のビューアでは反映されました。 また、3.01付属版では、 「ディフューズグラデーションマップ」よりも先に、 「スペキュラグラデーションマップ」を設定すると、 ビューアが強制終了することがありました。 (レンダータイプがトゥーンの時)
Re: PMDの質感調整について ( No.2 )
名前:管理人 日時:2010/08/10 12:42

ご指摘ありがとうございます バトーキンさんのご指摘を受けて今回 PMD 読み込みについて以下の変更・バグ修正を行いました ・PMD 読み込み時のデフォルトのマテリアルをトゥーンタイプに変更 ・初期のトゥーンテクスチャは PMD ファイル内の情報を元に決定 ・スペキュラ色、スペキュラの強さの PMD ファイル内の情報を正しく反映していなかったバグを修正 ・輪郭線を付けるかどうかを PMD ファイル内の情報を元に決定 ・輪郭線のデフォルトの太さはバトーキンさんのサンプルモデルを参考に 0.01 に ・ビューアーでディフューズグラデーションマップの設定が反映されないバグを修正 こちらに上記変更・修正を行ったバージョンをアップしましたので、よろしければお試しください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip 今回ご指摘されてから、「そういえば何故当時の自分は PMD の読み込みで MikuMikuDance と同じ 見た目になるようにしようと考えなかったんだろう?」という疑問が沸いたのですが、思えば トゥーンレンダリングを実装する前に PMD の読み込みを作成したためトゥーンテクスチャの 情報や輪郭線の情報をスキップして( スペキュラ情報についてはただの誤りです orz )、 更にその後トゥーン機能を実装している途中で首・肩が痛くなる症状に苛まれ実装の完了に 時間が掛かり、トゥーン機能を実装しようとした当初の目的が頭から抜けていました 今回のお書き込みが無ければずっと MikuMikuDance の見た目に近づける作業をしないところでした ありがとうございます m(・・;m
Re: PMDの質感調整について ( No.3 )
名前:バトーキン 日時:2010/08/11 22:07

新版を試しました。 PMDを読むだけでMMDっぽく表示されていました。 対応どうもありがとうございます。 私がアップしたデータのトゥーンテクスチャは、 MMDの物を180度反転していた事を書き忘れていたのですが、 その手間もなくなっていたので、助かります。 ただ、すでにPMDを使ってプログラムを作っている人たちは大丈夫ですかね? 読み込むPMDファイルと同ディレクトリに、 toon01.bmp 〜 toon10.bmp を用意していない時は、 テクスチャが無くて、表示がおかしくなるので、 教えてあげないとビックリするかと。 PMD対応からの時系列は、私もよく覚えていますw トゥーンの設定を理解するのに、ずいぶん時間がかかってしまいましたが; そういえば、その後、首の調子はいかがでしょうか。 ご自愛くださいませ。
Re: PMDの質感調整について ( No.4 )
名前:管理人 日時:2010/08/13 08:48

> ただ、すでにPMDを使ってプログラムを作っている人たちは大丈夫ですかね? PMD はもともと MikuMikuDance で読み込んで使用するものですので、 本来の表示に近くなることで不都合が発生する方はいらっしゃらないのではないかと考えています 最初からDXライブラリで使うことをだけを目的に PMD を作成されていた方が いらっしゃったら・・・うーん・・・  toon1.bmp 〜 に関してはアナウンスしようと思います ところで、スライムさんのお書き込みを拝見した後、改めて MikuMikuDance をみてみたら どうもスペキュラの仕方がDXライブラリのトゥーン使用時のスペキュラとは少し違うみたいです なので、少なくともスライムさんのお書き込みにあるような現象を発生させずにスペキュラを 表現できるようにもう少し調整してみようと思います > PMD対応からの時系列は、私もよく覚えていますw 記憶力良いですね(^ ^; 私はつい最近まで忘れてしまっていました > トゥーンの設定を理解するのに、ずいぶん時間がかかってしまいましたが; すいません、単純にドキュメント不足だと思います トゥーンも含め、3D周りはもっとドキュメントを充実させないといけないと思っています > そういえば、その後、首の調子はいかがでしょうか。 ご自愛くださいませ。 お陰様でほぼ治りました 今では発症以前の調子で作業ができています
Re: PMDの質感調整について ( No.5 )
名前:管理人 日時:2010/08/16 08:27

MikuMikuDance のトゥーンの実装を観察して考えてみたのですが、 DXライブラリのトゥーンとは大きく仕様が違いました まずライトは現時点では平行光源1つだけしか使用しないことを前提としていて、 マテリアルのDiffuse とライトの色の関わり方やマテリアルのAmbientの扱いなども DXライブラリのトゥーンとはパラメータの使用の仕方が違い、 トゥーンのグラデーションテクスチャもDiffuseに対するものだけで、 Specularについてはトゥーンではない通常のレンダリングと同じ方式でした 仕様が大きく違ったのでDXライブラリのトゥーン機能ではパラメータの調整だけでは対応ができないと判断し、 MikuMikuDance と互換性のあるトゥーンレンダリングのモードを追加することにしました こちらにそのモードを追加したバージョンをアップしましたので、よろしければお試しになってみてください m(_ _)m // ライブラリ http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip ビューアーではライトの設定を以下のように変更することで MikuMikuDance の起動時とほぼ同じ見た目になります ・大域環境照明の色を全部0に設定 ・照明0の拡散光と反射光の輝度を0.603に設定( MikuMikuDance の「照明操作」で操作するパラメータはDXライブラリの拡散光と反射光のパラメータとイコールの様です ) ・照明0の環境光を1.0にする( MikuMikuDance ではDXライブラリで言う所の環境光は常に1.0の様です ) 因みに今回追加した MikuMikuDance 互換シェーダーモードではディレクショナルライト1個の場合のみ 正常な描画結果が得られるようになっています また、このモードではビューアーの「トゥーン」の欄にある項目は「ディフューズグラデーションマップ」と 輪郭線に関する設定だけ有効となっています( スペキュラ関係や、「ディフューズグラデーションブレンドモード」の設定は使用されません )
Re: PMDの質感調整について ( No.6 )
名前:バトーキン 日時:2010/08/17 09:59

DXライブラリのトゥーンで、MMDに近づける方法を探していたのですが、 まさか、専用で新しいTOON_TYPEを実装して頂けるとは; ありがとうございます。 お疲れさまでございます。 MMD互換タイプを試しました。 ビューアの方では、殆どMMDに近づいて見えました。 プログラムに組み込んだ場合は、少し印象が違う気がしましたが、 内部的には同じ処理なんですよね。 すでに充分な対応状況だと思いますが、 MMDとの細かい差を見ていくと、同じ光源をあてても、 MMDの方が明るい部分の面積がかなり広いようでした。 これは、グラデーションテクスチャの白地部分を広げれば調節できそうですね。
Re: PMDの質感調整について ( No.7 )
名前:管理人 日時:2010/08/19 09:00

> プログラムに組み込んだ場合は、少し印象が違う気がしましたが、 > 内部的には同じ処理なんですよね。 はい プログラムに組み込む場合もライトの設定を No.5 のようにすれば ビューアーと同じ描画結果になるはずです ( ならなかった場合はバグです・・・ ) > すでに充分な対応状況だと思いますが、 > MMDとの細かい差を見ていくと、同じ光源をあてても、 > MMDの方が明るい部分の面積がかなり広いようでした。 確認してみました、確かに MMD の方が明るい部分が大きいですね・・・ ただ謎なのが、トゥーン用のテクスチャはきっちり境目があるのに、 何故か MMD では境目部分がグラデーションしているんですよね・・・ 簡単に理由がわかれば処理を更に変更しようと思いましたが、 それはちょっと無理そうです・・・
Re: PMDの質感調整について ( No.8 )
名前:バトーキン 日時:2010/08/24 07:56

>MMDではトゥーンの境目部分がグラデーション 私がビューアとプログラムの間で違いを感じた、というのも、 ちょうど、その部分でした;; ビューアでPMDモデルを見ていると、 MMDのように、トゥーンの境目がグラデーションして見えていたので、 プログラムに組み込んだ時に、やけに境目がくっきりしているように感じました。 ところが、私はどうやらビューアで何か操作をした後で比較していたらしく、 ただビューアでPMDを読んだだけでは、グラデーションはありませんでした。 この、何らかの操作の再現に手間取ってしまいましたが;; ようやく自分が何をやったのか分かりましたので報告します。 この件に関する検証画像URLです。 batokin1.blog18.fc2.com/blog-entry-131.html PMDを読み込んだ後、マテリアル操作で「トゥーン」の項目、 「スペキュラグラデーションマップ」に画像を設定「適用」すると、 トゥーンの境目に、グラデーションがかかりました。 画像はトゥーンテクスチャを適当に選びました。 ここで、少し不思議な動作があって、 どの番号のマテリアルでも、どれか1つにスペキュラ画像を設定すると、 すべてのマテリアル上で、グラデーションが発生しました。 ここまで分かったので、 試しに、プログラム側でもスペキュラ画像を設定してみると、 やっぱり、トゥーンの境目にグラデーションがかかりました。 原理などはさっぱり分からないのですが、 ちょうどMMDっぽい見た目になっているので、いい感じですw
Re: PMDの質感調整について ( No.9 )
名前:バトーキン 日時:2010/08/24 08:27

あと、すいません、 せっかく自分のデータを参考にしていただいたのですが、 実際に使ってみると、トゥーンの輪郭線が 0.01というのは、かなり細すぎたようです;; 今後、自分のプログラムでは、0.02〜0.03 あたりを使っていくと思います。 もう少し太くてもよさそうなんですが、ミクモデルで試していると、 0.03を超えると、口角にヒゲのようなエッジが出てきます。 こういう状態は、マテリアル別に輪郭線の太さを調節して回避するしかないでしょうか?
Re: PMDの質感調整について ( No.10 )
名前:管理人 日時:2010/08/26 09:19

ご情報ありがとうございます どれか一つのマテリアルに対してスペキュラグラデーションマップを設定すれば良い というのは多分バグです(_ _; 前回は「特定のモデルに関しては MikuMikuDance での見た目にに近づいたけど、 他のモデルでは逆に見た目が破綻してしまった」ということがありましたので 上手くいくかまだ分かりませんが、次の休みの日にでも試してみようと思います 輪郭線の太さに関しては、もう少し MikuMikuDance での実装を調べてみようと思います もしピクセルシェーダーを使ったポストエフェクト的な輪郭線描画ですと DXライブラリでの実装は難しいですが・・・ もし再現することができない場合は、仰るとおりマテリアル別に輪郭線の大きさを調節 する必要があります
Re: PMDの質感調整について ( No.11 )
名前:管理人 日時:2010/08/31 09:37

お待たせしました トゥーンのスペキュラグラデーションマップを設定すると何故か トゥーンの階調の境目がグラデーションする、と言う現象はやはりライブラリのバグで、 こちらはスペキュラグラデーションマップを設定しなくてもグラデーションするように修正しました 口角にひげのようなエッジが出るのは、DXライブラリが PMD の頂点単位の 「エッジをつける、つけない」の情報を無視していたのが原因でした ( こちらも当初ライブラリがトゥーンに対応していなかったので捨てていたみたいです ) この情報を反映させることで、ひげのようなエッジは出ないようになりました あと MikuMikuDance ではモデルとの距離が遠くなっても輪郭線が見えなくならないように 距離に応じて輪郭線の太さを調節するという機能が盛り込まれていましたので、 DXライブラリにもその機能を加えました という処置を施したバージョンをアップしましたので、よろしければお試しになってみて下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) // ビューアー http://homepage2.nifty.com/natupaji/DxLib/DxLibModelViewerTest.zip 因みにモデルがカメラから離れた場合に維持する輪郭線の太さはプログラムではこちらの関数を 使用して設定できます // 指定のマテリアルのトゥーンレンダリングで使用する輪郭線のドット単位の太さを設定する int MV1SetMaterialOutLineDotWidth( int MHandle, int MaterialIndex, float Width ) ; 一応ドット単位での指定ですが、太さの判定にモデルのルート座標( 大抵足元 )を使用して いますので、カメラがモデルに接近するほど指定した通りの太さになりません(- -;
Re: PMDの質感調整について ( No.12 )
名前:バトーキン 日時:2010/08/31 17:33

対応ありがとうございます。お疲れさまです。 >トゥーンのグラデーション おお、原理が解明されたのですね。 初期状態で、グラデーションがかかっているのを確認しました。 口角のエッジなどの部分も確認しました。 これで、ほぼMMDの見た目が再現されますね。 素晴らしいです。 どうもお疲れさまです。 ただ、ひとつ確認いただきたい点が、輪郭線の太さを維持する新機能について、 モデルを MV1SetScale() で拡大すると、 輪郭線も比例して倍加するようでした。 MV1GetMaterialOutLineWidth()や、 MV1GetMaterialOutLineDotWidth() の値は正常なようなのですが、 モデルをMV1SetScale()で5倍に拡大して表示すると、 ビューアでドット幅 5.0 にした時と近い見た目になりました。 >カメラがモデルに接近するほど〜 現象は確認しましたが、 かなり、どアップで見ないと気になりませんね。
Re: PMDの質感調整について ( No.13 )
名前:管理人 日時:2010/09/02 22:52

正常に動作したようでなによりです (・・; 輪郭線が拡大した場合に太くなってしまう現象は仕様としたいと思います というか、X・Y・Z各軸に対して拡大率を設定できてしまうので仕様とせざるを得ないと言うか・・・ orz > >カメラがモデルに接近するほど〜 > 現象は確認しましたが、 > かなり、どアップで見ないと気になりませんね。 カメラが注視している座標とモデルのルート座標との距離が カメラが注視している座標とカメラとの距離より小さくならない限り この現象は発生しないと思いますので、確かにかなりアップで見ないと 気づかないかもしれません
Re: PMDの質感調整について ( No.14 )
名前:バトーキン 日時:2010/09/04 16:41

>〜仕様としたいと思います 了解しました。 MV1GetMaterialOutLineDotWidth()の値が、 見た目と比例して倍加してくれれば……とも思ったのですが、 なるほど、各軸の倍率があるので、一概には値を決められないんですね。 実装側としては、モデルを拡大する際に、各マテリアルに対して、 MV1SetMaterialOutLineDotWidth(mh, num, MV1GetMaterialOutLineDotWidth(mh, num) / 倍率 ); という処理をするようにしておけば、問題は解決しそうです。 対応ありがとうございました。

Page: 1 |