public override void ProcessFrame(Playable playable, FrameData info, object playerData) { Transform binding = playerData as Transform; if (binding == null) { return; } int inputCount = playable.GetInputCount(); if (inputCount == 0) { return; } float totalWeight = 0; Vector3 position = new Vector3(); Quaternion rotation = new Quaternion(); Vector3 scale = new Vector3(); for (int i = 0; i < inputCount; i++) { var inputPlayable = (ScriptPlayable <EZTransformConstraintBehaviour>)playable.GetInput(i); var inputBehaviour = inputPlayable.GetBehaviour(); if (inputBehaviour.target == null) { continue; } float inputWeight = playable.GetInputWeight(i); if (inputWeight == 0) { continue; } totalWeight += inputWeight; position += inputBehaviour.target.position * inputWeight; rotation = QuaternionExt.Cumulate(rotation, inputBehaviour.target.rotation.Scale(inputWeight)); scale += inputBehaviour.target.lossyScale * inputWeight; } if (totalWeight < 1e-5) { return; } if (positionConstraint) { binding.position = position / totalWeight; } if (rotationConstraint) { binding.rotation = rotation; } if (scaleConstraint) { binding.localScale = scale / totalWeight; } }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { Transform binding = playerData as Transform; if (binding == null) { return; } int inputCount = playable.GetInputCount(); if (inputCount == 0) { return; } float totalWeight = 0; Quaternion outputRotation = new Quaternion(); for (int i = 0; i < inputCount; i++) { var inputPlayable = (ScriptPlayable <EZTransformConstraintBehaviour>)playable.GetInput(i); var inputBehaviour = inputPlayable.GetBehaviour(); if (inputBehaviour.target == null) { continue; } float inputWeight = playable.GetInputWeight(i); if (inputWeight == 0) { continue; } totalWeight += inputWeight; outputRotation = QuaternionExt.Cumulate(outputRotation, inputBehaviour.target.rotation.Scale(inputWeight)); } if (totalWeight < 1e-5) { return; } binding.rotation = outputRotation; }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { Transform targetTransform = playerData as Transform; if (targetTransform == null) { return; } Vector3 originalPosition = targetTransform.position; Quaternion originalRotation = targetTransform.rotation; Vector3 originalScale = targetTransform.localScale; Vector3 outputPosition = Vector3.zero; Quaternion outputRotation = new Quaternion(0f, 0f, 0f, 0f); Vector3 outputScale = Vector3.zero; float positionWeight = 0f; float rotationWeight = 0f; float scaleWeight = 0f; int inputCount = playable.GetInputCount(); for (int i = 0; i < inputCount; i++) { ScriptPlayable <EZTransformTweenBehaviour> inputPlayable = (ScriptPlayable <EZTransformTweenBehaviour>)playable.GetInput(i); EZTransformTweenBehaviour inputBehaviour = inputPlayable.GetBehaviour(); float inputWeight = playable.GetInputWeight(i); if (!started && !inputBehaviour.startPoint) { inputBehaviour.startPosition = originalPosition; inputBehaviour.startRotation = originalRotation; inputBehaviour.startScale = originalScale; } float normalizedTime = (float)(inputPlayable.GetTime() / inputPlayable.GetDuration()); float process = inputBehaviour.curve.Evaluate(normalizedTime); if (inputBehaviour.tweenPosition && inputBehaviour.endPoint != null) { positionWeight += inputWeight; outputPosition += Vector3.Lerp(inputBehaviour.startPosition, inputBehaviour.endPoint.position, process) * inputWeight; } if (inputBehaviour.tweenRotation) { if (inputBehaviour.endPoint != null) { rotationWeight += inputWeight; Quaternion targetRotation = Quaternion.Lerp(inputBehaviour.startRotation, inputBehaviour.endPoint.rotation, process); outputRotation = QuaternionExt.Cumulate(outputRotation, targetRotation.Scale(inputWeight)); } } if (inputBehaviour.tweenScale && inputBehaviour.endPoint != null) { scaleWeight += inputWeight; outputScale += Vector3.Lerp(inputBehaviour.startScale, inputBehaviour.endPoint.localScale, process) * inputWeight; } } if (positionWeight > 1e-5) { targetTransform.position = outputPosition + originalPosition * (1f - positionWeight); } if (rotationWeight > 1e-5) { targetTransform.rotation = QuaternionExt.Cumulate(outputRotation, originalRotation.Scale(1f - rotationWeight)); } if (scaleWeight > 1e-5) { targetTransform.localScale = outputScale + originalScale * (1f - scaleWeight); } started = true; }