Skip to content

Instantly share code, notes, and snippets.

@esetomo
Created March 8, 2014 15:38
Show Gist options
  • Save esetomo/9433630 to your computer and use it in GitHub Desktop.
Save esetomo/9433630 to your computer and use it in GitHub Desktop.
DAE吐く前の加工的な何か
# -*- coding: utf-8 -*-
import bpy.ops
import bmesh
import os
workdir = os.path.dirname(bpy.data.filepath)
os.chdir(workdir)
outdir = os.path.join(workdir, 'out')
rev = os.popen("git log --pretty=oneline -1 head.blend export.py | cut --fields=1 --delimiter=' '").read()[0:6]
def export_head():
for suffix in ["lod0", "lod1", "lod2"]:
export_base(suffix)
export_morphs(suffix)
# 基本形状をエクスポート
def export_base(suffix):
bpy.ops.scene.new()
bpy.context.scene.name = 'Export Base' + suffix
if suffix == "lod0":
bpy.ops.object.add_named(name='Head')
else:
bpy.ops.object.add_named(name='Head' + suffix)
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.reveal()
bpy.ops.object.mode_set(mode='OBJECT')
apply_modifiers()
bpy.ops.mesh.separate(type='MATERIAL')
for obj in bpy.context.scene.objects.values():
obj.active_material_index = 0
obj.name = obj.active_material.name + suffix + '_' + rev
split_sides(obj)
add_bounding(obj)
bpy.ops.object.select_all(action='SELECT')
bpy.ops.export.sl_collada(filepath=os.path.join(outdir, 'base' + suffix + '_' + rev + '.dae'),
exportIncludeUVTextures=False)
bpy.ops.scene.delete()
# 表情形状をエクスポート
def export_morphs(suffix):
shape_key_names = bpy.data.meshes['Head'].shape_keys.key_blocks.keys()
for name in shape_key_names:
export_morph(name, suffix)
def export_morph(name, suffix):
s = name.split('_', 2)
if len(s) < 2:
return
bpy.ops.scene.new()
bpy.context.scene.name = 'Export ' + suffix + name
if suffix == "lod0":
bpy.ops.object.add_named(name='Head')
else:
bpy.ops.object.add_named(name='Head' + suffix)
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.reveal()
bpy.ops.object.mode_set(mode='OBJECT')
apply_shape_key(name)
apply_modifiers()
bpy.ops.mesh.separate(type='MATERIAL')
for obj in bpy.context.scene.objects.values():
obj.active_material_index = 0
if(obj.active_material.name == s[0]):
obj.name = name + '_' + rev
split_sides(obj)
add_bounding(obj)
bpy.ops.object.select_all(action='DESELECT')
obj.select = True
bpy.ops.export.sl_collada(filepath=os.path.join(outdir, name + suffix + '_' + rev + '.dae'),
exportIncludeUVTextures=False,
weld_to_all_visible=True)
bpy.ops.scene.delete()
# 指定名称のシェイプキーを適用
def apply_shape_key(name):
obj = bpy.context.active_object
obj.active_shape_key_index = 0
while obj.active_shape_key:
if obj.active_shape_key.name == name:
obj.active_shape_key.value = 1.0
else:
obj.active_shape_key.value = 0.0
obj.active_shape_key_index += 1
obj.active_shape_key_index = 0
while obj.active_shape_key:
if obj.active_shape_key.name == name:
obj.active_shape_key_index += 1
else:
bpy.ops.object.shape_key_remove()
def apply_modifiers():
bpy.context.active_object.active_shape_key_index = 0
bpy.ops.object.shape_key_remove(all=True)
bpy.ops.object.modifier_apply(modifier='Mirror')
bpy.ops.object.modifier_apply(modifier='Subsurf')
# モデルの右半分と左半分を別面(SL Prim Side)にする
def split_sides(obj):
for vert in obj.data.vertices:
vert.select = vert.co.x <= 0.001
bpy.context.scene.objects.active = obj
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.object.material_slot_add()
bpy.ops.object.material_slot_assign()
bpy.ops.object.mode_set(mode='OBJECT')
def add_bounding(obj):
bpy.ops.object.select_all(action='DESELECT')
bpy.ops.object.add_named(name='Bounding')
bpy.ops.object.select_pattern(pattern=obj.name, extend=True)
bpy.context.scene.objects.active = obj
bpy.ops.object.join()
export_head()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment