diff --git a/Assets/VRM10/Runtime/Components/Constraint/ConstraintAxes.cs b/Assets/VRM10/Runtime/Components/Constraint/ConstraintAxes.cs
index 8229db85b..f2e1165a1 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/ConstraintAxes.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/ConstraintAxes.cs
@@ -7,7 +7,7 @@ namespace UniVRM10
/// FreezeAxesで使う。bitマスク
///
[Flags]
- public enum AxesMask
+ public enum AxisMask
{
X = 1,
Y = 2,
@@ -16,17 +16,17 @@ namespace UniVRM10
public static class AxesMaskExtensions
{
- public static Vector3 Freeze(this AxesMask mask, Vector3 src)
+ public static Vector3 Freeze(this AxisMask mask, Vector3 src)
{
- if (mask.HasFlag(AxesMask.X))
+ if (mask.HasFlag(AxisMask.X))
{
src.x = 0;
}
- if (mask.HasFlag(AxesMask.Y))
+ if (mask.HasFlag(AxisMask.Y))
{
src.y = 0;
}
- if (mask.HasFlag(AxesMask.Z))
+ if (mask.HasFlag(AxisMask.Z))
{
src.z = 0;
}
diff --git a/Assets/VRM10/Runtime/Components/Constraint/ConstraintDestination.cs b/Assets/VRM10/Runtime/Components/Constraint/ConstraintDestination.cs
index 4cca644dc..57478bba3 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/ConstraintDestination.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/ConstraintDestination.cs
@@ -1,33 +1,28 @@
using System;
+using UniGLTF.Extensions.VRMC_constraints;
using UnityEngine;
namespace UniVRM10
{
- public enum DestinationCoordinates
- {
- World,
- Local,
- }
-
class ConstraintDestination
{
readonly Transform m_transform;
- readonly DestinationCoordinates m_coords;
+ readonly ObjectSpace m_coords;
readonly TRS m_initial;
- public ConstraintDestination(Transform t, DestinationCoordinates coords)
+ public ConstraintDestination(Transform t, ObjectSpace coords)
{
m_transform = t;
m_coords = coords;
switch (m_coords)
{
- case DestinationCoordinates.World:
- m_initial = TRS.GetWorld(t);
- break;
+ // case ObjectSpace.World:
+ // m_initial = TRS.GetWorld(t);
+ // break;
- case DestinationCoordinates.Local:
+ case ObjectSpace.local:
m_initial = TRS.GetLocal(t);
break;
@@ -41,11 +36,11 @@ namespace UniVRM10
var value = m_initial.Translation + delta * weight;
switch (m_coords)
{
- case DestinationCoordinates.World:
- m_transform.position = value;
- break;
+ // case DestinationCoordinates.World:
+ // m_transform.position = value;
+ // break;
- case DestinationCoordinates.Local:
+ case ObjectSpace.local:
m_transform.localPosition = value;
break;
@@ -60,11 +55,11 @@ namespace UniVRM10
var value = Quaternion.LerpUnclamped(Quaternion.identity, delta, weight) * m_initial.Rotation;
switch (m_coords)
{
- case DestinationCoordinates.World:
- m_transform.rotation = value;
- break;
+ // case DestinationCoordinates.World:
+ // m_transform.rotation = value;
+ // break;
- case DestinationCoordinates.Local:
+ case ObjectSpace.local:
m_transform.localRotation = value;
break;
diff --git a/Assets/VRM10/Runtime/Components/Constraint/ConstraintSource.cs b/Assets/VRM10/Runtime/Components/Constraint/ConstraintSource.cs
index a74ca1db3..3101adf18 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/ConstraintSource.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/ConstraintSource.cs
@@ -1,33 +1,16 @@
using UnityEngine;
using System;
+using UniGLTF.Extensions.VRMC_constraints;
namespace UniVRM10
{
- public enum SourceCoordinates
- {
- ///
- /// ワールド座標
- ///
- World,
-
- ///
- /// モデルルート(指定のTransform)ローカル座標
- ///
- Model,
-
- ///
- /// m_transform ローカル座標
- ///
- Local,
- }
-
class ConstraintSource
{
readonly Transform m_modelRoot;
readonly Transform m_transform;
- readonly SourceCoordinates m_coords;
+ readonly ObjectSpace m_coords;
readonly TRS m_initial;
@@ -37,9 +20,9 @@ namespace UniVRM10
{
switch (m_coords)
{
- case SourceCoordinates.World: return m_transform.position - m_initial.Translation;
- case SourceCoordinates.Local: return m_transform.localPosition - m_initial.Translation;
- case SourceCoordinates.Model: return m_modelRoot.worldToLocalMatrix.MultiplyPoint(m_transform.position) - m_initial.Translation;
+ // case ObjectSpace.World: return m_transform.position - m_initial.Translation;
+ case ObjectSpace.local: return m_transform.localPosition - m_initial.Translation;
+ case ObjectSpace.model: return m_modelRoot.worldToLocalMatrix.MultiplyPoint(m_transform.position) - m_initial.Translation;
default: throw new NotImplementedException();
}
}
@@ -52,30 +35,30 @@ namespace UniVRM10
switch (m_coords)
{
// 右からかけるか、左からかけるか、それが問題なのだ
- case SourceCoordinates.World: return m_transform.rotation * Quaternion.Inverse(m_initial.Rotation);
- case SourceCoordinates.Local: return m_transform.localRotation * Quaternion.Inverse(m_initial.Rotation);
- case SourceCoordinates.Model: return m_transform.rotation * Quaternion.Inverse(m_modelRoot.rotation) * Quaternion.Inverse(m_initial.Rotation);
+ // case SourceCoordinates.World: return m_transform.rotation * Quaternion.Inverse(m_initial.Rotation);
+ case ObjectSpace.local: return m_transform.localRotation * Quaternion.Inverse(m_initial.Rotation);
+ case ObjectSpace.model: return m_transform.rotation * Quaternion.Inverse(m_modelRoot.rotation) * Quaternion.Inverse(m_initial.Rotation);
default: throw new NotImplementedException();
}
}
}
- public ConstraintSource(Transform t, SourceCoordinates coords, Transform modelRoot = null)
+ public ConstraintSource(Transform t, ObjectSpace coords, Transform modelRoot = null)
{
m_transform = t;
m_coords = coords;
switch (coords)
{
- case SourceCoordinates.World:
- m_initial = TRS.GetWorld(t);
- break;
+ // case SourceCoordinates.World:
+ // m_initial = TRS.GetWorld(t);
+ // break;
- case SourceCoordinates.Local:
+ case ObjectSpace.local:
m_initial = TRS.GetLocal(t);
break;
- case SourceCoordinates.Model:
+ case ObjectSpace.model:
{
var world = TRS.GetWorld(t);
m_modelRoot = modelRoot;
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs b/Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs
similarity index 95%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs
index 685116b57..5f2529c48 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs
@@ -11,10 +11,10 @@ namespace UniVRM10
///
///
[DisallowMultipleComponent]
- public class VRMAimConstraint : VRMConstraint
+ public class VRM10AimConstraint : VRM10Constraint
{
[SerializeField]
- Transform Source = default;
+ public Transform Source = default;
// [SerializeField]
// [Range(0, 10.0f)]
@@ -24,12 +24,13 @@ namespace UniVRM10
/// Forward
///
[SerializeField]
- Vector3 AimVector = Vector3.forward;
+ public Vector3 AimVector = Vector3.forward;
[SerializeField]
- Vector3 UpVector = Vector3.up;
+ public Vector3 UpVector = Vector3.up;
- Vector3 RightVector;
+ [SerializeField]
+ public Vector3 RightVector;
Quaternion m_selfInitial;
Matrix4x4 m_coords;
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs.meta b/Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs.meta
similarity index 83%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs.meta
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs.meta
index 647bb21a1..2b2331d9c 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs.meta
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10AimConstraint.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 0f104dcf447611a4ca99f4ac41e806e8
+guid: e1e8c3a00191fbd4db98fb47ddb80e8c
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs b/Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs
similarity index 66%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs
index 45e1e848e..6ff82479a 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs
@@ -2,7 +2,7 @@ using UnityEngine;
namespace UniVRM10
{
- public abstract class VRMConstraint : MonoBehaviour
+ public abstract class VRM10Constraint : MonoBehaviour
{
public virtual void Process()
{
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs.meta b/Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs.meta
similarity index 83%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs.meta
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs.meta
index 9b67ac4a2..37ffe7564 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMAimConstraint.cs.meta
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10Constraint.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: a8f13bc2bb7b6734e92bba2b204e2e49
+guid: ded8c4db12c688b46814cf0bf925cacf
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs b/Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs
similarity index 76%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs
index ef29e7a25..200222977 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMPositionConstraint.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs
@@ -1,4 +1,5 @@
-using UnityEngine;
+using UniGLTF.Extensions.VRMC_constraints;
+using UnityEngine;
namespace UniVRM10
{
@@ -6,26 +7,26 @@ namespace UniVRM10
/// 対象の初期位置と現在位置の差分(delta)を、自身の初期位置に対してWeightを乗算して加算する。
///
[DisallowMultipleComponent]
- public class VRMPositionConstraint : VRMConstraint
+ public class VRM10PositionConstraint : VRM10Constraint
{
[SerializeField]
- Transform Source = default;
+ public Transform Source = default;
[SerializeField]
- SourceCoordinates SourceCoordinate = default;
+ public ObjectSpace SourceCoordinate = default;
[SerializeField]
- DestinationCoordinates DestinationCoordinate = default;
+ public ObjectSpace DestinationCoordinate = default;
[SerializeField]
- AxesMask FreezeAxes = default;
+ public AxisMask FreezeAxes = default;
[SerializeField]
[Range(0, 10.0f)]
- float Weight = 1.0f;
+ public float Weight = 1.0f;
[SerializeField]
- Transform ModelRoot = default;
+ public Transform ModelRoot = default;
ConstraintSource m_src;
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs.meta b/Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs.meta
similarity index 83%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs.meta
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs.meta
index 0ccca3c7b..4105f28a1 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs.meta
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10PositionConstraint.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: e7e95091802973e488fdcc4b3840cdc5
+guid: 6fec0847a81b2124c9f67575d247b1f9
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs b/Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs
similarity index 81%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs
index 4ed4c1e07..e360904aa 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMRotationConstraint.cs
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs
@@ -1,4 +1,5 @@
-using UnityEngine;
+using UniGLTF.Extensions.VRMC_constraints;
+using UnityEngine;
namespace UniVRM10
@@ -7,26 +8,26 @@ namespace UniVRM10
/// 対象の初期回転と現在回転の差分(delta)を、自身の初期回転と自身の初期回転にdeltaを乗算したものに対してWeightでSlerpする。
///
[DisallowMultipleComponent]
- public class VRMRotationConstraint : VRMConstraint
+ public class VRM10RotationConstraint : VRM10Constraint
{
[SerializeField]
- Transform Source = default;
+ public Transform Source = default;
[SerializeField]
- SourceCoordinates SourceCoordinate = default;
+ public ObjectSpace SourceCoordinate = default;
[SerializeField]
- DestinationCoordinates DestinationCoordinate = default;
+ public ObjectSpace DestinationCoordinate = default;
[SerializeField]
- AxesMask FreezeAxes = default;
+ public AxisMask FreezeAxes = default;
[SerializeField]
[Range(0, 10.0f)]
- float Weight = 1.0f;
+ public float Weight = 1.0f;
[SerializeField]
- Transform ModelRoot = default;
+ public Transform ModelRoot = default;
ConstraintSource m_src;
diff --git a/Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs.meta b/Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs.meta
similarity index 83%
rename from Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs.meta
rename to Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs.meta
index 73d1134e8..4eaea4e14 100644
--- a/Assets/VRM10/Runtime/Components/Constraint/VRMConstraint.cs.meta
+++ b/Assets/VRM10/Runtime/Components/Constraint/VRM10RotationConstraint.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: e017e9a63d31c4e4cbcc905a0caf0605
+guid: 7a07fbecedce41b4396f286fd7634e1d
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/VRM10/Runtime/Components/VRM10Controller.cs b/Assets/VRM10/Runtime/Components/VRM10Controller.cs
index 25f822c3c..08fdaa697 100644
--- a/Assets/VRM10/Runtime/Components/VRM10Controller.cs
+++ b/Assets/VRM10/Runtime/Components/VRM10Controller.cs
@@ -55,7 +55,7 @@ namespace UniVRM10
}
}
- VRMConstraint[] m_constraints;
+ VRM10Constraint[] m_constraints;
Transform m_head;
public Transform Head
@@ -113,7 +113,7 @@ namespace UniVRM10
//
if (m_constraints == null)
{
- m_constraints = GetComponentsInChildren();
+ m_constraints = GetComponentsInChildren();
}
foreach (var constraint in m_constraints)
{
diff --git a/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs b/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs
index 25a66dbd4..7b01d6ef1 100644
--- a/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs
+++ b/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs
@@ -346,7 +346,7 @@ namespace UniVRM10
var joint = new VRM10SpringJoint(Nodes[gltfJoint.Node.Value]);
joint.m_jointRadius = gltfJoint.HitRadius.Value;
joint.m_dragForce = gltfJoint.DragForce.Value;
- joint.m_gravityDir = new Vector3(gltfJoint.GravityDir[0], gltfJoint.GravityDir[1], gltfJoint.GravityDir[2]);
+ joint.m_gravityDir = Vector3(gltfJoint.GravityDir);
joint.m_gravityPower = gltfJoint.GravityPower.Value;
joint.m_stiffnessForce = gltfJoint.Stiffness.Value;
// joint.m_exclude = gltfJoint.Exclude.GetValueOrDefault();
@@ -368,7 +368,7 @@ namespace UniVRM10
return new VRM10SpringBoneCollider
{
ColliderType = VRM10SpringBoneColliderTypes.Sphere,
- Offset = new Vector3(x.Sphere.Offset[0], x.Sphere.Offset[1], x.Sphere.Offset[2]),
+ Offset = Vector3(x.Sphere.Offset),
Radius = x.Sphere.Radius.Value,
};
}
@@ -377,9 +377,9 @@ namespace UniVRM10
return new VRM10SpringBoneCollider
{
ColliderType = VRM10SpringBoneColliderTypes.Capsule,
- Offset = new Vector3(x.Capsule.Offset[0], x.Capsule.Offset[1], x.Capsule.Offset[2]),
+ Offset = Vector3(x.Capsule.Offset),
Radius = x.Capsule.Radius.Value,
- Tail = new Vector3(x.Capsule.Tail[0], x.Capsule.Tail[1], x.Capsule.Tail[2]),
+ Tail = Vector3(x.Capsule.Tail),
};
}
else
@@ -400,8 +400,71 @@ namespace UniVRM10
}
}
+ static AxisMask FreezeAxis(bool[] flags)
+ {
+ var mask = default(AxisMask);
+ if (flags != null && flags.Length == 3)
+ {
+ if (flags[0]) mask |= AxisMask.X;
+ if (flags[1]) mask |= AxisMask.Y;
+ if (flags[2]) mask |= AxisMask.Z;
+ }
+ return mask;
+ }
+
+ static Vector3 Vector3(float[] f)
+ {
+ var v = default(Vector3);
+ if (f != null && f.Length == 3)
+ {
+ v.x = f[0];
+ v.y = f[1];
+ v.z = f[2];
+ }
+ return v;
+ }
+
async Task LoadConstraintAsync(IAwaitCaller awaitCaller, VRM10Controller controller)
{
+ for (int i = 0; i < Parser.GLTF.nodes.Count; ++i)
+ {
+ var gltfNode = Parser.GLTF.nodes[i];
+ if (UniGLTF.Extensions.VRMC_constraints.GltfDeserializer.TryGet(gltfNode.extensions, out UniGLTF.Extensions.VRMC_constraints.VRMC_constraints constraint))
+ {
+ var node = Nodes[i];
+ if (constraint.Position != null)
+ {
+ var p = constraint.Position;
+ var positionConstraint = node.gameObject.AddComponent();
+ positionConstraint.SourceCoordinate = p.SourceSpace;
+ positionConstraint.Source = Nodes[p.Source.Value];
+ positionConstraint.DestinationCoordinate = p.DestinationSpace;
+ positionConstraint.FreezeAxes = FreezeAxis(p.FreezeAxes);
+ positionConstraint.Weight = p.Weight.Value;
+ positionConstraint.ModelRoot = Root.transform;
+ }
+ else if (constraint.Rotation != null)
+ {
+ var r = constraint.Rotation;
+ var rotationConstraint = node.gameObject.AddComponent();
+ rotationConstraint.SourceCoordinate = r.SourceSpace;
+ rotationConstraint.Source = Nodes[r.Source.Value];
+ rotationConstraint.DestinationCoordinate = r.DestinationSpace;
+ rotationConstraint.FreezeAxes = FreezeAxis(r.FreezeAxes);
+ rotationConstraint.Weight = r.Weight.Value;
+ rotationConstraint.ModelRoot = Root.transform;
+ }
+ else if (constraint.Aim != null)
+ {
+ var a = constraint.Aim;
+ var aimConstraint = node.gameObject.AddComponent();
+ aimConstraint.Source = Nodes[a.Source.Value];
+ aimConstraint.AimVector = Vector3(a.AimVector);
+ aimConstraint.UpVector = Vector3(a.UpVector);
+ }
+ }
+ }
+
await awaitCaller.NextFrame();
}