示例#1
0
 /// <summary>
 /// Prepare the transform for manipulation.
 /// </summary>
 public void Reset(Transform link)
 {
     Change = Quaternion.identity;
     Link   = link;
     Parent = null;
     Child  = null;
 }
示例#2
0
 public IK()
 {
     for (int i = 0; i < _transforms.Length; i++)
     {
         _transforms[i] = new IKTransform();
     }
 }
示例#3
0
 private void findBone(IKTransform transform, ref int last)
 {
     for (int i = last - 1; i >= 0; i--)
     {
         if (transform.Link == Bones[i].Transform)
         {
             Bones[i].Link = transform;
             last          = i;
             break;
         }
     }
 }
示例#4
0
        /// <summary>
        /// Remember original transformations of all bones.
        /// </summary>
        private bool prepareTransforms()
        {
            if (Bones.Length == 0 || Target == null)
            {
                return(false);
            }

            for (int i = 0; i < Bones.Length; i++)
            {
                Bones[i].Link = null;
            }

            var transformIndex = 0;

            _target = _transforms[transformIndex++];
            _target.Reset(Target);

            int lastBone = Bones.Length;

            findBone(_target, ref lastBone);

            var transform = Target.parent;
            var current   = _target;

            while (transform != null && lastBone > 0)
            {
                var parentNode = _transforms[transformIndex++];
                parentNode.Reset(transform);

                findBone(parentNode, ref lastBone);

                current.Parent   = parentNode;
                parentNode.Child = current;

                transform = transform.parent;
                current   = parentNode;
            }

            current.Calc();

            return(true);
        }
示例#5
0
 public IKBone(Transform transform, float weight)
 {
     Transform = transform;
     Weight    = weight;
     Link      = null;
 }