Created
March 8, 2014 15:38
-
-
Save esetomo/9433630 to your computer and use it in GitHub Desktop.
DAE吐く前の加工的な何か
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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