Example #1
0
 public SPCRJointDynamicsConstraint(ConstraintType Type, SPCRJointDynamicsPoint PointA, SPCRJointDynamicsPoint PointB)
 {
     _Type   = Type;
     _PointA = PointA;
     _PointB = PointB;
     UpdateLength();
 }
Example #2
0
    void CreationConstraintBendingVertical(
        SPCRJointDynamicsPoint Point,
        ref List <SPCRJointDynamicsConstraint> ConstraintList)
    {
        if (Point.transform.childCount != 1)
        {
            return;
        }
        var childA = Point.transform.GetChild(0);

        if (childA.childCount != 1)
        {
            return;
        }
        var childB = childA.transform.GetChild(0);

        var childPointB = childB.GetComponent <SPCRJointDynamicsPoint>();

        if (childPointB != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Bending_Vertical,
                                   Point,
                                   childPointB));
        }

        var childPointA = childA.GetComponent <SPCRJointDynamicsPoint>();

        if (childPointA != null)
        {
            CreationConstraintBendingVertical(childPointA, ref ConstraintList);
        }
    }
    void SubdivideVerticalChain(SPCRJointDynamicsController controller, int NumInsert)
    {
        var rnd              = new System.Random();
        var RootList         = new List <SPCRJointDynamicsPoint>(controller._RootPointTbl);
        var OriginalPoints   = controller._SubDivOriginalPoints;
        var InsertedPoints   = controller._SubDivInsertedPoints;
        var IsFirstSubdivide = (OriginalPoints.Count == 0);

        foreach (var rootPoint in RootList)
        {
            if (IsFirstSubdivide)
            {
                OriginalPoints.Add(rootPoint);
            }

            var parentPoint = rootPoint;

            while (parentPoint.transform.childCount > 0)
            {
                var parentTransform = parentPoint.transform;

                var points = parentTransform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                if (points.Length < 2)
                {
                    break;
                }

                var childPoint = points[1];

                if (parentPoint == childPoint)
                {
                    Debug.LogWarning("Infinite Loop!:" + parentPoint.name);
                    break;
                }

                if (IsFirstSubdivide)
                {
                    OriginalPoints.Add(childPoint);
                }

                var childTransform = childPoint.transform;

                SPCRJointDynamicsPoint newPoint = null;
                for (int i = 1; i <= NumInsert; i++)
                {
                    float weight = i / (NumInsert + 1.0f);

                    newPoint = CreateInterpolatedPoint(parentPoint, childPoint, weight, "VSubdiv_" + rnd.Next());
                    InsertedPoints.Add(newPoint);

                    newPoint.transform.SetParent(parentTransform);
                    parentTransform = newPoint.transform;
                }
                childTransform.SetParent(newPoint.transform);

                parentPoint = childPoint;
            }
        }
    }
        public static SPCRJointDynamicsConstraint Create(
            ConstraintType Type, SPCRJointDynamicsPoint PointA, SPCRJointDynamicsPoint PointB)
        {
            var result = new SPCRJointDynamicsConstraint(Type, PointA, PointB);

            result.UpdateLength();
            return(result);
        }
    SPCRJointDynamicsPoint CreateInterpolatedPoint(SPCRJointDynamicsPoint point0, SPCRJointDynamicsPoint point1, float weight0, string newName = "SubDivPoint")
    {
        var Transform0   = point0.transform;
        var Transform1   = point1.transform;
        var pos          = Vector3.Lerp(Transform0.position, Transform1.position, weight0);
        var rot          = Quaternion.Slerp(Transform0.rotation, Transform1.rotation, weight0);
        var obj          = new GameObject(newName);
        var newPoint     = obj.AddComponent <SPCRJointDynamicsPoint>();
        var objTransform = obj.transform;

        objTransform.position = pos;
        objTransform.rotation = rot;
        return(newPoint);
    }
Example #6
0
 public SPCRJointDynamicsPoint GetChildJointDynamicsPoint(SPCRJointDynamicsPoint Parent)
 {
     if (Parent != null)
     {
         for (int i = 0; i < Parent.transform.childCount; ++i)
         {
             var child = Parent.transform.GetChild(i).GetComponent <SPCRJointDynamicsPoint>();
             if (child != null)
             {
                 return(child);
             }
         }
     }
     return(null);
 }
Example #7
0
    void ComputePointParameter(SPCRJointDynamicsPoint Point, int Depth)
    {
        _MaxPointDepth = Mathf.Max(_MaxPointDepth, Depth);

        Point._Depth   = (float)Depth;
        Point._IsFixed = Point._Depth == 0;

        for (int i = 0; i < Point.transform.childCount; ++i)
        {
            var ChildPoint = Point.transform.GetChild(i).gameObject.GetComponent <SPCRJointDynamicsPoint>();
            if (ChildPoint != null)
            {
                ComputePointParameter(ChildPoint, Depth + 1);
            }
        }
    }
Example #8
0
    void CreationConstraintBendingHorizontal(
        SPCRJointDynamicsPoint PointA,
        SPCRJointDynamicsPoint PointB,
        ref List <SPCRJointDynamicsConstraint> ConstraintList)
    {
        if ((PointA == null) || (PointB == null))
        {
            return;
        }
        if (PointA == PointB)
        {
            return;
        }

        var childPointA = GetChildJointDynamicsPoint(PointA);
        var childPointB = GetChildJointDynamicsPoint(PointB);

        if ((childPointA != null) && (childPointB != null))
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Bending_Horizontal,
                                   childPointA,
                                   childPointB));

            CreationConstraintHorizontal(childPointA, childPointB, ref ConstraintList);
        }
        else if ((childPointA != null) && (childPointB == null))
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Bending_Horizontal,
                                   childPointA,
                                   PointB));
        }
        else if ((childPointA == null) && (childPointB != null))
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Bending_Horizontal,
                                   PointA,
                                   childPointB));
        }
    }
Example #9
0
    void CreateConstraintStructuralVertical(SPCRJointDynamicsPoint Point, ref List <SPCRJointDynamicsConstraint> ConstraintList)
    {
        for (int i = 0; i < Point.transform.childCount; ++i)
        {
            var child       = Point.transform.GetChild(i);
            var child_point = child.gameObject.GetComponent <SPCRJointDynamicsPoint>();
            if (child_point != null)
            {
                Point._RefChildPoint = child_point;
                var LocalPosition = Point.transform.InverseTransformPoint(Point._RefChildPoint.transform.position);
                Point._BoneAxis = LocalPosition.normalized;

                ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                       ConstraintType.Structural_Vertical,
                                       Point,
                                       child_point));

                CreateConstraintStructuralVertical(child_point, ref ConstraintList);
            }
        }
    }
Example #10
0
    void CreationConstraintShear(
        SPCRJointDynamicsPoint PointA,
        SPCRJointDynamicsPoint PointB,
        ref List <SPCRJointDynamicsConstraint> ConstraintList)
    {
        if ((PointA == null) || (PointB == null))
        {
            return;
        }
        if (PointA == PointB)
        {
            return;
        }

        var childPointA  = GetChildJointDynamicsPoint(PointA);
        var childPointB  = GetChildJointDynamicsPoint(PointB);
        var childPointA2 = GetChildJointDynamicsPoint(childPointA);
        var childPointB2 = GetChildJointDynamicsPoint(childPointB);
        var childPointA3 = GetChildJointDynamicsPoint(childPointA2);
        var childPointB3 = GetChildJointDynamicsPoint(childPointB2);

        if (childPointA != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   childPointA,
                                   PointB));
        }
        else if (childPointA2 != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   childPointA2,
                                   PointB));
        }
        else if (childPointA3 != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   childPointA3,
                                   PointB));
        }

        if (childPointB != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   PointA,
                                   childPointB));
        }
        else if (childPointB2 != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   PointA,
                                   childPointB2));
        }
        else if (childPointB3 != null)
        {
            ConstraintList.Add(new SPCRJointDynamicsConstraint(
                                   ConstraintType.Shear,
                                   PointA,
                                   childPointB3));
        }
        CreationConstraintShear(childPointA, childPointB, ref ConstraintList);
    }
 public SPCRJointDynamicsConstraint(ConstraintType Type, SPCRJointDynamicsPoint PointA, SPCRJointDynamicsPoint PointB)
 => (_Type, _PointA, _PointB) = (Type, PointA, PointB);
    void SubdivideHorizontalChain(SPCRJointDynamicsController controller, int NumInsert)
    {
        var rnd              = new System.Random();
        var RootList         = new List <SPCRJointDynamicsPoint>(controller._RootPointTbl);
        var OriginalPoints   = controller._SubDivOriginalPoints;
        var InsertedPoints   = controller._SubDivInsertedPoints;
        var IsFirstSubdivide = (OriginalPoints.Count == 0);

        int Count = RootList.Count;
        int Start = controller._IsLoopRootPoints ? Count : (Count - 1);

        for (int iroot = Start; iroot > 0; iroot--)
        {
            var root0 = RootList[iroot % Count];
            var root1 = RootList[iroot - 1];

            for (int iin = 1; iin <= NumInsert; iin++)
            {
                var point0          = root0;
                var point1          = root1;
                var parentTransform = root0.transform.parent;

                float weight = iin / (NumInsert + 1.0f);
                SPCRJointDynamicsPoint newRoot = null;

                while (point0 != null && point1 != null)
                {
                    if (IsFirstSubdivide && iin == 1)
                    {
                        if (!controller._IsLoopRootPoints && iroot == Start)
                        {
                            OriginalPoints.Add(point0);
                        }
                        OriginalPoints.Add(point1);
                    }

                    var newPoint = CreateInterpolatedPoint(point0, point1, weight, "HSubdiv_" + rnd.Next());
                    InsertedPoints.Add(newPoint);

                    var newTransform = newPoint.transform;
                    newTransform.SetParent(parentTransform);
                    parentTransform = newTransform;

                    SPCRJointDynamicsPoint[] points;

                    points = point0.transform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                    point0 = (points.Length > 1) ? points[1] : null;

                    points = point1.transform.GetComponentsInChildren <SPCRJointDynamicsPoint>();
                    point1 = (points.Length > 1) ? points[1] : null;

                    if (newRoot == null)
                    {
                        newRoot = newPoint;
                        RootList.Insert(iroot, newRoot);
                    }
                }
            }
        }
        controller._RootPointTbl = RootList.ToArray();
    }