Created
April 1, 2021 13:43
-
-
Save Pikachuxxxx/cd70396d169fb7728cc9937be938e4fd to your computer and use it in GitHub Desktop.
A Blender Script to Convert any Rig to Mesh
This file contains 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
import bpy | |
import mathutils | |
from mathutils import Vector | |
from math import * | |
def CreateMesh(): | |
obj = bpy.context.active_object | |
if obj == None: | |
print( "No selection" ) | |
elif obj.type != 'ARMATURE': | |
print( "Armature expected" ) | |
else: | |
processArmature( bpy.context, obj ) | |
#Create the base object from the armature | |
def meshFromArmature( arm ): | |
name = arm.name + "_mesh" | |
meshData = bpy.data.meshes.new( name + "Data" ) | |
meshObj = bpy.data.objects.new( name, meshData ) | |
meshObj.matrix_world = arm.matrix_world.copy() | |
return meshObj | |
#Create the bone geometry (vertices and faces) | |
def boneGeometry( l1, l2, x, z, baseSize, l1Size, l2Size, base ): | |
x1 = x * baseSize * l1Size | |
z1 = z * baseSize * l1Size | |
# x2 = x * baseSize * l2Size | |
# z2 = z * baseSize * l2Size | |
x2 = Vector( (0, 0, 0) ) | |
z2 = Vector( (0, 0, 0) ) | |
verts = [ | |
l1 - x1 + z1, | |
l1 + x1 + z1, | |
l1 - x1 - z1, | |
l1 + x1 - z1, | |
l2 - x2 + z2, | |
l2 + x2 + z2, | |
l2 - x2 - z2, | |
l2 + x2 - z2 | |
] | |
faces = [ | |
(base+3, base+1, base+0, base+2), | |
(base+6, base+4, base+5, base+7), | |
(base+4, base+0, base+1, base+5), | |
(base+7, base+3, base+2, base+6), | |
(base+5, base+1, base+3, base+7), | |
(base+6, base+2, base+0, base+4) | |
] | |
return verts, faces | |
#Process the armature, goes through its bones and creates the mesh | |
def processArmature(context, arm, genVertexGroups = True): | |
print("processing armature {0}".format(arm.name)) | |
#Creates the mesh object | |
meshObj = meshFromArmature( arm ) | |
context.collection.objects.link( meshObj ) | |
verts = [] | |
edges = [] | |
faces = [] | |
vertexGroups = {} | |
bpy.ops.object.mode_set(mode='EDIT') | |
try: | |
#Goes through each bone | |
for editBone in [b for b in arm.data.edit_bones if b.use_deform]: | |
boneName = editBone.name | |
print( boneName ) | |
poseBone = arm.pose.bones[boneName] | |
#Gets edit bone informations | |
editBoneHead = editBone.head | |
editBoneTail = editBone.tail | |
editBoneVector = editBoneTail - editBoneHead | |
editBoneSize = editBoneVector.dot( editBoneVector ) | |
editBoneRoll = editBone.roll | |
editBoneX = editBone.x_axis | |
editBoneZ = editBone.z_axis | |
editBoneHeadRadius = editBone.head_radius | |
editBoneTailRadius = editBone.tail_radius | |
#Creates the mesh data for the bone | |
baseIndex = len(verts) | |
baseSize = sqrt( editBoneSize ) | |
newVerts, newFaces = boneGeometry( editBoneHead, editBoneTail, editBoneX, editBoneZ, baseSize, editBoneHeadRadius, editBoneTailRadius, baseIndex ) | |
verts.extend( newVerts ) | |
faces.extend( newFaces ) | |
#Creates the weights for the vertex groups | |
vertexGroups[boneName] = [(x, 1.0) for x in range(baseIndex, len(verts))] | |
#Assigns the geometry to the mesh | |
meshObj.data.from_pydata(verts, edges, faces) | |
except: | |
bpy.ops.object.mode_set(mode='OBJECT') | |
else: | |
bpy.ops.object.mode_set(mode='OBJECT') | |
#Assigns the vertex groups | |
if genVertexGroups: | |
for name, vertexGroup in vertexGroups.items(): | |
groupObject = meshObj.vertex_groups.new(name) | |
for (index, weight) in vertexGroup: | |
groupObject.add([index], weight, 'REPLACE') | |
#Creates the armature modifier | |
modifier = meshObj.modifiers.new('ArmatureMod', 'ARMATURE') | |
modifier.object = arm | |
modifier.use_bone_envelopes = False | |
modifier.use_vertex_groups = True | |
meshObj.data.update() | |
return meshObj | |
class MeshFromArmatureOperator(bpy.types.Operator): | |
bl_idname = "wm.hello_world" | |
bl_label = "MeshFromArmatureOperator" | |
def execute(self, context): | |
CreateMesh() | |
return {'FINISHED'} | |
bpy.utils.register_class(MeshFromArmatureOperator) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment