mqsdl464 / ExportPMD
ソースファイル:ExportPMD.cpp
簡単なボーンを入れたテストモデルを元に、次のようにしてpmd に書き込まれるボーン情報をボーン名で表示してみました。
1497 行目 printf("%s\n",bone_name);
以下追加
subname = getMultiBytesSubstring(bone_param[parent_bone_index].name_jp.toAnsiString(), 20);
memset(parent_bone_name, 0, 20);
memcpy(parent_bone_name, subname.c_str(), subname.length());
printf("%s\n",parent_bone_name);
これで合っていますか?
ボーンの親ボーン名である、parent_bone_nameは、Metasequoiaの「ボーン」→「ボーンリスト」で表示したものとほぼ合っているのですが、時々明らかに間違ったボーン名が入ります。
また、
続きを表示...
1216行 weight_num = bone_manager.GetVertexWeightArray(obj, vert_id, max_num, vert_bone_id, weights);
の各頂点から取得した関連ボーン・ウェイト情報を元にして取得されたbone_index[0], bone_index[1]のボーン名を次のようにして確認すると(合ってますか?)
(1198行の後に追加)
std::wstring name;
for(int k = 0; k < 2; k++){
UINT b = bone_index[k];
b = bone_param[b].id;
bone_manager.GetName(b, name);
}
ここにも上で取得されたものと同一の間違ったボーン名が入り、こちらで作成した独自ビューアーで見るとその部分のウェイトが壊れてしまいます。
しかし、このテストモデルをpmdファイルに保存して、MikuMikuMoving (1.2.7.5)で確認すると、ボーン構造も正しくつながっており、ウェイトも正しく再現されているようです。
PMDの表示側で何か修正アルゴリズムがあてがわれているのでしょうか?
それとも、こちらのボーン名取得の方法が間違っているのでしょうか?
環境:macOS High Sierra 10.13.3
Xcode 9.2