public override bool Update()
        {
            if (_animation == null)
            {
                return(false);
            }

            _animatedObject = _animation.animatedTransform;
            if (_animatedObject == null)
            {
                return(false);
            }

            var transform = _animation.transform;

            _targetUp      = transform.up;
            _targetRight   = transform.right;
            _targetForward = transform.forward;

            var min = Vector3.one * float.MaxValue;
            var max = Vector3.one * float.MinValue;

            for (var i = 0; i < _animation.points.Length; i++)
            {
                for (float t = 0; t <= 1.0f; t += 0.05f)
                {
                    var p = Quaternion.Inverse(transform.rotation) * (_animation.GetPositionFromPoint(i, t) - transform.position);
                    min = Vector3.Min(min, p);
                    max = Vector3.Max(max, p);
                }
            }

            var bounds = new Bounds((min + max) / 2, max - min);

            _referenceLength = bounds.extents.y * 2;
            _referenceRadius = Mathf.Sqrt(bounds.extents.x * bounds.extents.x + bounds.extents.z * bounds.extents.z);
            _targetPosition  = transform.position + transform.rotation * (bounds.center + bounds.extents.y * Vector3.up);

            DebugDraw.DrawTransform(_animatedObject, 0.15f);
            DebugDraw.DrawLocalBox(bounds, transform.position, transform.rotation, Color.white);
            DebugDraw.DrawRay(_targetPosition, _targetUp, ReferenceLength, Color.cyan);

            return(true);
        }
示例#2
0
        private void GenerateMotionPointsFromPattern(AnimationPattern pattern, ref List <MotionPoint> points,
                                                     out float outMinY, out float outMaxY)
        {
            outMinY = float.MaxValue;
            outMaxY = float.MinValue;

            points.Clear();
            for (int i = 0; i < pattern.steps.Length; i++)
            {
                MotionPoint point;

                point.Time     = pattern.steps[i].timeStep;
                point.Position = pattern.steps[i].point.position;

                if (_useLocalSpace.val)
                {
                    point.Position = pattern.transform.InverseTransformPoint(point.Position);
                }

                points.Add(point);

                outMaxY = GetMaxPosition(outMaxY, point.Position);
                outMinY = GetMinPosition(outMinY, point.Position);

                if (_includeMidPoints.val)
                {
                    point.Time = pattern.steps[i].timeStep +
                                 pattern.steps[(i + 1) % pattern.steps.Length].transitionToTime * 0.5f;
                    point.Position = pattern.GetPositionFromPoint(i, 0.5f);

                    if (_useLocalSpace.val)
                    {
                        point.Position = pattern.transform.InverseTransformPoint(point.Position);
                    }

                    points.Add(point);

                    outMaxY = GetMaxPosition(outMaxY, point.Position);
                    outMinY = GetMinPosition(outMinY, point.Position);
                }
            }
        }