Mercurial > hg > Game > Games
comparison Orchestland/Assets/LeapMotion/Widgets/Scripts/Scroll/ScrollBase.cs @ 1:f7675884f2a1
Add Orchestland project
author | Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:09:20 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:347d21cdfc22 | 1:f7675884f2a1 |
---|---|
1 using UnityEngine; | |
2 using System.Collections; | |
3 using LMWidgets; | |
4 | |
5 public class ScrollBase : LeapPhysicsBase { | |
6 public float InteractionScale = 1.0f; | |
7 | |
8 // How strong is the snapping spring. | |
9 public float SnapSpringForce = 100.0f; | |
10 | |
11 // How much drag should be applied ( as a percentage of velocity/second ) | |
12 public float Drag = 5.0f; | |
13 | |
14 // The transform of the root game object of the content to be scrolled. | |
15 public Transform ContentTransform; | |
16 | |
17 // Used to define and top and bottom of the scroll content | |
18 public Transform ContentTopBound; | |
19 public Transform ContentBottomBound; | |
20 | |
21 // Used to define the top and bottom of the scroll container | |
22 public Transform ContainerTopBound; | |
23 public Transform ContainerBottomBound; | |
24 | |
25 // The current velocity of the content. | |
26 protected float m_velocity = 0.0f; | |
27 | |
28 // The dampening force for the edge spring. | |
29 protected float m_dampingForce = 0.0f; | |
30 | |
31 // The location of the scrollable content | |
32 // when interaction began. | |
33 protected Vector3 m_contentPivot; | |
34 | |
35 | |
36 protected virtual void Start () { | |
37 // Set critical dampening force to avoid oscillation. | |
38 m_dampingForce = Mathf.Sqrt(4.0f * SnapSpringForce); | |
39 } | |
40 | |
41 protected override void ResetPivots() { | |
42 base.ResetPivots(); | |
43 m_contentPivot = ContentTransform.localPosition; | |
44 } | |
45 | |
46 protected override void ApplyPhysics() { | |
47 applyOverrunSpringForces(); | |
48 applyDrag(); | |
49 applyVelocity(); | |
50 } | |
51 | |
52 protected void applyDrag() { | |
53 m_velocity -= m_velocity * Mathf.Max(0, Drag * Time.deltaTime); | |
54 } | |
55 | |
56 protected void applyVelocity() { | |
57 Vector3 currentPosition = ContentTransform.localPosition; | |
58 currentPosition.y += m_velocity * Time.deltaTime; | |
59 ContentTransform.localPosition = currentPosition; | |
60 } | |
61 | |
62 /// <summary> | |
63 /// Applies a spring force to velocity to return content to scroller bounds. | |
64 /// </summary> | |
65 protected void applyOverrunSpringForces() { | |
66 float overrunDistance = calculateOverrunMagnitude() * InteractionScale; | |
67 | |
68 if (overrunDistance != 0.0f) { | |
69 float springForce = calculate1DSpringForce(overrunDistance); | |
70 m_velocity += springForce * Time.deltaTime; | |
71 } | |
72 } | |
73 | |
74 // offsetVector is the vector by which the object is offset from the goal | |
75 protected float calculate1DSpringForce(float offsetVector) { | |
76 float springForce = offsetVector * SnapSpringForce; | |
77 float dampingForce = m_dampingForce * (m_velocity); | |
78 return springForce - dampingForce; | |
79 } | |
80 | |
81 // calc the amount and direction (if any) the content has overrun the scroll container. | |
82 protected float calculateOverrunMagnitude() { | |
83 float overrunDistance = 0.0f; | |
84 | |
85 // Put all positions in object space. | |
86 Vector3 localContentTop = transform.InverseTransformPoint(ContentTopBound.position); | |
87 Vector3 localContentBottom = transform.InverseTransformPoint(ContentBottomBound.position); | |
88 Vector3 localContainerTop = transform.InverseTransformPoint(ContainerTopBound.position); | |
89 Vector3 localContainerBottom = transform.InverseTransformPoint(ContainerBottomBound.position); | |
90 | |
91 if (localContentTop.y < localContainerTop.y) { | |
92 overrunDistance = localContainerTop.y - localContentTop.y; | |
93 } | |
94 else if (localContentBottom.y > localContainerBottom.y) { | |
95 overrunDistance = localContainerBottom.y - localContentBottom.y; | |
96 } | |
97 | |
98 return overrunDistance; | |
99 } | |
100 | |
101 protected override void ApplyInteractions() { | |
102 | |
103 Vector3 targetInteractorPositionChange = transform.parent.InverseTransformPoint(m_target.transform.position) - m_targetPivot; | |
104 targetInteractorPositionChange *= InteractionScale; | |
105 targetInteractorPositionChange.x = 0.0f; | |
106 targetInteractorPositionChange.z = 0.0f; | |
107 Vector3 contentCurrentPosition = ContentTransform.localPosition; | |
108 Vector3 newContentPosition = m_contentPivot + targetInteractorPositionChange; | |
109 Vector3 velocity = (newContentPosition - contentCurrentPosition) / Time.deltaTime; | |
110 m_velocity = velocity.y; | |
111 | |
112 ContentTransform.localPosition = newContentPosition; | |
113 } | |
114 | |
115 protected override void ApplyConstraints() { | |
116 return; | |
117 } | |
118 | |
119 } |