def execute(self,context): fjw.reject_notmesh() canvases = [] targets = [] #カスタムプロパティをチェック for obj in fjw.get_selected_list(): if "canvas" in obj: canvases.append(obj) continue if "asset" in obj: targets.append(obj) continue #カンバス群にパッシブ追加 fjw.deselect() fjw.activate(canvases[0]) fjw.select(canvases) bpy.ops.rigidbody.objects_add(type='PASSIVE') #ターゲット群にアクティブ追加 fjw.deselect() fjw.activate(targets[0]) fjw.select(targets) bpy.ops.rigidbody.objects_add(type='ACTIVE') #アニメーション再生 bpy.ops.screen.frame_jump() bpy.ops.screen.animation_play() #self.report({"INFO"},"") pass return {"FINISHED"}
def parent_clear(self): """ ペアレントをクリアする。 """ fjw.deselect() fjw.activate(self.obj) bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM')
def bake(self, baketype): """ arguments: ベイクタイプ baketypes = ['FULL', 'AO', 'SHADOW', 'NORMALS', 'TEXTURE', 'DISPLACEMENT', 'DERIVATIVE', 'VERTEX_COLORS', 'EMIT', 'ALPHA', 'MIRROR_INTENSITY', 'MIRROR_COLOR', 'SPEC_INTENSITY', 'SPEC_COLOR'] ベイク元オブジェクト群 """ fjw.deselect() fjw.activate(self.obj) bpy.ops.object.shade_smooth() #ソリッドだとガタガタになる fjw.select(self.from_objects) img = self.get_bakeimage(baketype) img = self.reassign_image_filepath(img) tex = self.get_baketex(baketype) tex.image = img self.save_dirtyimages() self.assign_uv_face(img) self.set_tslots_state(False) render = bpy.context.scene.render render.bake_type = baketype render.use_bake_to_vertex_color = False render.use_bake_selected_to_active = True render.use_textures = True render.use_bake_normalize = False render.bake_margin = 14 bpy.context.scene.render.bake_distance = 0.2 bpy.context.scene.render.bake_bias = 0.0001 bpy.ops.object.bake_image() self.set_tslots_state(True) self.save_dirtyimages() bpy.ops.file.make_paths_relative()
def get_avatar_objects_from_its_root(self, child_object): """ オブジェクトからルートオブジェクトを取得して、 mdobjectsに格納する。 """ fjw.deselect() root = fjw.get_root(child_object) mdobj = self.find_mdobj_by_object(root) if mdobj is not None: return mdobj fjw.activate(root) rootname = re.sub("\.\d+", "", root.name) bpy.ops.fujiwara_toolbox.command_24259() #親子選択 selection = fjw.get_selected_list() #selectionの中にMESHオブジェクトがなかったら除外する mesh_found = False for obj in selection: if obj.type == "MESH": mesh_found = True if not mesh_found: return None mdobj = MDObject(rootname, selection) self.mdobjects.append(mdobj) return mdobj
def attouch_uraporiedge(self): fjw.deselect() fjw.activate(self.face) bpy.ops.object.transform_apply(location=False, rotation=False, scale=True) bpy.ops.fujiwara_toolbox.command_318722()
def mesh_dup(self, vertex_group=""): base = fjw.active() mode = base.mode fjw.mode("OBJECT") fjw.deselect() fjw.mode("EDIT") if vertex_group != "": self.mesh_deselect() self.select_by_vertex_group(vertex_group) bpy.ops.mesh.duplicate(mode=1) bpy.ops.mesh.separate(type='SELECTED') fjw.mode("OBJECT") for obj in fjw.get_selected_list(): if obj != base: fjw.activate(obj) fjw.mode("EDIT") break dup = fjw.active() dup.data.materials.clear() self.clear_mods() # dup.parent = base return dup
def dup(self, obj): fjw.mode("OBJECT") fjw.deselect() obj.select = True bpy.ops.object.duplicate() selection = fjw.get_selected_list() return selection[0]
def __export_setup(self, dirpath): fjw.deselect() fjw.select(self.get_export_objects()) self.__simplify(2) for obj in self.objects: self.__disable_backsurface_edge(obj) #フレーム1に移動 bpy.ops.screen.frame_jump(end=False)
def setup(self): fjw.mode("OBJECT") fjw.deselect() fjw.activate(self.obj) fjw.mode("EDIT") for ebone in self.obj.data.edit_bones: self.edit_bones.append(EditBoneData(self.obj, ebone)) fjw.mode("POSE") for ebdata in self.edit_bones: ebdata.set_pose_matrix()
def execute(self,context): if bpy.data.filepath == "": self.report({"INFO"},"一度も保存されていません") return {'CANCELLED'} #self.report({"INFO"},"") #カメラにキー入れる fjw.globalview() fjw.mode("OBJECT") fjw.deselect() fjw.activate(bpy.data.objects["Camera"]) bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') selfname = os.path.splitext(os.path.basename(bpy.data.filepath))[0] dir = os.path.dirname(bpy.data.filepath) pname = "page.blend" ppath = dir + os.sep + pname #ページファイルの存在確認 if not os.path.exists(ppath): self.report({"INFO"},"ページファイルが存在しません") return {'CANCELLED'} #キーフレーム対策 #キーフレームオンだと、ツールでカメラ動かした時にトランスフォームが保存されないことがある for obj in bpy.data.objects: if obj.type == "CAMERA": fjw.deselect() obj.select = True try: bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') except : pass bpy.context.space_data.lock_camera = False #保存 bpy.ops.wm.save_mainfile() fjw.globalview() #レンダリング #レンダ設定 renderpath = dir + os.sep + "pageutils" + os.sep + "img" + os.sep + selfname + ".png" render(renderpath,True) #ページファイルを開く bpy.ops.wm.open_mainfile(filepath=ppath) return {"FINISHED"}
def gen_rig_and_reparent(self, metarig, unparent_at_rest=True): """ genrigして再ペアレントする。 """ if metarig.type != "ARMATURE": return False layers_current = fjw.layers_current_state() fjw.layers_showall() objects_bu = fjw.ObjectsPropBackups(bpy.context.scene.objects) objects_bu.store("hide") for obj in bpy.context.scene.objects: obj.hide = False self.set_metarig(metarig) self.set_rig(self.find_rig()) rig_old = None if self.rig: rig_old = self.rig if unparent_at_rest: self.rig.obj.data.pose_position = 'REST' self.rig.rigged_objects.parent_clear() rigdata = self.rig.obj.data fjw.delete([self.rig.obj]) bpy.data.armatures.remove(rigdata) fjw.deselect() fjw.activate(metarig) bpy.ops.pose.rigify_generate() new_rig = Rig(fjw.active()) if self.rig: new_rig.edit_bones_data.restore_info_from(self.rig.edit_bones_data) self.rig.rigged_objects.reset_rig(new_rig.obj) # bpy.ops.view3d.layers(nr=0, extend=False) if self.rig: self.rig.rigged_objects.reparent() # bpy.ops.view3d.layers(nr=0, extend=False) fjw.layers_show_list(layers_current) metarig.hide = True fjw.activate(new_rig.obj) fjw.mode("POSE") if rig_old: new_rig.restore_settings_from(rig_old) objects_bu.restore() return True
def gen_bevelcurve_all_strokes(depth): fjw.deselect() color = (1,1,1) while color: color, fill_color = extract_stroke_to_new_layer() if color: bpy.ops.gpencil.convert(type='CURVE', use_timing_data=True) bpy.ops.gpencil.layer_remove() selection = fjw.get_selected_list() for obj in selection: curve_set_bevel(obj, depth, color) fjw.deselect() bpy.ops.gpencil.layer_remove()
def reparent(self): """ 格納した情報に応じて再ペアレントする。 """ rig = self.get_rig() obj = self.obj modu = fjw.Modutils(self.obj) mod_arm = modu.find_bytype("ARMATURE") if not self.has_armature_mod: fjw.mode("OBJECT") fjw.deselect() obj.select = True fjw.activate(rig) if self.parent_type == "OBJECT": bpy.ops.object.parent_set(type='OBJECT', keep_transform=True) elif self.parent_type == "BONE": if self.parent_bone in rig.data.bones: fjw.mode("POSE") layerstates = [] for state in rig.data.layers: layerstates.append(state) rig.data.layers = [True for i in range(len(rig.data.layers))] rig.data.bones.active = rig.data.bones[self.parent_bone] bpy.ops.object.parent_set(type='BONE_RELATIVE') rig.data.layers = layerstates else: #既存のアーマチュアmodを除去する mod_arms = modu.find_bytype_list("ARMATURE") for mod in mod_arms: modu.remove(mod) fjw.deselect() obj.select = True fjw.activate(rig) if "rigify_parenting" in obj: bpy.ops.object.parent_set(type=obj["rigify_parenting"]) else: bpy.ops.object.parent_set(type='ARMATURE_AUTO') fjw.activate(obj) modu.sort() pass self.obj.hide = self.hide
def export(self): fjw.deselect() fjw.activate(self.obj) if len(self.obj.data.uv_textures) == 0: fjw.mode("EDIT") bpy.ops.mesh.select_all(action='SELECT') bpy.ops.uv.smart_project() fjw.mode("OBJECT") if not os.path.exists(self.src_dir): os.makedirs(self.src_dir) bpy.ops.export_scene.obj(filepath=self.src_obj_path, check_existing=False, use_selection=True, use_mesh_modifiers=False)
def save_pre(context): #カメラにキー入らんでどうしようもないからこれでいれる!!!→2017/11/26 Blender2.79で修正されているのを確認 #カメラにキー入れる if bpy.context.scene.tool_settings.use_keyframe_insert_auto: if bpy.context.scene.camera != None: if not fjw.in_localview(): current = fjw.active() current_mode = "OBJECT" if current != None: current_mode = fjw.active().mode fjw.mode("OBJECT") selection = fjw.get_selected_list() fjw.deselect() fjw.activate(bpy.context.scene.camera) bpy.ops.anim.keyframe_insert_menu(type='LocRotScale') if current != None: fjw.deselect() fjw.select(selection) fjw.activate(current) fjw.mode(current_mode)
def apply_pose(self): """ ポーズをデフォルトに設定する。トランスフォームも確定する。 """ fjw.mode("OBJECT") fjw.deselect() fjw.activate(self.obj) fjw.mode("POSE") self.show_all_layers() bpy.ops.pose.reveal() for pbone in self.obj.pose.bones: pbone.bone.hide = False pbone.bone.select = True bpy.ops.pose.select_all(action='SELECT') bpy.ops.pose.visual_transform_apply() self.mute_constraints() fjw.mode("POSE") bpy.ops.pose.armature_apply() self.restore_layers() self.reset_edit_bones()
def assign_image(self, image_path): """ベイクの代わりに既にベイクしたイメージを割り当てる。""" fjw.deselect() fjw.activate(self.obj) bpy.ops.object.shade_smooth() # イメージ取得。既にロードされてたらそれを使うべき。 image = None for img in bpy.data.images: if img.is_library_indirect: continue if bpy.path.abspath(img.filepath) == bpy.path.abspath(image_path): return img if not image: # 相対パス化。 image = bpy.data.images.load(filepath=bpy.path.relpath(image_path)) dirname, name, ext = fjw.splitpath(image_path) textype = self.get_identifier(name) tex = self.get_baketex(textype) tex.image = image
def apply(self): """ アーマチュア変形やボーン相対変形を適用する。 ペアレントがクリアされている前提。 """ obj = self.obj fjw.mode("OBJECT") fjw.deselect() fjw.activate(obj) fjw.mode("OBJECT") #モディファイアの適用 if obj.type == "MESH": modu = fjw.Modutils(obj) arm = modu.find_bytype("ARMATURE") modu.apply(arm) #トランスフォームの適用 bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
def load_img_with_camera(self, filepath, tilenumber=1, use_json=True): dirname = os.path.dirname(filepath) basename = os.path.basename(filepath) name, ext = os.path.splitext(basename) fjw.deselect() plane = self.make_plane(self.camera, filepath) if not plane: return None plane.hide_render = True if use_json: ############json依存ここから j = self.load_json(filepath) doc_size = [j["document"]["width"], j["document"]["height"]] layer_size = [j["layer"]["width"], j["layer"]["height"]] layer_pos = Vector(j["layer"]["posmid"]) tilenumber = j["tile"] camscale = self.camera.data.ortho_scale #レイヤー座標 #layer_posを中心を0とした、-0.5~0.5の範囲に変換する layer_pos[0] = (layer_pos[0] / doc_size[0] - 0.5) layer_pos[1] = (layer_pos[1] / doc_size[1] - 0.5) * -1 #座標逆!! #*カメラスケール layer_pos *= camscale print(layer_pos) plane.location = (layer_pos[0], layer_pos[1], 0) zpos = (0.5 + len(self.camera.children) * 0.1) * -1 plane.location[2] = zpos * 0.1 #レイヤースケール #ドキュメントにおけるレイヤーの大きさ割合を算出 layer_scale = Vector([1, 1]) layer_scale[0] = layer_size[0] / doc_size[0] layer_scale[1] = layer_size[1] / doc_size[1] #*カメラスケール layer_scale *= camscale #8*8分割画像なのでさらに8倍 layer_scale *= tilenumber plane.scale = (layer_scale[0], layer_scale[1], 1) ############json依存ここまで else: camscale = self.camera.data.ortho_scale plane.scale = (camscale, camscale, camscale) #位置オフセット if tilenumber != 1: offset = Vector([0, 0]) offset[0] = plane.scale[0] / 2 - plane.scale[0] / tilenumber / 2 offset[1] = plane.scale[1] / 2 - plane.scale[0] / tilenumber / 2 plane.location[0] += offset[0] plane.location[1] -= offset[1] if use_json: plane.scale *= 0.5 #カメラを移動させてプロジェクタを子にする self.camera_state.store_transform() self.camera.location = (0, 0, 0) self.camera.rotation_euler = (0, 0, 0) plane.parent = self.camera self.camera_state.restore_transform() return plane
def setup_mdwork_main(cls, self, context): if "_MDWork" not in bpy.data.filepath: fjw.framejump(cls.last_frame) dir = os.path.dirname(bpy.data.filepath) name = os.path.splitext(os.path.basename(bpy.data.filepath))[0] blend_md = dir + os.sep + name + "_MDWork.blend" bpy.ops.wm.save_as_mainfile(filepath=blend_md) bpy.context.scene.layers[0] = True for i in range(19): bpy.context.scene.layers[i + 1] = False for i in range(5): bpy.context.scene.layers[i] = True #ポーズだけついてるやつをポーズライブラリに登録する for armature_proxy in bpy.context.visible_objects: if armature_proxy.type != "ARMATURE": continue if "_proxy" not in armature_proxy.name: continue fjw.deselect() fjw.activate(armature_proxy) fjw.mode("POSE") bpy.ops.pose.select_all(action='SELECT') bpy.ops.fujiwara_toolbox.set_key() fjw.mode("OBJECT") fjw.mode("OBJECT") bpy.ops.object.select_all(action='SELECT') bpy.ops.file.make_paths_absolute() selection = fjw.get_selected_list() for obj in selection: md_garment_path_list = cls.__get_prop(obj, "md_garment_path_list") md_export_id = cls.__get_prop(obj, "md_export_id") md_garment_index = cls.__get_prop(obj, "md_garment_index") md_export_depth = cls.__get_prop(obj, "md_export_depth") # obj.dupli_group.library.filepath link_path = "" if obj.dupli_group is not None and obj.dupli_group.library is not None: link_path = obj.dupli_group.library.filepath if link_path == "" or link_path is None: continue fjw.deselect() fjw.activate(obj) bpy.ops.object.duplicates_make_real(use_base_parent=True, use_hierarchy=True) realized_objects = fjw.get_selected_list() for robj in realized_objects: robj["linked_path"] = link_path root = fjw.get_root(robj) if md_garment_path_list is not None: root["md_garment_path_list"] = md_garment_path_list if md_export_id is not None: root["md_export_id"] = md_export_id if md_garment_index is not None: root["md_garment_index"] = md_garment_index if md_export_depth is not None: root["md_export_depth"] = md_export_depth #garment_pathを絶対パス化する if "md_garment_path_list" in robj: pathlist_base = robj["md_garment_path_list"] print("*" * 15) print("* make garment path to abs") print("*" * 15) lib_dir = os.path.dirname(link_path) pathlist_new = [] for garment_path in pathlist_base: new_path = bpy.path.abspath(garment_path, start=lib_dir) pathlist_new.append(new_path) print(new_path) robj["md_garment_path_list"] = pathlist_new print("*" * 15) #proxyの処理 #同一のアーマチュアデータを使っているものを探してポーズライブラリを設定する。 for armature_proxy in bpy.data.objects: if armature_proxy.type != "ARMATURE": continue if "_proxy" not in armature_proxy.name: continue for armature in bpy.data.objects: if armature.type != "ARMATURE": continue if armature == armature_proxy: continue if armature.data == armature_proxy.data: #同一データを使用している #のでポーズライブラリの設定をコピーする armature.pose_library = armature_proxy.pose_library #回収したポーズライブラリを反映する fjw.mode("OBJECT") fjw.activate(armature) if fjw.active() is not None: aau = fjw.ArmatureActionUtils(armature) armu = fjw.ArmatureUtils(armature) fjw.active().hide = False fjw.mode("POSE") poselist = aau.get_poselist() if poselist is not None: for pose in aau.get_poselist(): frame = int( str(pose.name).replace("mdpose_", "")) fjw.framejump(frame) #ジオメトリはゼロ位置にする geo = armu.GetGeometryBone() armu.clearTrans([geo]) bpy.ops.pose.select_all(action='SELECT') armu.databone(geo.name).select = False aau.apply_pose(pose.name) #1フレームではデフォルトポーズに fjw.mode("POSE") fjw.framejump(1) bpy.ops.pose.select_all(action='SELECT') bpy.ops.pose.transforms_clear() #proxyの全削除 fjw.mode("OBJECT") prxs = fjw.find_list("_proxy") fjw.delete(prxs) # bpy.app.handlers.scene_update_post.append(process_proxy) bpy.context.space_data.show_only_render = False
def mdresult_auto_import_main(cls, self, context, attouch_fjwset=False): import_ext = ".obj" #存在確認 # blendname = os.path.splitext(os.path.basename(bpy.data.filepath))[0] # dir_path = get_mddatadir() + blendname + os.sep dir_path = get_mddatadir() self.report({"INFO"}, dir_path) if not os.path.exists(dir_path): self.report({"INFO"}, "キャンセルされました。") # bpy.ops.wm.quit_blender() return {'CANCELLED'} #既存のリザルトを処分 fjw.deselect() dellist = [] for obj in bpy.context.scene.objects: if obj.type == "MESH" and "result" in obj.name: dellist.append(obj) fjw.delete(dellist) root_objects = [] for obj in bpy.context.scene.objects: if obj.parent is None: root_objects.append(obj) mdj = MDJson() entries = mdj.get_thisfile_entries() # files = os.listdir(dir_path) # for file in files: files = [] for entry in entries: file = entry + import_ext # 対応するファイルが実際にあるかをチェックしないとだめ! filepath = dir_path + file if not os.path.exists(filepath): continue files.append(file) for file in files: self.report({"INFO"}, file) print("MDResult found:" + file) # targetname = file # dirname = os.path.basename(os.path.dirname(file)) targetname = file # rootobjでの設置だとルートがないとおかしなことになる # dupli_groupの名前でみて、同一名のもののアーマチュアを探して、 # vislble_objects内のそのデータと同一のプロクシないしアーマチュア、のジオメトリを指定すればいいのでは #グループ名だと全部"MainGroup"だからマッチしない! #グループの親ファイルパスの名前を見る!! #複製子除去 # targetname = re.sub(r"\.\d+", "", targetname) print("basename:%s, targetname:%s" % (file, targetname)) #fileと同名のdupli_groupを検索 dupli_group = None for group in bpy.data.groups: # gname = re.sub(r"\.\d+", "", group.name) if group.name == "MainGroup": if group.library is not None: g_filepath = group.library.filepath g_filename = os.path.basename(g_filepath) gname, ext = os.path.splitext(g_filename) else: gname = group.name else: gname = group.name if targetname == gname: dupli_group = group break if not dupli_group: print("!targetname not in bpy.data.groups!:%s" % targetname) else: print("*targetname found*:%s" % targetname) if dupli_group: dgroup = dupli_group #Bodyが参照しているアーマチュアのデータを取得 target_armature = None #この検索問題 名前Bodyじゃない可能性がある まずカスタムプロパティで探すべき #普通に全てのアーマチュアがシーン上のアーマチュアと一致したらそれ採用でいいのでは? # for obj in dgroup.objects: for scene_amature in bpy.context.visible_objects: if scene_amature.type != "ARMATURE": continue linked_object = scene_amature.proxy_group if linked_object: #グループが一致 if linked_object.dupli_group == dupli_group: #ルートアーマチュアを採用する target_armature = cls.__find_root_armature( scene_amature) break # if "Body" in dgroup.objects: # Body = dgroup.objects["Body"] # modu = fjw.Modutils(Body) # armt = modu.find("Armature") # if armt is not None: # armature = armt.object # if armature is not None: # armature_data = armature.data # for scene_amature in bpy.context.visible_objects: # if scene_amature.type != "ARMATURE": # continue # if scene_amature.data != armature_data: # continue # #同一のアーマチュアデータを発見したのでこいつを使用する # target_armature = scene_amature # break if not target_armature: print("!target_armature not found!") if target_armature is not None: print("target_armature:%s" % target_armature) arm = target_armature print("MDImport Step 0") fjw.mode("OBJECT") fjw.deselect() fjw.activate(arm) print("MDImport Step 1") fjw.mode("POSE") armu = fjw.ArmatureUtils(arm) geo = armu.GetGeometryBone() armu.activate(geo) print("MDImport Step 2") fjw.mode("POSE") self.report({"INFO"}, dir_path + file) print("MDImport Selecting GeoBone:" + dir_path + file) #インポート # mdresultpath = dir_path + file + os.sep + "result" + import_ext mdresultpath = dir_path + file MarvelousDesingerUtils.import_mdresult(mdresultpath, attouch_fjwset) print("MDImport Import MDResult:" + mdresultpath) fjw.mode("OBJECT") for obj in bpy.context.visible_objects: if "result" in obj.name: obj.select = True #テクスチャのパック cls.__pack_img_of_obj(obj)
def facesetup(self): """ ミラーモディファイアの適用 マテリアル割当←割り当てる前にマテリアルを作っとく必要がある 目・眉頂点グループを左右別に割り当てる 眼球用メッシュ分離→厚みマイナスつけてフチのみにする=へこます まつげ用メッシュ複製分離→まつげ用マテリアルを割り当て ・頂点グループ Eye, Mouth, Eyebrow """ fjw.deselect() fjw.activate(self.face) modu = fjw.Modutils(self.face) mod_mirror = modu.find_bytype("MIRROR") if mod_mirror: modu.apply(mod_mirror) vgu = fjw.VertexGroupUtils(self.face) ######################################## # メッシュセットアップ ######################################## #鼻線画 fjw.mode("EDIT") self.mesh_deselect() bpy.context.scene.tool_settings.mesh_select_mode = [True, False, False] self.select_by_vertex_group("Nose") bpy.ops.fujiwara_toolbox.make_skin_line() bpy.ops.transform.skin_resize(value=(0.0526974, 0.0526974, 0.0526974), constraint_axis=(False, False, False), constraint_orientation='LOCAL', mirror=True, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=0.0295401) bpy.ops.mesh.subdivide(smoothness=0) fjw.mode("OBJECT") fjw.deselect() fjw.activate(self.face) #プロジェクション設定 #肌 mat = self.get_material("Skin") self.set_projection("Shadow", mat, find=True) self.set_projection("Cheek", mat, find=True) self.assign_material_to_mesh(mat) #まつげテクスチャをつかった目の穴 mat = self.get_material("Eyehole_R") self.set_projection("Eyelid_R", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "x") mat = self.get_material("Eyehole_L") self.set_projection("Eyelid_L", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "-x") #口 mat = self.get_material("Mouth") self.set_projection("Mouth", mat, find=True) self.assign_material_by_vetexgroup("Mouth", mat) #まゆげ #選択したら複製する eyebrow = self.mesh_dup("Eyebrow") eyebrow.location[1] -= 0.001 eyebrow.name = "Eyebrow" mat = self.get_material("Eyebrow_R") self.set_projection("Eyebrow_R", mat, find=True) self.assign_material_by_vetexgroup("Eyebrow", mat, "x") mat = self.get_material("Eyebrow_L") self.set_projection("Eyebrow_L", mat, find=True) self.assign_material_by_vetexgroup("Eyebrow", mat, "-x") #目 fjw.mode("OBJECT") fjw.activate(self.face) fjw.mode("EDIT") eye = self.mesh_dup("Eye") eye.location[1] += 0.001 eye.name = "Eye" mat = self.get_material("Eye_R") self.set_projection("Pupil_R", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "x") mat = self.get_material("Eye_L") self.set_projection("Pupil_L", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "-x") #外周をすこし後ろに bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.region_to_loop() bpy.ops.transform.translate(value=(0, 0.001, 0), constraint_axis=(False, True, False), constraint_orientation='GLOBAL', mirror=True, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1, release_confirm=True, use_accurate=False) #まつげ Z処理的に、厚み付じゃだめ。座標をズラす。 fjw.mode("OBJECT") fjw.activate(self.face) fjw.mode("EDIT") eyelid = self.mesh_dup("Eye") eyelid.location[1] -= 0.001 eyelid.name = "Eyelid" mat = self.get_material("Eyelid_R") self.set_projection("Eyelid_R", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "x") mat = self.get_material("Eyelid_L") self.set_projection("Eyelid_L", mat, find=True) self.assign_material_by_vetexgroup("Eye", mat, "-x") #外周の拡張 bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.region_to_loop() bpy.ops.fujiwara_toolbox.command_357169() bpy.ops.fujiwara_toolbox.pivot_to_individual() bpy.ops.mesh.extrude_region_move( MESH_OT_extrude_region={"mirror": False}, TRANSFORM_OT_translate={ "value": (0, 0, 0), "constraint_axis": (False, False, False), "constraint_orientation": 'GLOBAL', "mirror": False, "proportional": 'DISABLED', "proportional_edit_falloff": 'SMOOTH', "proportional_size": 1, "snap": False, "snap_target": 'CLOSEST', "snap_point": (0, 0, 0), "snap_align": False, "snap_normal": (0, 0, 0), "gpencil_strokes": False, "texture_space": False, "remove_on_cancel": False, "release_confirm": False, "use_accurate": False }) bpy.ops.transform.resize(value=(1.66677, 1.66677, 1.66677), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=True, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1) fjw.mode("OBJECT") fjw.activate(self.face) fjw.mode("OBJECT") ######################################## # マテリアルセットアップ ######################################## mat = self.get_material("Skin") self.facemat_basesetup(mat) self.facemat_skinsetup(mat) mat = self.get_material("Eyehole_R") self.facemat_basesetup(mat) self.facemat_skinsetup(mat) tslot = self.add_projectorimage_to_mat(mat, "Eyelid_R") self.tslot_setting(tslot, False, True) mat = self.get_material("Eyehole_L") self.facemat_basesetup(mat) self.facemat_skinsetup(mat) tslot = self.add_projectorimage_to_mat(mat, "Eyelid_L") self.tslot_setting(tslot, False, True) mat = self.get_material("Mouth") self.facemat_basesetup(mat) self.facemat_skinsetup(mat) tslot = self.add_projectorimage_to_mat(mat, mat.name) self.tslot_setting(tslot, True, True) mat = self.get_material("Eyebrow_R") # self.facemat_basesetup(mat) # tslot = self.add_projectorimage_to_mat(mat, mat.name) # self.tslot_setting(tslot, True, True) self.facemat_basesetup(mat) tslot = self.add_projectorimage_to_mat(mat, mat.name) prj = self.get_projector(mat.name, True) img = self.get_projector_image(prj.name) img = self.get_noalpha(img) #アルファ tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, False, True, True, True) #カラー tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, True, False) mat = self.get_material("Eyebrow_L") # self.facemat_basesetup(mat) # tslot = self.add_projectorimage_to_mat(mat, mat.name) # self.tslot_setting(tslot, True, True) self.facemat_basesetup(mat) tslot = self.add_projectorimage_to_mat(mat, mat.name) prj = self.get_projector(mat.name, True) img = self.get_projector_image(prj.name) img = self.get_noalpha(img) #アルファ tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, False, True, True, True) #カラー tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, True, False) mat = self.get_material("Eye_R") self.facemat_basesetup(mat) tslot = self.add_projectorimage_to_mat(mat, "Pupil_R") self.tslot_setting(tslot, True, False) mat = self.get_material("Eye_L") self.facemat_basesetup(mat) tslot = self.add_projectorimage_to_mat(mat, "Pupil_L") self.tslot_setting(tslot, True, False) mat = self.get_material("Eyelid_R") self.facemat_basesetup(mat) tslot = self.add_projectorimage_to_mat(mat, mat.name) prj = self.get_projector(mat.name, True) img = self.get_projector_image(prj.name) img = self.get_noalpha(img) #アルファ tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, False, True, True, True) #カラー tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, True, False) mat = self.get_material("Eyelid_L") self.facemat_basesetup(mat) prj = self.get_projector(mat.name, True) img = self.get_projector_image(prj.name) img = self.get_noalpha(img) #アルファ tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, False, True, True, True) #カラー tslot = self.set_texture_to_mat(mat, img, prj.name) self.tslot_setting(tslot, True, False) #仕上げに拡縮を適用して裏ポリエッジをつける self.attouch_uraporiedge()