Blender は一つのオブジェクトに対し複数のマテリアルを設定することができますが、Collada では一つのオブジェクトに一つのマテリアルしか設定できません。
もしくはフォーマット上設定できたとしても、流通している Collada Importer が対応してないのではないかと思います。
そのあたりの仕様は余りよく勉強していません(;´д`)
Blender による Collada のエクスポートには不満が大層聞こえてくるのですが、一つにはこの問題があるのではないかと思います。
たとえばこの3Dモデル
http://3dmodels.katorlegaz.com/transport_auto/0187/index.phpCC-BY (c) 2003-2013 Andrew Kator & Jennifer Legaz
Blender によりそのまま Collada にエクスポートすると
下のようにライトに穴が開いちゃったりガラスが真っ青になっちゃったりします。
(three.jsを用いて Firefox で表示しています)
オブジェクトをマテリアルごとに分割し、
かつ一つのオブジェクトにつきマテリアルを一つだけ設定するとこのような感じ・・・
(;´д`)・・・フロントガラス部分は穴が開いているわけではなくガラスの透明度が高すぎるだけです。
(実はさっきのヘッドライトも穴が開いていたわけではなく、ガラス用のマテリアルが反射板部分まで適用されちゃっていたのでしょう)
レンダラによって色々違うようですね。透明度をいじってあげるとちゃんと見えます・・・
まあ、処理前よりはましだと言うのは分かっていただけるかと思います。
この処理は手作業でやってもいいと思いますが、面倒なのでスクリプトを書きました。
商用非商用可です。ご利用下さい。
Python Console を表示し、以下のスクリプトをコピペして下さい。
import bpy
import bmesh
import math
import mathutils
bpy.ops.object.select_all( action='DESELECT');
for mm in bpy.context.selectable_objects:
mm.select = True;
print(mm.name);
for cc in bpy.context.selected_objects:
if(cc.type == "MESH"):
used = dict();
mats = cc.data.materials;
if(len(mats) > 1):
for ii in cc.data.polygons:
used[mats[ii.material_index].name] = 100;
if(len(used) > 1):
bpy.ops.mesh.separate(type='MATERIAL');
mm.select = False;
bpy.ops.object.select_all( action='DESELECT');
bpy.ops.object.select_all( action='DESELECT');
for mm in bpy.context.selectable_objects:
mm.select = True;
print(mm.name);
for cc in bpy.context.selected_objects:
if(cc.type == "MESH"):
used = dict();
mats = cc.data.materials;
usedindex = 0;
if(len(mats) > 1):
for ii in cc.data.polygons:
used[mats[ii.material_index].name] = 100;
usedindex = ii.material_index;
plen = len(mats);
for i in range(plen-1, -1, -1):
if(i != usedindex):
mm.active_material_index = i;
bpy.context.scene.objects.active = mm;
bpy.ops.object.material_slot_remove();
mm.select = False;
バグ等がありましたら、コメントや
twitter で教えてください。
posted by k_yama at 01:55
|
Comment(0)
|
備忘録