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(); }