閉じる
閉じる
人物モデルの頭部と胴体を別オブジェクトで作成する場合、境目の頂点を2つのオブジェクトで一致させても、オブジェクトの境目が目立ってしまいます。

原因は、境目で重なっている頂点の法線が違うからです。二つのオブジェクトを一時的に結合して、編集モードで頂点法線を表示すると、境目で重なる2頂点の法線の向きが違っていて、V字に分かれているのが確認できます。

これをPMXにエクスポートすると、この法線もそのままエクスポートされます。PMXエディタで法線を確認できます。

MMDの標準シェーダーはトゥーン調なので、この境目はそれほど目立ちませんが、シェーダーエフェクトを適用して別のシェーダーに切り替えると、はっきり現れてしまいます。

この問題を解決するには、V字に分かれている法線を同じ向きになるように編集する必要があります。
Blenderには法線を直接編集するモディファイアやアドオン(Y.A.V.N.E.など)がありますが、これらはミラーやSubsurfなどの生成系モディファイアと併用できません。そこで、法線を直接編集するのではなく、データ転送モディファイア(Data Transfer)を使うことにします。
まず、二つのオブジェクトのトランスフォーム(位置・回転・拡大縮小)を適用しておきます。
そのうえで、編集モードでオブジェクトの境目に接する面をループ選択し、Shift+Dで複製します。複製した面をPで別オブジェクトにします。

頭部・胴体から分離した境目のオブジェクト2個を選択し、Ctrl+Jで結合します。

結合したオブジェクトの編集モードに切り替え、重なっている境目の頂点をすべて選択します。重なって隠れている頂点をすべて選択するには、ワイヤーフレーム表示に切り替えるといいです。頂点を選択した状態で、Ctrl+Vで頂点メニューを表示し、「重複頂点を削除」(Remove Doubles)を実行します。

境目のオブジェクトは邪魔なので、別のレイヤーに移して表示しないようにします。元の頭部オブジェクト・胴体オブジェクトに戻って、それぞれの編集モードで境目の頂点を選択し、頂点グループを追加します。ここでは「boundary」としました。

データ転送モディファイアを追加します。ミラーやSubsurfがあるときは、その下に追加します。

データ転送元オブジェクトに、境目から分離したオブジェクトを指定し、面コーナーデータにチェックを入れ、カスタム法線をクリックします。これで転送元オブジェクトから法線が転送されます。ただし、法線データを受け取りたいのは境目の頂点だけなので、頂点グループ「boundary」を指定して、転送範囲をそのグループに限定します。
2つのオブジェクトそれぞれに上記のようなデータ転送モディファイアを追加することで、オブジェクトの境目が無くなりました。

ここで注意しなければならないのは、リグを組むときは、法線データ転送元のオブジェクト(分離した境目のオブジェクト)にもスキニングを施しておく必要があることです。頭部・胴体がポーズで変形しているのに、法線データ転送元のオブジェクトが一緒に変形していないと、その状態の法線がそのまま変形後の頂点に転送されてしまうので、おかしくなります。頭部・胴体の変形ウェイトを法線データ転送元のオブジェクトに転送するとよいでしょう。
これでBlender上は境目の問題が解消しました。しかし、拙作PMXエクポーターを使ってPMXに法線の編集結果をエクスポートするには、これだけでは足りません。カスタム法線をエクスポートするには、頂点データプロパティの「自動スムーズ」を有効にする必要があります。

自動スムーズを有効にした場合、角度に適切な数値を入力しなければなりません。ここでは「180°」にしました。あまり小さい値にすると、スムーズが効かなくなります。スムーズが効かない辺では、PMXエクスポート時に辺分離されるので、PMXの頂点数が増大します。
自動スムーズを有効にしてPMXにエクスポートし、PMXエディタで法線を表示すると、下図のようになりました。

境目の頂点の法線を1つにまとめる(V字になっていない状態にする)ことに成功しました。
原因は、境目で重なっている頂点の法線が違うからです。二つのオブジェクトを一時的に結合して、編集モードで頂点法線を表示すると、境目で重なる2頂点の法線の向きが違っていて、V字に分かれているのが確認できます。
これをPMXにエクスポートすると、この法線もそのままエクスポートされます。PMXエディタで法線を確認できます。
MMDの標準シェーダーはトゥーン調なので、この境目はそれほど目立ちませんが、シェーダーエフェクトを適用して別のシェーダーに切り替えると、はっきり現れてしまいます。
この問題を解決するには、V字に分かれている法線を同じ向きになるように編集する必要があります。
Blenderには法線を直接編集するモディファイアやアドオン(Y.A.V.N.E.など)がありますが、これらはミラーやSubsurfなどの生成系モディファイアと併用できません。そこで、法線を直接編集するのではなく、データ転送モディファイア(Data Transfer)を使うことにします。
まず、二つのオブジェクトのトランスフォーム(位置・回転・拡大縮小)を適用しておきます。
そのうえで、編集モードでオブジェクトの境目に接する面をループ選択し、Shift+Dで複製します。複製した面をPで別オブジェクトにします。
頭部・胴体から分離した境目のオブジェクト2個を選択し、Ctrl+Jで結合します。
結合したオブジェクトの編集モードに切り替え、重なっている境目の頂点をすべて選択します。重なって隠れている頂点をすべて選択するには、ワイヤーフレーム表示に切り替えるといいです。頂点を選択した状態で、Ctrl+Vで頂点メニューを表示し、「重複頂点を削除」(Remove Doubles)を実行します。
境目のオブジェクトは邪魔なので、別のレイヤーに移して表示しないようにします。元の頭部オブジェクト・胴体オブジェクトに戻って、それぞれの編集モードで境目の頂点を選択し、頂点グループを追加します。ここでは「boundary」としました。
データ転送モディファイアを追加します。ミラーやSubsurfがあるときは、その下に追加します。
データ転送元オブジェクトに、境目から分離したオブジェクトを指定し、面コーナーデータにチェックを入れ、カスタム法線をクリックします。これで転送元オブジェクトから法線が転送されます。ただし、法線データを受け取りたいのは境目の頂点だけなので、頂点グループ「boundary」を指定して、転送範囲をそのグループに限定します。
2つのオブジェクトそれぞれに上記のようなデータ転送モディファイアを追加することで、オブジェクトの境目が無くなりました。
ここで注意しなければならないのは、リグを組むときは、法線データ転送元のオブジェクト(分離した境目のオブジェクト)にもスキニングを施しておく必要があることです。頭部・胴体がポーズで変形しているのに、法線データ転送元のオブジェクトが一緒に変形していないと、その状態の法線がそのまま変形後の頂点に転送されてしまうので、おかしくなります。頭部・胴体の変形ウェイトを法線データ転送元のオブジェクトに転送するとよいでしょう。
これでBlender上は境目の問題が解消しました。しかし、拙作PMXエクポーターを使ってPMXに法線の編集結果をエクスポートするには、これだけでは足りません。カスタム法線をエクスポートするには、頂点データプロパティの「自動スムーズ」を有効にする必要があります。
自動スムーズを有効にした場合、角度に適切な数値を入力しなければなりません。ここでは「180°」にしました。あまり小さい値にすると、スムーズが効かなくなります。スムーズが効かない辺では、PMXエクスポート時に辺分離されるので、PMXの頂点数が増大します。
自動スムーズを有効にしてPMXにエクスポートし、PMXエディタで法線を表示すると、下図のようになりました。
境目の頂点の法線を1つにまとめる(V字になっていない状態にする)ことに成功しました。
-
次の記事これより新しい記事はありません。
-
前の記事2016-10-28 23:39:40PMXエクスポーター用のサンプルデータを公開
広告
コメントコメントを書く
×
すわとう様、素晴らしく参考になる記事ばかりでいつも勉強させていただいております。ありがとうございます。
exp_pmxも大変重宝しております。このエントリで妥当かはわかりませんが、一点気になる点がありましたのでご報告させてください。
ポーズリスト→ボーンモーフの出力時に、リストの下のほうにいくにつれて、リスト上部にあるボーンモーフのデータが混ざる現象があるようです。
おそらく変換時に出力ボーンの配列をクリアすることなく追加し続けているためかなと思うのですが、
なにぶんPythonに慣れておらず自分では修正が難しい感じです。
たまにバージョンアップされているようですので、いつか修正されると嬉しいです。
それでは。
exp_pmxも大変重宝しております。このエントリで妥当かはわかりませんが、一点気になる点がありましたのでご報告させてください。
ポーズリスト→ボーンモーフの出力時に、リストの下のほうにいくにつれて、リスト上部にあるボーンモーフのデータが混ざる現象があるようです。
おそらく変換時に出力ボーンの配列をクリアすることなく追加し続けているためかなと思うのですが、
なにぶんPythonに慣れておらず自分では修正が難しい感じです。
たまにバージョンアップされているようですので、いつか修正されると嬉しいです。
それでは。
×
すわとう様、いつもexp_pmxを愛用させていただいております。
エクスポート時に三角面化が行われるメッシュについて、半透明描画をよりきれいに行なうための機能追加を行ないました所、うまくいきましたので簡単にご報告させていただきます。
bmesh.ops.triangulateの直後に次のようなコードを加えて面をソートすることで、ポリゴンの描画順がなるべく連続するように整理するというものです。
bm.faces.ensure_lookup_table()
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().y )
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().x )
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().z )
bm.faces.index_update()
凹面体やトーラスのように1メッシュ内で重なりが発生するメッシュがおおむねきれいに半透明描画できるようになります。
以上、1ユーザーからのフィードバックでした。
エクスポート時に三角面化が行われるメッシュについて、半透明描画をよりきれいに行なうための機能追加を行ないました所、うまくいきましたので簡単にご報告させていただきます。
bmesh.ops.triangulateの直後に次のようなコードを加えて面をソートすることで、ポリゴンの描画順がなるべく連続するように整理するというものです。
bm.faces.ensure_lookup_table()
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().y )
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().x )
bm.faces.sort( key=lambda x: x.calc_center_median_weighted().z )
bm.faces.index_update()
凹面体やトーラスのように1メッシュ内で重なりが発生するメッシュがおおむねきれいに半透明描画できるようになります。
以上、1ユーザーからのフィードバックでした。