2009年2月17日火曜日

etc - pmd2blenderの修正

向こうの掲示板に書いたのを再掲とかしつつ休憩。

俺は作者じゃないですけど…

・インポーターの28行目を次のように修正。
inverseX = Mathutils.Matrix([1,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,0,1])

・辺で繋がっている頂点を、1つのMeshとして切り出せば、大体どのモデルでも、マテリアル16個制限に引っかからずに読み込めると思う。手作業だと、エディットモードで1頂点選択してCtrl-L後分離する感じ。

・ハイポリゴンのデータで読み込みに失敗する不具合

↑頂点のインデックスリスト(l_poly)の一部。

といっても、これはアイマス風ミクのやつで、標準モデルだと特に問題なかった。
多分PMDエディタで吐いたと思われるアイマスミクのカジュアルと素体が分離しているやつは、どちらにも同じ頂点のリストがある。DirectXから読み込むときは、面のインデックスリストから頂点を読みに行くので、メモリに無駄があるけど普通に表示される。

しかし、これは頂点読み込んでから面を読み込んでいるpmd2blenderには都合が悪い。
後で頂点を消すのは時間が掛かるし難しいので、最初にエラーデータと思われるものを捕獲し、インデックスを付け直す。つまり最初から要らない頂点は読み込まない作戦。

######### create Vertex List
######### create Face List
######### fetch Error for PMDEditor(maybe..)
vertex_list = []
face_list = []
faceErrorList = []
for i in range(len(l_poly) / 3):
p0 = l_poly[i*3 + 0]
p1 = l_poly[i*3 + 1]
p2 = l_poly[i*3 + 2]
if p0 == p1 == p2: # エラーっス
faceErrorList.append(i)
continue
vlen = len(vertex_list)
# LH to RH
face_list.append([vlen, vlen+2, vlen+1])
vertex_list.append(l_vertex[p0][0:3])
vertex_list.append(l_vertex[p1][0:3])
vertex_list.append(l_vertex[p2][0:3])


このときの頂点番号の対応リストを作って、頂点番号に関わるのを最初に一気に変換しておくと万事解決である。(まだやってない)

また、これでは頂点が重複してしまうけど、同じ位置だからremdoubleで消せるし、やろうと思えば頂点保存しておいて2重読み込みを排除もできる。

・・・と適当に書いていますが、どちらの作者でもないので。

いい加減pythonの文法勉強しようかな…。いまだに本1冊も買ってない…。

0 件のコメント: