Exemple #1
0
def orientChain(joints = None, axisAim = 'z+', axisUp = 'y+',
                worldUpAxis = [0,1,0], relativeOrient = True,
                progressBar = None,
                baseName = None, asMeta = True):
                
    """
    Given a series of positions, or objects, or a curve and a mesh - loft retopology it

    :parameters:


    :returns
        created(list)
    """    
    _str_func = 'orientChain'
    if baseName:raise NotImplementedError,"Remove these calls"
    
    def orientJoint(mJnt):
        if mJnt not in ml_cull:
            log.debug("|{0}| >> Aready done: {1}".format(_str_func,mJnt.mNode))                     
            return 
        
        log.debug("|{0}| >> Orienting: {1}".format(_str_func,mJnt.mNode))
        mParent = _d_parents[mJnt]
        if mParent and mParent in ml_cull:
            return
            log.debug("|{0}| >> Orienting parent: {1}".format(_str_func,mParent.mNode))         
            orientJoint(mParent)
            
        if mJnt in ml_world:
            log.debug("|{0}| >> World joint: {1}".format(_str_func,mJnt.mNode))
            try:
                axisWorldOrient = SHARED._d_axisToJointOrient[str_aim][str_up]
            except Exception,err:
                log.error("{0}>> World axis query. {1} | {2}".format(_str_func, str_aim, str_up))
                raise Exception,err
            
            log.debug("|{0}| >> World joint: {1} | {2}".format(_str_func,mJnt.mNode, axisWorldOrient))
            mJnt.rotate = 0,0,0
            mJnt.jointOrient = axisWorldOrient[0],axisWorldOrient[1],axisWorldOrient[2]
            
        elif mJnt not in ml_ends:
            log.debug("|{0}| >> Reg joint: {1}".format(_str_func,mJnt.mNode))            
            mDup = mJnt.doDuplicate(parentOnly = True)
            mc.makeIdentity(mDup.mNode, apply = 1, jo = 1)#Freeze
            
            if relativeOrient and mParent:
                _axisWorldUp = MATH.get_obj_vector(mParent.mNode, axisUp)            
            else:
                _axisWorldUp = worldUpAxis
    
            SNAP.aim(mDup.mNode,_d_children[mJnt][0].mNode,
                     mAxis_aim.p_vector,mAxis_up.p_vector,
                     'vector',_axisWorldUp)
            
            mJnt.rotate = 0,0,0
            mJnt.jointOrient = mDup.rotate
            mDup.delete()
Exemple #2
0
def create_vectorCurveFromObj(obj=None,
                              vector='z+',
                              distance=1,
                              asEuclid=False):
    try:
        _vec = transformDirection(obj, vector)
    except:
        _vec = MATH.get_obj_vector(obj, vector, True)
    return DIST.create_vectorCurve(
        POS.get(obj), _vec, distance,
        "{0}_{1}_vecLine".format(NAME.get_base(obj), vector))
Exemple #3
0
def get_pos_by_axis_dist(obj, axis, distance=1):
    """
    Get a point in space given an object, an axis and a distance
    
    :parameters:
        obj(string)
        axis(str)
        asEuclid(bool) - data return format   
    :returns
        distance(float)
    """
    obj = VALID.mNodeString(obj)
    _vector = MATHUTILS.get_obj_vector(obj, axis, False)
    return get_pos_by_vec_dist(POS.get(obj), _vector, distance)
Exemple #4
0
def aim_atPoint(obj = None, position = [0,0,0], aimAxis = "z+", upAxis = "y+", mode = 'local',vectorUp = None,ignoreAimAttrs = False):
    """
    Aim functionality.
    
    :parameters:
        obj(str): Object to modify
        position(array): object to copy from
        aimAxis(str): axis that is pointing forward
        upAxis(str): axis that is pointing up
        mode(str): 
            'local'-- use standard maya aiming with local axis
            'world' -- use standard maya aiming with world axis
            'matrix' -- use Bokser's fancy method
            'vector' -- maya standard with vector up axis
            'object' -- maya standard with object

    :returns
        success(bool)
    """ 
    try:
        _str_func = 'aimAtPoint'
        _loc = False
        
        
        _obj = VALID.objString(obj, noneValid=False, calledFrom = __name__ + _str_func + ">> validate obj")
        try:position = position.x,position.y,position.z
        except:pass
        try:vectorUp = vectorUp.x,vectorUp.y,vectorUp.z
        except:pass
        
        log.debug("|{0}| >> obj: {1} | position:{2} | mode: {3}".format(_str_func,_obj,position,mode))  
        
        if not ignoreAimAttrs:
            _d_aim = ATTR.validate_arg(_obj,'axisAim')
            _d_up =ATTR.validate_arg(_obj,'axisUp')
            if ATTR.has_attr(_d_aim) and ATTR.has_attr(_d_up):
                aimAxis = ATTR.get_enumValueString(_d_aim)
                upAxis = ATTR.get_enumValueString(_d_up)
                log.debug("|{0}| >> obj: {1} aimable from attrs. aim: {2} | up: {3}".format(_str_func,_obj,aimAxis,upAxis))              
        
        if mode == 'matrix':
            '''Rotate transform based on look vector'''
            # get source and target vectors
            objPos = POS.get(_obj, asEuclid=True)
            targetPos = MATH.Vector3.Create(position)
        
            aim = (targetPos - objPos).normalized()
            
            if not vectorUp:
                upVector = MATH.Vector3.up()
                if upAxis == "y-":
                    upVector = MATH.Vector3.down()
                elif upAxis == "z+":
                    upVector = MATH.Vector3.forward()
                elif upAxis == "z-":
                    upVector = MATH.Vector3.back()
                elif upAxis == "x+":
                    upVector = MATH.Vector3.right()
                elif upAxis == "x-":
                    upVector = MATH.Vector3.left()
                else:
                    upVector = MATH.Vector3.up()
                
                vectorUp = MATH.transform_direction( _obj, upVector )

            wantedAim, wantedUp = MATH.convert_aim_vectors_to_different_axis(aim, vectorUp, aimAxis, upAxis)
            
            xformPos = mc.xform(_obj, q=True, matrix = True, ws=True)
            pos = MATH.Vector3(xformPos[12], xformPos[13], xformPos[14])
            rot_matrix = EUCLID.Matrix4.new_look_at(MATH.Vector3.zero(), -wantedAim, wantedUp)
            
            s = MATH.Vector3.Create( mc.xform(_obj, q=True, ws=True, s=True) )
            
            scale_matrix = EUCLID.Matrix4()
            scale_matrix.a = s.x
            scale_matrix.f = s.y
            scale_matrix.k = s.z
            scale_matrix.p = 1
        
            result_matrix = rot_matrix * scale_matrix
        
            transform_matrix = result_matrix[0:12] + [pos.x, pos.y, pos.z, 1.0]
        
            mc.xform(_obj, matrix = transform_matrix , roo="xyz", ws=True)
            """elif mode == 'world':
            _loc = mc.spaceLocator()[0]
            mc.move (position[0],position[1],position[2], _loc, ws=True)  
            
            mAxis_aim = VALID.simpleAxis(aimAxis)
            mAxis_up = VALID.simpleAxis(upAxis)
            
            _constraint = mc.aimConstraint(_loc,_obj,
                                           maintainOffset = False,
                                           aimVector = mAxis_aim.p_vector,
                                           upVector = mAxis_up.p_vector,
                                           worldUpType = 'scene',)
            mc.delete(_constraint + [_loc])"""
        elif mode in ['local','world','vector','object']:
            _loc = mc.spaceLocator(name='test')[0]
            _loc_snap = POS.create_loc(_obj)
            
            mc.move (position[0],position[1],position[2], _loc, ws=True)  
            mAxis_aim = VALID.simpleAxis(aimAxis)
            mAxis_up = VALID.simpleAxis(upAxis) 
            
            if mode == 'world':                
                _constraint = mc.aimConstraint(_loc,_loc_snap,
                                               maintainOffset = False,
                                               aimVector = mAxis_aim.p_vector,
                                               upVector = mAxis_up.p_vector,
                                               worldUpType = 'scene',) 
            elif mode == 'object':
                vectorUp = VALID.mNodeString(vectorUp)
                _constraint = mc.aimConstraint(_loc,_loc_snap,
                                               maintainOffset = False,
                                               aimVector = mAxis_aim.p_vector,
                                               upVector = mAxis_up.p_vector,
                                               worldUpType = 'object',
                                               worldUpObject = vectorUp)
                                               #worldUpVector = _vUp)
            else:
                if mode == 'vector':
                    _vUp = vectorUp
                else:
                    _vUp = MATH.get_obj_vector(_obj,upAxis)
                _constraint = mc.aimConstraint(_loc,_loc_snap,
                                               maintainOffset = False,
                                               aimVector = mAxis_aim.p_vector,
                                               upVector = mAxis_up.p_vector,
                                               worldUpType = 'vector',
                                               worldUpVector = _vUp)                 
                
            go(obj,_loc_snap)
            mc.delete(_constraint,_loc_snap)    
        else:
            raise NotImplementedError,"mode: {0}".format(mode)
        
        if _loc:mc.delete(_loc)
        return True
    except Exception,err:
        try:mc.delete(_loc)
        except:pass
        log.error( "aim_atPoint | obj: {0} | err: {1}".format(obj,err) )
Exemple #5
0
def lever(self, ball=False):
    try:
        _str_func = 'lever_digit'
        log_start(_str_func)

        mBlock = self.mBlock
        mRigNull = self.mRigNull
        _offset = self.v_offset
        _jointOrientation = self.d_orientation['str']
        ml_formHandles = self.ml_formHandles
        ml_prerigHandles = self.ml_prerigHandles
        mHandleFactory = self.mHandleFactory

        #Mesh shapes ----------------------------------------------------------
        mMesh_tmp = self.mBlock.atUtils('get_castMesh')
        str_meshShape = mMesh_tmp.getShapes()[0]

        #Figure out our knots ----------------------------------------------------
        mMain = self.ml_formHandlesUse[0]
        mMainLoft = mMain.loftCurve
        idxMain = self.ml_shapers.index(mMainLoft)

        minU = ATTR.get(str_meshShape, 'minValueU')
        maxU = ATTR.get(str_meshShape, 'maxValueU')

        f_factor = (maxU - minU) / (20)

        pprint.pprint(vars())

        #reload(SURF)

        #Meat ==============================================================
        mLeverDirect = mRigNull.getMessageAsMeta('leverDirect')
        mLeverFK = mRigNull.getMessageAsMeta('leverFK')

        mLeverControlCast = mLeverDirect
        if not mLeverControlCast:
            mLeverControlCast = mLeverFK

        log.debug("|{0}| >> mLeverControlCast: {1}".format(
            _str_func, mLeverControlCast))

        dist_lever = DIST.get_distance_between_points(
            ml_prerigHandles[0].p_position, ml_prerigHandles[1].p_position)
        log.debug("|{0}| >> Lever dist: {1}".format(_str_func, dist_lever))

        #Dup our rig joint and move it
        mDup = mLeverControlCast.doDuplicate(po=True)
        mDup.p_parent = mLeverControlCast
        mDup.resetAttrs()
        ATTR.set(mDup.mNode, 't{0}'.format(_jointOrientation[0]),
                 dist_lever * .5)

        l_lolis = []
        l_starts = []

        _mTar = mDup

        if ball:
            #Loli ===============================================================
            mDefineLeverObj = mBlock.defineLeverHelper
            _mVectorLeverUp = MATH.get_obj_vector(mDefineLeverObj.mNode,
                                                  'y+',
                                                  asEuclid=True)
            #mOrientHelper = mBlock.orientHelper
            #_mVectorLeverUp = MATH.get_obj_vector(mOrientHelper.mNode,'y+',asEuclid=True)

            mBall_tmp = mBlock.atUtils('get_castMesh')
            str_ballShape = mBall_tmp.getShapes()[0]
            pos = RAYS.cast(str_ballShape,
                            startPoint=_mTar.p_position,
                            vector=_mVectorLeverUp).get('near')

            #pos = RAYS.get_cast_pos(_mTar.mNode,_mVectorLeverUp,shapes = str_ballShape)
            #SNAPCALLS.get_special_pos([_mTar,str_ballShape],'castNear',str_settingsDirections,False)
            vec = MATH.get_vector_of_two_points(_mTar.p_position, pos)
            newPos = DIST.get_pos_by_vec_dist(pos, vec, _offset * 4)

            ball = CURVES.create_fromName('sphere', _offset * 2)
            mBall = cgmMeta.cgmObject(ball)
            mBall.p_position = newPos

            SNAP.aim_atPoint(
                mBall.mNode,
                _mTar.p_position,
                aimAxis=_jointOrientation[0] + '+',
                mode='vector',
                vectorUp=_mTar.getAxisVector(_jointOrientation[0] + '-'))

            line = mc.curve(d=1, ep=[pos, newPos], os=True)
            l_lolis.extend([ball, line])
            ATTR.set(mDup.mNode, 't{0}'.format(_jointOrientation[0]),
                     dist_lever * .8)
            CORERIG.shapeParent_in_place(mLeverFK.mNode, l_lolis, False)
            mBall_tmp.delete()

        #Main clav section ========================================
        """
        ml_clavShapes = BUILDUTILS.shapes_fromCast(self, 
                                                   targets= [mLeverControlCast.mNode,
                                                              mDup.mNode],
                                                         aimVector= self.d_orientation['vectorOut'],
                                                         connectionPoints = 5,
                                                         f_factor=0,
                                                         offset=_offset,
                                                         mode = 'frameHandle')"""

        l_curves = SURF.get_splitValues(str_meshShape,
                                        knotIndices=[0, idxMain],
                                        mode='u',
                                        insertMax=False,
                                        preInset=f_factor * .5,
                                        postInset=-f_factor * .5,
                                        curvesCreate=True,
                                        curvesConnect=True,
                                        connectionPoints=6,
                                        offset=self.v_offset)
        ml_shapes = cgmMeta.validateObjListArg(l_curves)

        mHandleFactory.color(mLeverFK.mNode, controlType='sub')
        CORERIG.shapeParent_in_place(mLeverFK.mNode,
                                     ml_shapes[0].mNode,
                                     False,
                                     replaceShapes=False)
        mDup.delete()
        for mShape in ml_shapes:
            try:
                mShape.delete()
            except:
                pass
        mMesh_tmp.delete()

    except Exception, err:
        cgmGEN.cgmExceptCB(Exception, err, localDat=vars())
Exemple #6
0
    else:
        _sel = MMCONTEXT.get_list(getTransform=True)
    if not _sel:
        return log.error('Nothing selected')

    if axis == 'between':
        if not len(_sel) >= 2:
            raise ValueError, 'Must have more than two objects selected for between mode'
        try:
            vec = MATH.get_vector_of_two_points(POS.get(_sel[0]),
                                                POS.get(_sel[-1]))
        except Exception, err:
            log.error("Query fail: {0}".format(_sel))
            raise Exception, err
    else:
        vec = MATH.get_obj_vector(_sel[0], axis)
    log.info("Found vector: {0}".format(vec))

    uiFunc_setWorldUp(self, vec[0], vec[1], vec[2])


def uiFunc_setWorldUp(self, x=None, y=None, z=None):
    _base_str = 'uiFF_worldUp'
    #mUI.MelFloatField(_row , ut='cgmUISubTemplate', w= 60 ).setV
    for i, arg in enumerate([x, y, z]):
        if arg is not None:
            mField = self.__dict__['{0}{1}'.format(_base_str,
                                                   'xyz'[i].capitalize())]
            mField.setValue(arg)

Exemple #7
0
        def orientJoint(mJnt):
            try:
                if mJnt not in ml_cull:
                    log.debug("|{0}| >> Aready done: {1}".format(
                        _str_func, mJnt.mNode))
                    return

                log.debug("|{0}| >> Orienting: {1}".format(
                    _str_func, mJnt.mNode))
                mParent = _d_parents[mJnt]
                if mParent and mParent in ml_cull:
                    return
                    log.debug("|{0}| >> Orienting parent: {1}".format(
                        _str_func, mParent.mNode))
                    orientJoint(mParent)

                if mJnt in ml_world:
                    log.debug("|{0}| >> World joint: {1}".format(
                        _str_func, mJnt.mNode))
                    try:
                        axisWorldOrient = SHARED._d_axisToJointOrient[str_aim][
                            str_up]
                    except Exception, err:
                        log.error("{0}>> World axis query. {1} | {2}".format(
                            _str_func, str_aim, str_up))
                        raise Exception, err

                    log.debug("|{0}| >> World joint: {1} | {2}".format(
                        _str_func, mJnt.mNode, axisWorldOrient))
                    mJnt.rotate = 0, 0, 0
                    mJnt.jointOrient = axisWorldOrient[0], axisWorldOrient[
                        1], axisWorldOrient[2]

                elif mJnt not in ml_ends:
                    log.debug("|{0}| >> Reg joint: {1}".format(
                        _str_func, mJnt.mNode))
                    mDup = mJnt.doDuplicate(parentOnly=True)
                    mc.makeIdentity(mDup.mNode, apply=1, jo=1)  #Freeze
                    b_rotFix = False

                    if relativeOrient and mParent:
                        p_child = _d_children[mJnt][0].p_position
                        p_me = mJnt.p_position
                        p_parent = mParent.p_position

                        _axisWorldUp = MATH.get_obj_vector(
                            mParent.mNode, axisUp)
                        _vecToChild = MATH.get_vector_of_two_points(
                            p_child, p_me)
                        _vecToParent = MATH.get_vector_of_two_points(
                            p_me, p_parent)
                        _vecFromParent = MATH.get_vector_of_two_points(
                            p_parent, p_me)

                        _angleVec = MATH.angleBetweenVectors(
                            _axisWorldUp, _vecToChild)
                        #_angle = MATH.angleBetweenVectors(_vecFromParent,_vecToChild)
                        _angle = MATH.angleBetween(p_child, p_me, p_parent)
                        #except:_angle = 0
                        _cross = MATH.dotproduct(_vecToChild, _vecToParent)

                        #pprint.pprint(vars())

                        log.debug(
                            cgmGEN.logString_msg(
                                _str_func,
                                "{0} | vec: {1} | angle: {2} | cross: {3}".
                                format(mJnt.mNode, _angleVec, _angle, _cross)))

                        if _angle > 70:
                            log.warning(
                                cgmGEN.logString_msg(
                                    _str_func,
                                    "{0} | dangerous angles vec: {1} | angle: {2} "
                                    .format(mJnt.mNode, _angleVec, _angle)))
                            #log.info(cgmGEN.logString_msg(_str_func,"dangerous cross: {0} ".format(_cross)))

                            #_axisWorldUp = MATH.get_obj_vector(mParent.mNode, axisBackup)

                            if _cross < 0:
                                _axisWorldUp = [-1 * v for v in _vecToParent]
                            else:
                                pass
                                #_axisWorldUp = _vecToParent
                                #_axisWorldUp = _lastVecUp
                            #v = MATH.transform_direction(

                            b_rotFix = True
                            """
                            if _angleVec < 1.0:
                                _axisWorldUp = MATH.averageVectors(_axisWorldUp,_vecToChild)
                                _axisWorldUp = MATH.averageVectors(_axisWorldUp,worldUpAxis)#.average in the world value
                                log.warning(cgmGEN.logString_msg(_str_func,"To child | postfix: {0} ".format(_axisWorldUp)))
                                
                            else:
                                _vecToParent = MATH.get_vector_of_two_points(p_me, p_parent)                        
                                _axisWorldUp = MATH.averageVectors(_axisWorldUp,_vecToParent)
                                _axisWorldUp = MATH.averageVectors(_axisWorldUp,worldUpAxis)#.average in the world value
                                log.warning(cgmGEN.logString_msg(_str_func,"To parent | postfix: {0} ".format(_axisWorldUp)))"""
                    else:
                        _axisWorldUp = worldUpAxis

                    mDup.rotateOrder = 0
                    SNAP.aim(mDup.mNode, _d_children[mJnt][0].mNode,
                             mAxis_aim.p_vector, mAxis_up.p_vector, 'vector',
                             _axisWorldUp)

                    if b_rotFix:
                        pass
                        """
                        a = 'r{0}'.format(axisAim[0])
                        v = ATTR.get(mDup.mNode,a)                
                        log.warning(cgmGEN.logString_msg(_str_func,"{0} | rotFix | a: {1} | v: {2}".format(mJnt.mNode,a,v)))
            
                        ATTR.set(mDup.mNode,a,90)"""

                    mJnt.rotate = 0, 0, 0
                    mJnt.jointOrient = mDup.p_orient
                    mDup.delete()