2015年4月23日木曜日

Mesh.CombineMeshesでエラー BlenderでUV頂点を数える

メッシュの結合を行うMesh.CombineMeshesでエラーが起きた。
エラー文は count <= std::numeric_limits<UInt16>::max()

原因はこちらを参考にした。(対策案も書かれているがここではその手法について考えない)
http://rotorz.com/tilesystem/guide?ref=6b89bd45-1d5c-4221-aaa4-38073a6aab37

要するに一つのMeshで扱える頂点数がUInt16(65535)を超えてしまった、ということであった。
メッシュの頂点数を疑ったが、メッシュにくまなくUVを貼っている場合、
・メッシュ頂点数 ≦ UV頂点数
となる点に注意したい。
実際私の場合、頂点数を確認したところUV頂点数がオーバーしていた。
(なお、UV頂点数はmesh.uv.lengthで出力できる。)

ここでは対策として、Blenderを使用し、UV頂点数の削減を行うことにした。
しかし、削減の指標となるUV頂点数がBlenderでは標準で表示されない。
そのため、UV頂点数を確認する手段を設けることにした。


〇BlenderでUV頂点を数えるpythonコード

import bpy
import bmesh
bpy.ops.object.mode_set(mode='OBJECT')
mesh = bpy.context.object.data
bm = bmesh.new()
bm.from_mesh(mesh)
uv_layer = bm.loops.layers.uv.active
num = 0
for face in bm.faces:
    for vert in face.loops:
        num+=1
        print(vert[uv_layer].uv)
print(num)

・参考
http://blender.stackexchange.com/questions/19724/uv-vertex-using-python



こうして作成したこちらのコードを動かしてみたが、得られた頂点数はUnity上とは異なる数であった。
この方法で得られるUV頂点は 三角面の数x3 + 四角面の数x4 というわかりやすい数で、
どうやらBlender上では重複するUV頂点をまとめていないようだ。

Unityで使用するためにエクスポートしたFBXでは
重複UV頂点をまとめている(?)からかUV頂点数は少なくなっている。
(実際はよくわかってないです。想定以上に減らなかったりして、
まとめているにしても全てをまとめているわけではなさそう)


結局のところ、Blender上でFBX出力時の正確なUV頂点数は得られない。というところに落ち着いた。
とはいえ、おおよその指標として上記pythonコードは使用できる。

0 件のコメント:

コメントを投稿