public override void OnNewPosesApplied() { base.OnNewPosesApplied(); if (IsAttached == true) { Quaternion RotationDelta; Vector3 PositionDelta; float angle; Vector3 axis; if (InteractionPoint != null) { RotationDelta = AttachedHand.transform.rotation * Quaternion.Inverse(InteractionPoint.rotation); PositionDelta = (AttachedHand.transform.position - InteractionPoint.position); } else { RotationDelta = PickupTransform.rotation * Quaternion.Inverse(this.transform.rotation); PositionDelta = (PickupTransform.position - this.transform.position); } RotationDelta.ToAngleAxis(out angle, out axis); if (angle > 180) { angle -= 360; } if (angle != 0) { Vector3 AngularTarget = angle * axis; this.Rigidbody.angularVelocity = Vector3.MoveTowards(this.Rigidbody.angularVelocity, AngularTarget, 10f * (deltaPoses * 1000)); } Vector3 VelocityTarget = PositionDelta / deltaPoses; this.Rigidbody.velocity = Vector3.MoveTowards(this.Rigidbody.velocity, VelocityTarget, 10f); } }
protected override void FixedUpdate() { base.FixedUpdate(); if (IsAttached == true) { Vector3 PositionDelta; Quaternion RotationDelta; float angle; Vector3 axis; if (InteractionPoint != null) { RotationDelta = AttachedHand.transform.rotation * Quaternion.Inverse(InteractionPoint.rotation); PositionDelta = (AttachedHand.transform.position - InteractionPoint.position); } else { RotationDelta = PickupTransform.rotation * Quaternion.Inverse(this.transform.rotation); PositionDelta = (PickupTransform.position - this.transform.position); } RotationDelta.ToAngleAxis(out angle, out axis); if (angle > 180) { angle -= 360; } if (angle != 0) { this.Rigidbody.angularVelocity = (Time.fixedDeltaTime * angle * axis) * AttachedRotationMagic; } this.Rigidbody.velocity = PositionDelta * AttachedPositionMagic * Time.fixedDeltaTime; } }
private void Movement() { Vector3 PositionDelta; Quaternion RotationDelta; float angle; Vector3 axis; RotationDelta = Hand.transform.rotation * Quaternion.Inverse(PhysicalController.transform.rotation); PositionDelta = (Hand.transform.position - PhysicalController.transform.position); RotationDelta.ToAngleAxis(out angle, out axis); if (angle != 0) { Vector3 AngularTarget = (Time.fixedDeltaTime * angle * axis) * AttachedRotationMagic; this.Rigidbody.angularVelocity = Vector3.MoveTowards(this.Rigidbody.angularVelocity, AngularTarget, 10f); } Vector3 VelocityTarget = PositionDelta * AttachedPositionMagic * Time.fixedDeltaTime; this.Rigidbody.velocity = Vector3.MoveTowards(this.Rigidbody.velocity, VelocityTarget, 10f); }
protected virtual void FixedUpdate() { if (IsAttached == true) { CheckForDrop(); Quaternion RotationDelta; Vector3 PositionDelta; float angle; Vector3 axis; if (InteractionPoint != null) { RotationDelta = AttachedHand.transform.rotation * Quaternion.Inverse(InteractionPoint.rotation); PositionDelta = (AttachedHand.transform.position - InteractionPoint.position); } else { RotationDelta = PickupTransform.rotation * Quaternion.Inverse(this.transform.rotation); PositionDelta = (PickupTransform.position - this.transform.position); } RotationDelta.ToAngleAxis(out angle, out axis); if (angle > 180) { angle -= 360; } if (angle != 0) { Vector3 AngularTarget = angle * axis; if (float.IsNaN(AngularTarget.x) == false) { AngularTarget = (AngularTarget * AngularVelocityMagic) * Time.fixedDeltaTime; this.Rigidbody.angularVelocity = Vector3.MoveTowards(this.Rigidbody.angularVelocity, AngularTarget, MaxAngularVelocityChange); } } Vector3 VelocityTarget = (PositionDelta * VelocityMagic) * Time.fixedDeltaTime; if (float.IsNaN(VelocityTarget.x) == false) { this.Rigidbody.velocity = Vector3.MoveTowards(this.Rigidbody.velocity, VelocityTarget, MaxVelocityChange); } AddExternalVelocities(); if (VelocityHistory != null) { CurrentVelocityHistoryStep++; if (CurrentVelocityHistoryStep >= VelocityHistory.Length) { CurrentVelocityHistoryStep = 0; } VelocityHistory[CurrentVelocityHistoryStep] = this.Rigidbody.velocity; AngularVelocityHistory[CurrentVelocityHistoryStep] = this.Rigidbody.angularVelocity; } } }