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); }
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); } } }