ousttrue / pymeshio

3d model reader/writer for python
http://pypi.python.org/pypi/pymeshio/
92 stars 26 forks source link

Bug Report (export_pmd) #1

Closed griffon-9 closed 12 years ago

griffon-9 commented 12 years ago
  1. 出力されたPMDファイルの面が正常に表示されません
  2. Export中に例外が発生します
ousttrue commented 12 years ago

pull requestありがとうございます。

  1. に関してはおそらく面が裏返っているのだと思います。出力前に法線の向きを確認してみてください。せっかくなのでexport_pmdに法線反転スイッチを付けようと思います。
  2. はご指摘のとおり引数順間違えているようです。取入れます。
griffon-9 commented 12 years ago

回答ありがとうございます。

1の件に関してですが、私がこの問題に遭遇したのは長く愛用させていただいていたpymeshio 1.8.6から思い切ってpymeshio 2.5.5へ移行しようとしたときでした。

pymeshio 1.8.6のexport_pmdで製作していたモデルデータをpymeshio 2.5.5のexport_pmdで出力しようとしたところ、面が反転する現象が起こりました。 不審に思いPMDエディタで確認したところ、各頂点の法線は外側を向いているのに面だけが反転しているかのような出力結果に思えました。 また、pymeshio 2.5.5のexport_pmxで出力した場合には、少なくとも面が反転するという結果にはなりませんでした。

これらのことから調査を進めたところpymeshio 1.8.6からpymeshio 2.5.5の間でVertexArrayに格納する面の頂点インデックスの格納順が変更されているように見受けられました。また、export_pmx.pyとexport_pmd.pyで頂点インデックスの出力順が異なっているように見受けられます。

export_pmx.pyは以下のように実装されています。

        # 面
        for i in indices:
            assert(i<vertexCount)
        for i in range(0, len(indices), 3):
            # reverse triangle
            model.indices.append(indices[i+2])
            model.indices.append(indices[i+1])
            model.indices.append(indices[i])

一方でexport_pmd.pyはこのようになっています。

        # 面
        for i in indices:
            assert(i<vertexCount)
        for i in range(0, len(indices), 3):
            # reverse triangle
            model.indices.append(indices[i])
            model.indices.append(indices[i+1])
            model.indices.append(indices[i+2])

PMDとPMXで頂点順序が異なる仕様、という訳ではないだろうと思いましたので、新しいexport_pmx.pyの実装にexport_pmd.pyをそろえるのが妥当ではないか、と考えた次第です。

ousttrue commented 12 years ago

再度確認してみたところご指摘のとおりexport_pmdでは面が裏返っておりました。 pmxの方しか確認してませんでした・・・ 一部pmxとpmdで共用の部分があるので、pmx修正時に巻き込まれて壊れしまったようです。 mergeさせていただきます。