view Orchestland/Assets/LeapMotion/Widgets/Scripts/Physics/LeapPhysicsSpring.cs @ 3:0030a1b971fb default tip

merge
author Yuta ANSE <e135745@ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2015 23:23:43 +0900
parents f7675884f2a1
children
line wrap: on
line source

using UnityEngine;

namespace LMWidgets
{
  /// <summary>
  /// Base class for spring. Restrains the widget in its local z-axis.
  /// It will apply spring physics in ApplyPhysics and translate the button with hand in ApplyInteractions
  /// </summary>
  public abstract class LeapPhysicsSpring : LeapPhysicsBase
  {
    /// <summary>
    /// Spring constant is separated to xyz-axis for more flexible configuration
    /// </summary>
    public Vector3 springCoefficient = Vector3.one * 10.0f;
    public bool applyCriticalDamping = true;

    private Vector3 m_dampingCoefficient = Vector3.zero;
    private Vector3 m_interactionConstraints = Vector3.one;

    /// <summary>
    /// Applies Interaction constraints. Takes in a Vector3. If an axis has value > 0.5 then it's allowed to move. Otherwise it won't be
    /// </summary>
    /// <param name="interactionConstraints"></param>
    protected void ApplyInteractionConstraints(Vector3 interactionConstraints)
    {
      interactionConstraints.x = (interactionConstraints.x > 0.5f) ? 1.0f : 0.0f;
      interactionConstraints.y = (interactionConstraints.y > 0.5f) ? 1.0f : 0.0f;
      interactionConstraints.z = (interactionConstraints.z > 0.5f) ? 1.0f : 0.0f;
      m_interactionConstraints = interactionConstraints;
      ResetPivots();
    }

    /// <summary>
    /// Apply spring physics
    /// </summary>
    protected override void ApplyPhysics()
    {
      Vector3 springForce = Vector3.Scale(-springCoefficient, transform.localPosition);
      Vector3 dampingForce = Vector3.zero;

      if (applyCriticalDamping)
      {
        Vector3 instantVelocity = springForce * Time.deltaTime;
        dampingForce = Vector3.Scale(-m_dampingCoefficient, instantVelocity);
      }
      transform.localPosition += (springForce + dampingForce) * Time.deltaTime;
    }

    /// <summary>
    /// Translate the widget with the hand during interaction
    /// </summary>
    protected override void ApplyInteractions()
    {
      Vector3 displacement = Vector3.Scale(transform.parent.InverseTransformPoint(m_target.transform.position) - m_targetPivot, m_interactionConstraints);
      transform.localPosition = displacement + m_pivot;
    }

    protected override void Awake()
    {
      base.Awake();
      Vector3 k = springCoefficient;
      m_dampingCoefficient = 2 * new Vector3(Mathf.Sqrt(k.x), Mathf.Sqrt(k.y), Mathf.Sqrt(k.z));
    }
  }
}