-
Notifications
You must be signed in to change notification settings - Fork 166
Expand file tree
/
Copy pathMoveAxisConstraint.cs
More file actions
107 lines (96 loc) · 3.7 KB
/
Copy pathMoveAxisConstraint.cs
File metadata and controls
107 lines (96 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright (c) Mixed Reality Toolkit Contributors
// Licensed under the BSD 3-Clause
using Unity.XR.CoreUtils.GUI;
using UnityEngine;
namespace MixedReality.Toolkit.SpatialManipulation
{
/// <summary>
/// Component for limiting the translation axes for ObjectManipulator
/// or BoundsControl.
/// </summary>
/// <remarks>
/// MRTK's constraint system might be redesigned in the near future. When
/// this occurs, the old constraint components will be deprecated.
/// </remarks>
[AddComponentMenu("MRTK/Spatial Manipulation/Move Axis Constraint")]
public class MoveAxisConstraint : TransformConstraint
{
#region Properties
[SerializeField, FlagsProperty]
[Tooltip("Constrain movement along an axis")]
private AxisFlags constraintOnMovement = 0;
/// <summary>
/// Constrain movement along an axis
/// </summary>
public AxisFlags ConstraintOnMovement
{
get => constraintOnMovement;
set => constraintOnMovement = value;
}
[SerializeField]
[Tooltip("Relative to rotation at manipulation start or world")]
private bool useLocalSpaceForConstraint = false;
/// <summary>
/// Relative to rotation at manipulation start or world
/// </summary>
public bool UseLocalSpaceForConstraint
{
get => useLocalSpaceForConstraint;
set => useLocalSpaceForConstraint = value;
}
/// <inheritdoc />
public override TransformFlags ConstraintType => TransformFlags.Move;
#endregion Properties
#region Public Methods
/// <summary>
/// Removes movement along a given axis if its flag is found
/// in ConstraintOnMovement
/// </summary>
public override void ApplyConstraint(ref MixedRealityTransform transform)
{
Quaternion inverseRotation = Quaternion.Inverse(WorldPoseOnManipulationStart.Rotation);
Vector3 position = transform.Position;
if (constraintOnMovement.IsMaskSet(AxisFlags.XAxis))
{
if (useLocalSpaceForConstraint)
{
position = inverseRotation * position;
position.x = (inverseRotation * WorldPoseOnManipulationStart.Position).x;
position = WorldPoseOnManipulationStart.Rotation * position;
}
else
{
position.x = WorldPoseOnManipulationStart.Position.x;
}
}
if (constraintOnMovement.IsMaskSet(AxisFlags.YAxis))
{
if (useLocalSpaceForConstraint)
{
position = inverseRotation * position;
position.y = (inverseRotation * WorldPoseOnManipulationStart.Position).y;
position = WorldPoseOnManipulationStart.Rotation * position;
}
else
{
position.y = WorldPoseOnManipulationStart.Position.y;
}
}
if (constraintOnMovement.IsMaskSet(AxisFlags.ZAxis))
{
if (useLocalSpaceForConstraint)
{
position = inverseRotation * position;
position.z = (inverseRotation * WorldPoseOnManipulationStart.Position).z;
position = WorldPoseOnManipulationStart.Rotation * position;
}
else
{
position.z = WorldPoseOnManipulationStart.Position.z;
}
}
transform.Position = position;
}
#endregion Public Methods
}
}