Skip to content

Instantly share code, notes, and snippets.

@slapin
Created August 9, 2020 08:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slapin/8458c9d5735d63a156b283fc1891e4f7 to your computer and use it in GitHub Desktop.
Save slapin/8458c9d5735d63a156b283fc1891e4f7 to your computer and use it in GitHub Desktop.
import bpy
from mathutils import Vector
from math import pi
context = bpy.context
namelist = [("Root", "root")]
fix_ptail = ["LowerLeg_L", "LowerLeg_R"]
ik_targets = {
"elbow_ik_L": ["LowerArm_L", Vector((0, 0.5, 0)), Vector((0, 0.5, 0.2)), False],
"elbow_ik_R": ["LowerArm_R", Vector((0, 0.5, 0)), Vector((0, 0.5, 0.2)), False],
"knee_ik_L": ["LowerLeg_L", Vector((0, -0.5, 0)), Vector((0, -0.5, 0.2)), False],
"knee_ik_R": ["LowerLeg_R", Vector((0, -0.5, 0)), Vector((0, -0.5, 0.2)), False],
"foot_ik_L": ["Foot_L", Vector((0, 0, 0)), Vector((0, -0.15, 0)), True],
"foot_ik_R": ["Foot_R", Vector((0, 0, 0)), Vector((0, -0.15, 0)), True],
"wrist_ik_L": ["Hand_L", Vector((0, 0, 0)), Vector((0, 0, 0.15)), True],
"wrist_ik_R": ["Hand_R", Vector((0, 0, 0)), Vector((0, 0, 0.15)), True]
}
bb_size = {
"Hips": [0.25, 0.004]
}
ik = {
"LowerArm_L": ["wrist_ik_L", "elbow_ik_L", 2.008],
"LowerArm_R": ["wrist_ik_R", "elbow_ik_R", pi - 2.008],
"LowerLeg_L": ["foot_ik_L", "knee_ik_L", -2.4],
"LowerLeg_R": ["foot_ik_R", "knee_ik_R", -pi + 2.4]
}
for obj in bpy.data.objects:
print(obj.type)
if obj.type != "ARMATURE":
continue
bpy.context.view_layer.objects.active = obj
for name, newname in namelist:
pb = obj.pose.bones.get(name)
if pb is None:
continue
print(pb.name)
pb.name = newname
print(pb.name)
bpy.ops.object.mode_set(mode='EDIT')
for bone in obj.pose.bones:
print(bone.name)
if bone.name.startswith("J_Bip_"):
bone.name = bone.name[6:]
if bone.name.startswith("J_Sec_"):
bone.name = bone.name[6:]
if bone.name.startswith("J_Adj_"):
bone.name = bone.name[6:] + "Adj"
if bone.name.startswith("L_"):
bone.name = bone.name[2:] + "_L"
if bone.name.startswith("R_"):
bone.name = bone.name[2:] + "_R"
if bone.name.startswith("C_"):
bone.name = bone.name[2:]
print(bone.name)
print(bone.head)
print(bone.tail)
ebone = obj.data.edit_bones[bone.name]
if bone.parent:
if not ebone.use_connect:
if (bone.parent.tail - bone.head).length < 0.001:
ebone.use_connect = True
print(ebone.bbone_x)
print(ebone.bbone_z)
for bname in fix_ptail:
bdata = obj.data.edit_bones[bname]
bdata.parent.tail = bdata.head
for ikt in ik_targets.keys():
bname = ik_targets[ikt][0]
bdata = obj.data.edit_bones[bname]
nbone = obj.data.edit_bones.new(ikt)
nbone.head = bdata.head + ik_targets[ikt][1]
nbone.tail = bdata.head + ik_targets[ikt][2]
nbone.parent = obj.data.edit_bones["root"]
nbone.use_connect = False
nbone.use_deform = False
if ik_targets[ikt][3]:
bdata.use_connect = False
bdata.parent = nbone
for ebone in obj.data.edit_bones:
ebone.bbone_x = 0.004
ebone.bbone_z = 0.004
for kb in bb_size.keys():
ebone = obj.data.edit_bones[kb]
ebone.bbone_x = bb_size[kb][0]
ebone.bbone_z = bb_size[kb][1]
bpy.ops.object.mode_set(mode='POSE')
for pb in ik.keys():
bone = obj.pose.bones[pb]
c = bone.constraints.new("IK")
c.target = obj
c.subtarget = ik[pb][0]
c.chain_count = 2
c.pole_target = obj
c.pole_subtarget = ik[pb][1]
c.pole_angle = ik[pb][2]
bpy.ops.pose.armature_apply()
bpy.ops.object.mode_set(mode='OBJECT')
for mat in bpy.data.materials:
print(mat.name)
if mat.use_nodes:
for node in mat.node_tree.nodes:
print(node.name)
print(node.label)
print(node.type)
nnode = mat.node_tree.nodes.new("ShaderNodeBsdfPrincipled")
nnode.location = (400, 200)
nnode.label = "Mat"
diffuse = None
normal = None
emission = None
for k in mat.node_tree.nodes:
if k.type == "TEX_IMAGE":
if k.label == "MainTexture":
diffuse = k
elif k.label == "NomalmapTexture":
normal = k
elif k.label == "Emission_Texture":
emission = k
if k.type == "GROUP":
mat.node_tree.nodes.remove(k)
print(diffuse)
material_output = mat.node_tree.nodes.get('Material Output')
#for tx in diffuse.outputs.keys():
# print(tx)
if diffuse:
mat.node_tree.links.new(nnode.inputs["Base Color"], diffuse.outputs[0])
mat.node_tree.links.new(nnode.inputs["Alpha"], diffuse.outputs[1])
if normal:
mat.node_tree.links.new(nnode.inputs["Normal"], normal.outputs[0])
if emission:
mat.node_tree.links.new(nnode.inputs["Emission"], emission.outputs[0])
mat.node_tree.links.new(material_output.inputs[0], nnode.outputs[0])
print("done")
bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath.replace(".blend", ".mod.blend"))
bpy.ops.wm.quit_blender()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment