Exemplo n.º 1
0
def getJointSizeAndCentre(joints, threshold=0.65, space=SPACE_OBJECT):
    '''
	minor modification to the getJointSize function in rigging.utils - uses the
	child of the joint[ 0 ] (if any exist) to determine the size of the joint in
	the axis aiming toward
	'''

    centre = Vector.Zero(3)
    if not isinstance(joints, (list, tuple)):
        joints = [joints]

    joints = [str(j) for j in joints if j is not None]
    if not joints:
        return Vector((1, 1, 1))

    size, centre = rigUtils.getJointSizeAndCentre(joints, threshold, space)
    if size.within(Vector.Zero(3), 1e-2):
        while threshold > 1e-2:
            threshold *= 0.9
            size, centre = rigUtils.getJointSizeAndCentre(joints, threshold)

        if size.within(Vector.Zero(3), 1e-2):
            size = Vector((1, 1, 1))

    children = listRelatives(joints[0], pa=True, type='transform')
    if children:
        childPos = Vector([0.0, 0.0, 0.0])
        childPosMag = childPos.get_magnitude()
        for child in children:
            curChildPos = Vector(xform(
                child, q=True, ws=True, rp=True)) - Vector(
                    xform(joints[0], q=True, ws=True, rp=True))
            curChildPosMag = curChildPos.get_magnitude()
            if curChildPosMag > childPosMag:
                childPos = curChildPos
                childPosMag = curChildPosMag

        axis = rigUtils.getObjectAxisInDirection(joints[0], childPos,
                                                 DEFAULT_AXIS)
        axisValue = getAttr('%s.t%s' % (children[0], axis.asCleanName()))

        if space == SPACE_WORLD:
            axis = Axis.FromVector(childPos)

        size[axis % 3] = abs(axisValue)
        centre[axis % 3] = axisValue / 2.0

    return size, centre