2012年

11月

17日

【Blender2.63/2.64】MMDスクリプト更新のお知らせ

先日不具合のご報告を数件受けて、その際に致命的なバグを発見しました。

今回はそのバグフィックス版です。

①pmdモデル読み込みで頂点、面読み込みに差し掛かると失敗する場合がある

原因はfile_utils.pyの「 BinaryToDWORD」にありました。本来byte配列をint値(4bit整数値)変換する処理なのですが、なぜかlong型変換するようになっていました。

 

OSやbit数の違いで、以下の表のようにデータ型のサイズに違いが出るようです。

 

OS別データ型サイズ表 ※Macは不明です
  Windows Linux
32bit 64bit 32bit 64bit
sizeof(char) 1 1 1 1
sizeof(short) 2 2 2 2
sizeof(int) 4 4 4 4
sizeof(float) 4 4 4 4
sizeof(long) 4 4 4 8
sizeof(void*) 4 8 4 8
sizeof(double) 8 8 8 8
sizeof(long long) 8 8 8 8
sizeof(long double) 8 8 12 16

 

見てもらえば分かるとおりWindowsやLinux 32bitOSでならlong変換で問題ないですが、Linux 64bitOSだと8bit数値変換されてしまうので問題が発生していたようです。

②pmdモデル出力に失敗する

原因は二つあります。

 

A. インデックスデータのオーバーフロー

pmdフォーマットの仕様上、面データは符号なし2bitの範囲(0~65535)までしかデータを扱うことが出来ません。この範囲外の場合は「Export failed: Index data has exceeded the useful range of the pmd format.」というメッセージを出力するように変更しました。

 

このメッセージが出る場合、pmxフォーマット出力することをオススメします。私のスクリプトはpmx出力にまだ未対応なので、この場合は他の方のスクリプトをお使いください。

 

B. モデルに5角形以上のポリゴンデータが含まれている
pmdフォーマットの仕様上、面は全て3角形ポリゴンでないといけません。

4角形→3角形へのポリゴン変換はしていたのですが、5角形以上のポリゴン変換を怠っていました。スクリプト側で3角形ポリゴンへ変換するように修正を施しました。

 

但し出力した後、Blender側のモデルも全て3角形ポリゴンになります。それを避けたい方はpmd出力する前に環境を保存してからお使いください。

③出力したpmdモデルの形状がBlenderのものと違う

MeshオブジェクトとAmratureオブジェクトのMatrix(変換行列)情報を出力に反映させるのを忘れていました。このバージョンから、オプション設定の変換行列とオブジェクト行列を掛け合わせて出力するように修正しています。

 

Meshオブジェクト行列は頂点座標と頂点モーフに、Armatureオブジェクト行列はボーン座標に影響します。

大きな変更点は以上です。これ以外にもバグが発生する可能性があるので、もし見かけた場合はご連絡していただけると助かります。

 

現在リリースしている最新版スクリプト2.63はBlender2.64でも使用可能です。

 

ちなみに今回のバグは両方2.49~2.62のスクリプトにも存在するのですが、今後開発を進める予定が無いので更新するつもりは今のところありません。もしかするとBlender2.49だけは更新するかもしれません。

 

今後このスクリプトを利用するのであれば最新版のBlenderを使用することをオススメします。

 

それと、以前「Blender2.63系のスクリプト一新のお知らせ」で報告したBlender2.63の既存メソッドによるメモリリークですが、どうやらBlender2.64でも同様のメモリリークが発生するようです。なのでしばらく「重複頂点の削除」は復活する予定はありません。

 

スクリプトのダウンロードはいつものところからお願いします。

コメントをお書きください

コメント: 7
  • #1

    simplestar (月曜日, 19 11月 2012 07:56)

    この度は .pmd ファイルのインポーターを使わせていただきました。2.64a で読み込んでみましたが問題ないようです。
    Blender はバージョンが上がるたびに関数の仕様や、既存関数のリネーム、削除などがあり対応するのが大変かと思います。
    とても感謝しています。ありがとうございます!

  • #2

    ze10 (土曜日, 24 11月 2012 01:09)

    >>simplestar様

    まだまだ不具合が残っているスクリプトですが、使っていただきありがとうございます。何か不具合等がございましたらご報告ください。

    simplestar様のサイトは以前から拝見しており、「C#でCOLLADAを読み込む:」等のColalda関連の記事を参考にさせていただいております。

    興味深い記事をありがとうございます。

  • #3

    retasu (日曜日, 30 12月 2012 13:47)

    pmdのファイルを扱うにあたって前ココの物を使った時にはできなかったのですが新しいブレンダーにしたときに今まで使っていた物が使えなくなってしまったのでこちらをうかがってみたところインポートはできるようになったのですが、エクスポートができません。何のエラーの文字も出てこない代わりに何のファイルも出来上がってませんでした。自分はmacを使っています

    他のいろいろなファイルも試してみたのですがうまくいきませんでした。途方に暮れております・・・

    インポートの方は前に使っていた物よりエラーが出てこなくて重宝しております

  • #4

    ze10 (水曜日, 02 1月 2013 17:21)

    >>retasu様

    ご報告ありがとうございます。
    すみません、年末年始はパソコンが使える状態じゃなくてお返事が遅れてしまいました。大変申し訳ありません。

    エラーの方はこれから早急に確認いたします。本当に申し訳ありません。

    参考までに、エクスポートに使用したPMDモデルを教えていただけませんでしょうか?

    自作モデルの場合、blenderファイルを提供いただけると助かります。

  • #5

    retasu (木曜日, 03 1月 2013 16:26)

    http://bowlroll.net/up/dl12684 パスは0227です
    自作モデルです
    私の環境が悪いのかpmdもインポートした後にそのままエクスポートするとファイルはできるのですがそれをもういっかいインポートしようとするとエラーがでます
    他の人が作ったプラグインも動作がおかしくてうごかないのです macだからとか関係あるのでしょうか・・・(´・ω・`)

  • #6

    ze10 (金曜日, 04 1月 2013 18:36)

    >>retasu様

    私のスクリプトには出力の際に何点かの制限があります。

    ・アーマチュアオブジェクトはひとつにまとめておくこと
    複数個ある場合、認識できる最初のアーマチュアオブジェクト1つだけ出力されます。

    ・メッシュオブジェクトはひとつにまとめておくこき、アーマチュアオブジェクトが親に設定されていること
    複数個ある場合、認識できる最初のメッシュオブジェクト1つだけ出力されます。

    ・IKボーンはBlenderとMMDとでは仕様が違うので、IKボーンの設定はPMD出力した後にPMDEで設定するのをお勧めします。

    あとデバッグしててスクリプトに数点の不具合を発見したので近々更新する予定です。

  • #7

    retasu (土曜日, 05 1月 2013 12:44)

    ありがとうございます。やり方が悪かったのですね・・・言われた通りに試してみます