protected override bool connectObjectAndConstraint(MDGModifier modifier)
        {
            MObject transform = transformObject();
            if ( transform.isNull )
            {
                throw new InvalidOperationException("Failed to get transformObject()");
            }

            MFnTransform transformFn = new MFnTransform(transform);
            MVector translate = transformFn.getTranslation(MSpace.Space.kTransform);
            MPlug translatePlug = transformFn.findPlug("translate");

            if (MPlug.FreeToChangeState.kFreeToChange == translatePlug.isFreeToChange())
            {
                MFnNumericData nd = new MFnNumericData();

                MObject translateData = nd.create(MFnNumericData.Type.k3Double);
                nd.setData3Double(translate.x, translate.y, translate.z);
                modifier.newPlugValue(translatePlug, translateData);
                connectObjectAttribute(MPxTransform.geometry, GeometrySurfaceConstraint.constraintGeometry, false);
            }

            connectObjectAttribute(MPxTransform.parentInverseMatrix, GeometrySurfaceConstraint.constraintParentInverseMatrix, true, true);

            return true;
        }
Beispiel #2
0
        protected override bool connectObjectAndConstraint(MDGModifier modifier)
        {
            MObject transform = transformObject();

            if (transform.isNull)
            {
                throw new InvalidOperationException("Failed to get transformObject()");
            }

            MFnTransform transformFn   = new MFnTransform(transform);
            MVector      translate     = transformFn.getTranslation(MSpace.Space.kTransform);
            MPlug        translatePlug = transformFn.findPlug("translate");

            if (MPlug.FreeToChangeState.kFreeToChange == translatePlug.isFreeToChange())
            {
                MFnNumericData nd = new MFnNumericData();

                MObject translateData = nd.create(MFnNumericData.Type.k3Double);
                nd.setData3Double(translate.x, translate.y, translate.z);
                modifier.newPlugValue(translatePlug, translateData);
                connectObjectAttribute(MPxTransform.geometry, GeometrySurfaceConstraint.constraintGeometry, false);
            }

            connectObjectAttribute(MPxTransform.parentInverseMatrix, GeometrySurfaceConstraint.constraintParentInverseMatrix, true, true);

            return(true);
        }
Beispiel #3
0
        public static List <MDagPath> AddBonesCTL(MSelectionList jointList = null, MFnTransform parentTrans = null)
        {
            if (jointList == null)
            {
                jointList = BasicFunc.GetSelectedList();
            }
            if (parentTrans == null)
            {
                parentTrans = new MFnTransform(BasicFunc.CreateEmptyGroup("grp_bonesCTL"));
            }
            if (jointList.length == 0)
            {
                return(null);
            }
            List <MDagPath> jointDags = new List <MDagPath>();

            for (int i = 0; i < jointList.length; i++)
            {
                MDagPath dag = new MDagPath();
                jointList.getDagPath((uint)i, dag);
                jointDags.Add(dag);
            }
            int count = jointDags.Count;

            MFnTransform[] jointTrans       = new MFnTransform[count];
            MFnTransform[] jointParentTrans = new MFnTransform[count];
            for (int i = 0; i < jointDags.Count; i++)
            {
                jointTrans[i]       = new MFnTransform(jointDags[i]);
                jointParentTrans[i] = new MFnTransform(MDagPath.getAPathTo(jointTrans[i].parent(0)));
            }
            MVector[] jointWorldPositions = new MVector[jointDags.Count];
            MVector   centerPos           = MVector.zero;

            for (int i = 0; i < count; i++)
            {
                jointWorldPositions[i] = jointTrans[i].getTranslation(MSpace.Space.kWorld);
                centerPos += jointWorldPositions[i];
            }
            centerPos = centerPos * (1.0f / count);

            double[] minDist_y = new double[count];
            double[] minDist_x = new double[count];

            if (count > 1)
            {
                for (int i = 0; i < count; i++)
                {
                    double closestY = double.MaxValue, closestX = double.MaxValue;
                    //int minDistIndex = 0;

                    for (int j = 0; j < count; j++)
                    {
                        if (i == j)
                        {
                            continue;
                        }
                        MVector direct = jointWorldPositions[i] - jointWorldPositions[j];
                        direct.x = Math.Abs(direct.x);
                        direct.y = Math.Abs(direct.y);
                        if (direct.x >= direct.y)
                        {
                            if (direct.x < closestX)
                            {
                                closestX = direct.x;
                                //minDistIndex = j;
                            }
                        }
                        if (direct.y >= direct.x)
                        {
                            if (direct.y < closestY)
                            {
                                closestY = direct.y;
                            }
                        }
                    }
                    minDist_y[i] = closestY;
                    minDist_x[i] = closestX;
                }
            }
            else
            {
                minDist_x[0] = 1;
                minDist_y[0] = 1;
            }


            List <MDagPath> curves = new List <MDagPath>();

            for (int i = 0; i < count; i++)
            {
                float        width = (float)minDist_x[i] / 2, height = (float)minDist_y[i] / 2;
                MDagPath     curve      = BasicFunc.CreateCTL_Square("ctl_" + jointDags[i].partialPathName, height, width);
                MFnTransform curveTrans = new MFnTransform(curve);
                BasicFunc.SetTransformParent(curveTrans, parentTrans);
                curveTrans.setTranslation(jointWorldPositions[i] - centerPos, MSpace.Space.kTransform);
                BasicFunc.FreezeTransform(curveTrans);
                BasicFunc.SetTranslateLimit(curveTrans, -width / 2, -height / 2, 0, width / 2, height / 2, 0);

                MPlug plug_curveTX = curveTrans.findPlug(ConstantValue.plugName_tx);
                MPlug plug_curveTY = curveTrans.findPlug(ConstantValue.plugName_ty);
                MPlug plug_jointRY = jointParentTrans[i].findPlug(ConstantValue.plugName_ry);
                MPlug plug_jointRZ = jointParentTrans[i].findPlug(ConstantValue.plugName_rz);
                BindAttr.ProjectPlug(plug_curveTX, plug_jointRY, -width / 2, width / 2, -45, 45);
                BindAttr.ProjectPlug(plug_curveTY, plug_jointRZ, -height / 2, height / 2, -45, 45);
                curves.Add(curve);
            }
            return(curves);
        }