def execute(self, context):
from .model import SelectModel
from .rigid_bodies import SelectGeometry, AssignGeometry
from .segments import SelectSegment
C = bpy.context
D = bpy.data
model = C.active_object
bone_name = C.active_bone.name
axis = C.active_bone.RobotEditor.axis
pose_bone = C.active_object.pose.bones[bone_name]
parent_bone = pose_bone.parent
bone_to_parent = pose_bone.matrix.inverted() * parent_bone.matrix
bone_world = model.matrix_world * pose_bone.matrix
segment_length = bone_to_parent.translation.length
distance_to_children = [(child.matrix.inverted() * pose_bone.matrix).translation.length for child in
pose_bone.children]
self.logger.debug("%s, %s", segment_length, distance_to_children)
# if there is no translation to parent, the parent (or its parent) draws the joint
if bone_to_parent.translation.length > 0.001:
max_length = max(distance_to_children+[segment_length])
# If there is only one children, and its a distance 0, we have a ball joint
if len(pose_bone.children) == 1 and distance_to_children[0] < 0.001:
bpy.ops.mesh.primitive_uv_sphere_add(size=segment_length / 15.0)
C.active_object.matrix_world = bone_world
# if there IS a child, at distance >0 (or more than one child), draw a hinge joint
elif len(pose_bone.children):
bpy.ops.mesh.primitive_cylinder_add(radius=max_length / 15, depth=max_length / 5)
if axis == 'X':
m = Euler((0, 0, pi / 4)).to_matrix().to_4x4()
elif axis == 'Y':
m = Euler((0, 0, pi / 4)).to_matrix().to_4x4()
else:
m = Matrix()
C.active_object.matrix_world = bone_world * m
else:
bpy.ops.mesh.primitive_cone_add(radius1=segment_length/10,radius2=segment_length/10)
C.active_object.name = bone_name + '_axis'
new_name = C.active_object.name
SelectModel.run(model_name=model.name)
SelectSegment.run(bone_name)
SelectGeometry.run(new_name)
AssignGeometry.run()
return {'FINISHED'}
mesh_generation.py 文件源码
python
阅读 22
收藏 0
点赞 0
评论 0
评论列表
文章目录