Merge pull request #1446 from ousttrue/fix10/update_spec

[1.0][Constraint] rotation local to localのみに
This commit is contained in:
ousttrue 2022-01-06 14:56:36 +09:00 committed by GitHub
commit 761537a2cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 24 additions and 915 deletions

View File

@ -1,87 +0,0 @@
using System.Text;
using UnityEditor;
using UnityEngine;
namespace UniVRM10
{
[CustomEditor(typeof(VRM10AimConstraint))]
public class VRM10AimConstraintEditor : Editor
{
VRM10AimConstraint m_target;
void OnEnable()
{
m_target = (VRM10AimConstraint)target;
}
static GUIStyle s_style;
static GUIStyle Style
{
get
{
if (s_style == null)
{
s_style = new GUIStyle("box");
}
return s_style;
}
}
static void DrawAimUp(Quaternion rot, Vector3 pos, Color c)
{
Handles.matrix = Matrix4x4.identity;
Handles.color = c;
// aim
var aim = pos + rot * Vector3.forward * 0.3f;
Handles.DrawLine(pos, aim);
Handles.Label(aim, "aim");
// up
var up = pos + rot * Vector3.up * 0.3f;
Handles.DrawLine(pos, up);
Handles.Label(up, "up");
}
public void OnSceneGUI()
{
if (m_target.Source == null)
{
return;
}
// this to target line
Handles.color = Color.yellow;
Handles.DrawLine(m_target.Source.position, m_target.transform.position);
var pos = m_target.transform.position;
var pr = TR.FromParent(m_target.transform);
if (m_target.m_src == null)
{
EditorGUI.BeginChangeCheck();
TR.FromWorld(m_target.transform).Draw(0.2f);
Handles.matrix = Matrix4x4.identity;
var rot = Handles.RotationHandle(pr.Rotation * m_target.DestinationOffset, pos);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(m_target, "Rotated RotateAt Point");
m_target.DestinationOffset = Quaternion.Inverse(pr.Rotation) * rot;
}
DrawAimUp(rot, pos, Color.yellow);
}
else
{
var init = pr.Rotation * m_target.m_src.LocalInitial.Rotation;
DrawAimUp(init * m_target.DestinationOffset, m_target.transform.position, Color.yellow);
new TR(init, m_target.transform.position).Draw(0.2f);
DrawAimUp(init * m_target.DestinationOffset * m_target.Delta, m_target.transform.position, Color.magenta);
}
// Target UPVector
Handles.color = Color.green;
Handles.DrawLine(m_target.transform.position, m_target.transform.position + m_target.UpVector);
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 53c7ae04ba8deea40acc6439a2fe11cd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,11 +0,0 @@
using System.Text;
using UnityEditor;
using UnityEngine;
namespace UniVRM10
{
[CustomEditor(typeof(VRM10PositionConstraint))]
public class VRM10PositionConstraintEditor : VRM10PositionRotationConstraintEditorBase
{
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d4c6d6f5f37e41e47bd02bdf1dbda864
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -87,7 +87,6 @@ namespace UniVRM10
var sb = new StringBuilder();
sb.AppendLine();
sb.AppendLine();
sb.AppendLine($"source: {m_target.SourceCoordinate}");
sb.AppendLine($"{delta.x:0.00}");
sb.AppendLine($"{delta.y:0.00}");
sb.Append($"{delta.z:0.00}");
@ -97,7 +96,6 @@ namespace UniVRM10
// show dst
{
var sb = new StringBuilder();
sb.AppendLine($"constraint: {m_target.DestinationCoordinate}");
sb.AppendLine(m_target.FreezeAxes.HasFlag(AxisMask.X) ? $"freeze" : $"{delta.x:0.00}");
sb.AppendLine(m_target.FreezeAxes.HasFlag(AxisMask.Y) ? $"freeze" : $"{delta.y:0.00}");
sb.Append(m_target.FreezeAxes.HasFlag(AxisMask.Z) ? $"freeze" : $"{delta.z:0.00}");

View File

@ -13,15 +13,9 @@ namespace UniVRM10
public readonly TR LocalInitial;
public TR Delta(ObjectSpace coords, Quaternion sourceRotationOffset)
public TR Delta(Quaternion sourceRotationOffset)
{
switch (coords)
{
// case SourceCoordinates.World: return m_transform.rotation * Quaternion.Inverse(m_initial.Rotation);
case ObjectSpace.local: return TR.FromLocal(Source) * (LocalInitial * new TR(sourceRotationOffset)).Inverse();
case ObjectSpace.model: return TR.FromWorld(Source) * (TR.FromParent(ModelRoot) * ModelInitial * new TR(sourceRotationOffset)).Inverse();
default: throw new NotImplementedException();
}
return TR.FromLocal(Source) * (LocalInitial * new TR(sourceRotationOffset)).Inverse();
}
public ConstraintSource(Transform t, Transform modelRoot = null)

View File

@ -1,88 +0,0 @@
using System;
using UniGLTF.Extensions.VRMC_node_constraint;
using UnityEngine;
namespace UniVRM10
{
[DisallowMultipleComponent]
public class VRM10AimConstraint : VRM10Constraint
{
/// <summary>
/// Yaw(Y), Pitch(X) の2軸だけ
/// </summary>
[SerializeField]
[EnumFlags]
YawPitchMask m_freezeAxes = default;
public YawPitchMask FreezeAxes
{
get => m_freezeAxes;
set => m_freezeAxes = value;
}
[Header("Source")]
[SerializeField]
Transform m_source = default;
public override Transform Source
{
get => m_source;
set => m_source = value;
}
[Header("Destination")]
[SerializeField]
ObjectSpace m_destinationCoordinate = default;
/// <summary>
/// シリアライズは、Aim と Up で記録。
/// UniVRM の Editor では Aim と Up が直交しないことを許可しない。
/// </summary>
[SerializeField]
public Quaternion DestinationOffset = Quaternion.identity;
Quaternion m_delta;
public Quaternion Delta => m_delta;
public Vector3 UpVector
{
get
{
switch (m_destinationCoordinate)
{
case ObjectSpace.model: return ModelRoot.up;
case ObjectSpace.local:
{
if (m_src == null)
{
return transform.up;
}
return (TR.FromParent(transform).Rotation * m_dst.LocalInitial.Rotation) * Vector3.up;
}
default:
throw new NotImplementedException();
}
}
}
public override void OnProcess()
{
var zAxis = (Source.position - transform.position).normalized;
var xAxis = Vector3.Cross(UpVector, zAxis);
var yAxis = Vector3.Cross(zAxis, xAxis);
var m = new Matrix4x4(xAxis, yAxis, zAxis, new Vector4(0, 0, 0, 1));
var parent = TR.FromParent(transform);
m_delta = Quaternion.Inverse(parent.Rotation * m_src.LocalInitial.Rotation * DestinationOffset) * m.rotation;
var (yaw, pitch) = Matrix4x4.Rotate(Quaternion.Inverse(m_delta)).CalcYawPitch(Vector3.forward);
if (m_freezeAxes.HasFlag(YawPitchMask.Yaw)) yaw = 0;
if (m_freezeAxes.HasFlag(YawPitchMask.Pitch)) pitch = 0;
m_delta = Quaternion.Euler(pitch, yaw, 0);
transform.rotation = parent.Rotation * m_src.LocalInitial.Rotation * Delta;
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: e1e8c3a00191fbd4db98fb47ddb80e8c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -38,35 +38,15 @@ namespace UniVRM10
public ConstraintSource m_src;
protected TR SourceInitialCoords(ObjectSpace space)
protected TR SourceInitialCoords()
{
switch (space)
if (m_src == null)
{
case ObjectSpace.model:
if (m_src == null)
{
return new TR(ModelRoot.rotation, Source.position);
}
else
{
var r = (TR.FromParent(ModelRoot) * m_src.ModelInitial).Rotation;
var t = (TR.FromParent(Source) * m_src.LocalInitial).Translation;
return new TR(r, t);
}
case ObjectSpace.local:
if (m_src == null)
{
return TR.FromWorld(Source);
}
else
{
return TR.FromParent(Source) * m_src.LocalInitial;
}
default:
throw new NotImplementedException();
return TR.FromWorld(Source);
}
else
{
return TR.FromParent(Source) * m_src.LocalInitial;
}
}
#endregion
@ -74,34 +54,15 @@ namespace UniVRM10
#region Destination
protected ConstraintDestination m_dst;
protected TR DestinationInitialCoords(ObjectSpace space)
protected TR DestinationInitialCoords()
{
switch (space)
if (m_dst == null)
{
case ObjectSpace.model:
if (m_dst == null)
{
return new TR(ModelRoot.rotation, transform.position);
}
else
{
var r = (TR.FromParent(ModelRoot) * m_dst.ModelInitial).Rotation;
var t = (TR.FromParent(transform) * m_dst.LocalInitial).Translation;
return new TR(r, t);
}
case ObjectSpace.local:
if (m_dst == null)
{
return TR.FromWorld(transform);
}
else
{
return TR.FromParent(transform) * m_dst.LocalInitial;
}
default:
throw new NotImplementedException();
return TR.FromWorld(transform);
}
else
{
return TR.FromParent(transform) * m_dst.LocalInitial;
}
}
#endregion

View File

@ -1,52 +0,0 @@
using System;
using UniGLTF.Extensions.VRMC_node_constraint;
using UnityEngine;
namespace UniVRM10
{
/// <summary>
/// 対象の初期位置と現在位置の差分(delta)を、自身の初期位置に対してWeightを乗算して加算する。
/// </summary>
[DisallowMultipleComponent]
public class VRM10PositionConstraint : VRM10RotationPositionConstraintBase
{
public override Vector3 Delta => FreezeAxes.Freeze(m_delta.Translation) * Weight;
public override TR GetSourceCurrent()
{
var coords = GetSourceCoords();
if (m_src == null)
{
return coords;
}
return coords * new TR(Delta);
}
public override TR GetDstCurrent()
{
var coords = GetDstCoords();
if (m_src == null)
{
return coords;
}
return coords * new TR(Delta);
}
protected override void ApplyDelta()
{
switch (DestinationCoordinate)
{
case ObjectSpace.local:
m_dst.ApplyLocal(DestinationInitialCoords(ObjectSpace.local) * new TR(DestinationOffset) * new TR(Delta));
break;
case ObjectSpace.model:
m_dst.ApplyModel(DestinationInitialCoords(ObjectSpace.model) * new TR(DestinationOffset) * new TR(Delta));
break;
default:
throw new NotImplementedException();
}
}
}
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 6fec0847a81b2124c9f67575d247b1f9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -34,19 +34,7 @@ namespace UniVRM10
protected override void ApplyDelta()
{
switch (DestinationCoordinate)
{
case ObjectSpace.local:
m_dst.ApplyLocal(m_dst.LocalInitial * new TR(DestinationOffset) * new TR(Quaternion.Euler(Delta)));
break;
case ObjectSpace.model:
m_dst.ApplyModel(DestinationInitialCoords(ObjectSpace.model) * new TR(DestinationOffset) * new TR(Quaternion.Euler(Delta)));
break;
default:
throw new NotImplementedException();
}
m_dst.ApplyLocal(m_dst.LocalInitial * new TR(DestinationOffset) * new TR(Quaternion.Euler(Delta)));
}
}
}

View File

@ -25,13 +25,6 @@ namespace UniVRM10
set => m_source = value;
}
[SerializeField]
ObjectSpace m_sourceCoordinate = default;
public ObjectSpace SourceCoordinate
{
get => m_sourceCoordinate;
set => m_sourceCoordinate = value;
}
[SerializeField]
VRM10RotationOffset m_sourceOffset = VRM10RotationOffset.Identity;
@ -46,14 +39,6 @@ namespace UniVRM10
#region Destination
[Header("Destination")]
[SerializeField]
ObjectSpace m_destinationCoordinate = default;
public ObjectSpace DestinationCoordinate
{
get => m_destinationCoordinate;
set => m_destinationCoordinate = value;
}
[SerializeField]
public VRM10RotationOffset m_destinationOffset = VRM10RotationOffset.Identity;
@ -71,54 +56,16 @@ namespace UniVRM10
throw new ConstraintException(ConstraintException.ExceptionTypes.NoSource);
}
switch (SourceCoordinate)
{
case ObjectSpace.model:
{
if (ModelRoot == null)
{
throw new ConstraintException(ConstraintException.ExceptionTypes.NoModelWithModelSpace);
}
var init = SourceInitialCoords(ObjectSpace.model);
return new TR(init.Rotation * SourceOffset, init.Translation);
}
case ObjectSpace.local:
{
var init = SourceInitialCoords(ObjectSpace.local);
return new TR(init.Rotation * SourceOffset, init.Translation);
}
default:
throw new NotImplementedException();
}
var init = SourceInitialCoords();
return new TR(init.Rotation * SourceOffset, init.Translation);
}
public abstract TR GetSourceCurrent();
public TR GetDstCoords()
{
switch (DestinationCoordinate)
{
case ObjectSpace.model:
{
if (ModelRoot == null)
{
throw new ConstraintException(ConstraintException.ExceptionTypes.NoModelWithModelSpace);
}
var init = DestinationInitialCoords(ObjectSpace.model);
return new TR(init.Rotation * DestinationOffset, init.Translation);
}
case ObjectSpace.local:
{
var init = DestinationInitialCoords(ObjectSpace.local);
return new TR(init.Rotation * DestinationOffset, init.Translation);
}
default:
throw new NotImplementedException();
}
var init = DestinationInitialCoords();
return new TR(init.Rotation * DestinationOffset, init.Translation);
}
public abstract TR GetDstCurrent();
@ -151,7 +98,7 @@ namespace UniVRM10
public override void OnProcess()
{
m_delta = m_src.Delta(SourceCoordinate, SourceOffset);
m_delta = m_src.Delta(SourceOffset);
ApplyDelta();
}
}

View File

@ -79,88 +79,15 @@ public static Constraint Deserialize_Constraint(JsonNode parsed)
continue;
}
if(key=="position"){
value.Position = __constraint_Deserialize_Position(kv.Value);
continue;
}
if(key=="rotation"){
value.Rotation = __constraint_Deserialize_Rotation(kv.Value);
continue;
}
if(key=="aim"){
value.Aim = __constraint_Deserialize_Aim(kv.Value);
continue;
}
}
return value;
}
public static PositionConstraint __constraint_Deserialize_Position(JsonNode parsed)
{
var value = new PositionConstraint();
foreach(var kv in parsed.ObjectItems())
{
var key = kv.Key.GetString();
if(key=="extensions"){
value.Extensions = new glTFExtensionImport(kv.Value);
continue;
}
if(key=="extras"){
value.Extras = new glTFExtensionImport(kv.Value);
continue;
}
if(key=="name"){
value.Name = kv.Value.GetString();
continue;
}
if(key=="source"){
value.Source = kv.Value.GetInt32();
continue;
}
if(key=="sourceSpace"){
value.SourceSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="destinationSpace"){
value.DestinationSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="freezeAxes"){
value.FreezeAxes = __constraint__position_Deserialize_FreezeAxes(kv.Value);
continue;
}
if(key=="weight"){
value.Weight = kv.Value.GetSingle();
continue;
}
}
return value;
}
public static bool[] __constraint__position_Deserialize_FreezeAxes(JsonNode parsed)
{
var value = new bool[parsed.GetArrayCount()];
int i=0;
foreach(var x in parsed.ArrayItems())
{
value[i++] = x.GetBoolean();
}
return value;
}
public static RotationConstraint __constraint_Deserialize_Rotation(JsonNode parsed)
{
var value = new RotationConstraint();
@ -189,16 +116,6 @@ public static RotationConstraint __constraint_Deserialize_Rotation(JsonNode pars
continue;
}
if(key=="sourceSpace"){
value.SourceSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="destinationSpace"){
value.DestinationSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="freezeAxes"){
value.FreezeAxes = __constraint__rotation_Deserialize_FreezeAxes(kv.Value);
continue;
@ -224,100 +141,5 @@ public static bool[] __constraint__rotation_Deserialize_FreezeAxes(JsonNode pars
return value;
}
public static AimConstraint __constraint_Deserialize_Aim(JsonNode parsed)
{
var value = new AimConstraint();
foreach(var kv in parsed.ObjectItems())
{
var key = kv.Key.GetString();
if(key=="extensions"){
value.Extensions = new glTFExtensionImport(kv.Value);
continue;
}
if(key=="extras"){
value.Extras = new glTFExtensionImport(kv.Value);
continue;
}
if(key=="name"){
value.Name = kv.Value.GetString();
continue;
}
if(key=="source"){
value.Source = kv.Value.GetInt32();
continue;
}
if(key=="sourceSpace"){
value.SourceSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="destinationSpace"){
value.DestinationSpace = (ObjectSpace)Enum.Parse(typeof(ObjectSpace), kv.Value.GetString(), true);
continue;
}
if(key=="aimVector"){
value.AimVector = __constraint__aim_Deserialize_AimVector(kv.Value);
continue;
}
if(key=="upVector"){
value.UpVector = __constraint__aim_Deserialize_UpVector(kv.Value);
continue;
}
if(key=="freezeAxes"){
value.FreezeAxes = __constraint__aim_Deserialize_FreezeAxes(kv.Value);
continue;
}
if(key=="weight"){
value.Weight = kv.Value.GetSingle();
continue;
}
}
return value;
}
public static float[] __constraint__aim_Deserialize_AimVector(JsonNode parsed)
{
var value = new float[parsed.GetArrayCount()];
int i=0;
foreach(var x in parsed.ArrayItems())
{
value[i++] = x.GetSingle();
}
return value;
}
public static float[] __constraint__aim_Deserialize_UpVector(JsonNode parsed)
{
var value = new float[parsed.GetArrayCount()];
int i=0;
foreach(var x in parsed.ArrayItems())
{
value[i++] = x.GetSingle();
}
return value;
}
public static bool[] __constraint__aim_Deserialize_FreezeAxes(JsonNode parsed)
{
var value = new bool[parsed.GetArrayCount()];
int i=0;
foreach(var x in parsed.ArrayItems())
{
value[i++] = x.GetBoolean();
}
return value;
}
} // GltfDeserializer
} // UniGLTF

View File

@ -6,40 +6,6 @@ using System.Collections.Generic;
namespace UniGLTF.Extensions.VRMC_node_constraint
{
public enum ObjectSpace
{
model,
local,
}
public class PositionConstraint
{
// Dictionary object with extension-specific objects.
public object Extensions;
// Application-specific data.
public object Extras;
// The user-defined name of this object.
public string Name;
// The index of the node constrains the node.
public int? Source;
// The source node will be evaluated in this space.
public ObjectSpace SourceSpace;
// The destination node will be evaluated in this space.
public ObjectSpace DestinationSpace;
// Axes be constrained by this constraint, in X-Y-Z order.
public bool[] FreezeAxes;
// The weight of the constraint.
public float? Weight;
}
public class RotationConstraint
{
// Dictionary object with extension-specific objects.
@ -54,12 +20,6 @@ namespace UniGLTF.Extensions.VRMC_node_constraint
// The index of the node constrains the node.
public int? Source;
// The source node will be evaluated in this space.
public ObjectSpace SourceSpace;
// The destination node will be evaluated in this space.
public ObjectSpace DestinationSpace;
// Axes be constrained by this constraint, in X-Y-Z order.
public bool[] FreezeAxes;
@ -67,39 +27,6 @@ namespace UniGLTF.Extensions.VRMC_node_constraint
public float? Weight;
}
public class AimConstraint
{
// Dictionary object with extension-specific objects.
public object Extensions;
// Application-specific data.
public object Extras;
// The user-defined name of this object.
public string Name;
// The index of the node constrains the node.
public int? Source;
// The source node will be evaluated in this space.
public ObjectSpace SourceSpace;
// The destination node will be evaluated in this space.
public ObjectSpace DestinationSpace;
// An axis which faces the direction of its source.
public float[] AimVector;
// An up axis of the constraint.
public float[] UpVector;
// Axes be constrained by this constraint, in Yaw-Pitch order.
public bool[] FreezeAxes;
// The weight of the constraint.
public float? Weight;
}
public class Constraint
{
// Dictionary object with extension-specific objects.
@ -108,14 +35,8 @@ namespace UniGLTF.Extensions.VRMC_node_constraint
// Application-specific data.
public object Extras;
// A constraint that links the position with a source.
public PositionConstraint Position;
// A constraint that links the rotation with a source.
public RotationConstraint Rotation;
// A constraint that rotates the node to face a source.
public AimConstraint Aim;
}
public class VRMC_node_constraint

View File

@ -71,84 +71,14 @@ public static void Serialize_Constraint(JsonFormatter f, Constraint value)
(value.Extras as glTFExtension).Serialize(f);
}
if(value.Position!=null){
f.Key("position");
__constraint_Serialize_Position(f, value.Position);
}
if(value.Rotation!=null){
f.Key("rotation");
__constraint_Serialize_Rotation(f, value.Rotation);
}
if(value.Aim!=null){
f.Key("aim");
__constraint_Serialize_Aim(f, value.Aim);
}
f.EndMap();
}
public static void __constraint_Serialize_Position(JsonFormatter f, PositionConstraint value)
{
f.BeginMap();
if(value.Extensions!=null){
f.Key("extensions");
(value.Extensions as glTFExtension).Serialize(f);
}
if(value.Extras!=null){
f.Key("extras");
(value.Extras as glTFExtension).Serialize(f);
}
if(!string.IsNullOrEmpty(value.Name)){
f.Key("name");
f.Value(value.Name);
}
if(value.Source.HasValue){
f.Key("source");
f.Value(value.Source.GetValueOrDefault());
}
if(true){
f.Key("sourceSpace");
f.Value(value.SourceSpace.ToString());
}
if(true){
f.Key("destinationSpace");
f.Value(value.DestinationSpace.ToString());
}
if(value.FreezeAxes!=null&&value.FreezeAxes.Count()>=3){
f.Key("freezeAxes");
__constraint__position_Serialize_FreezeAxes(f, value.FreezeAxes);
}
if(value.Weight.HasValue){
f.Key("weight");
f.Value(value.Weight.GetValueOrDefault());
}
f.EndMap();
}
public static void __constraint__position_Serialize_FreezeAxes(JsonFormatter f, bool[] value)
{
f.BeginList();
foreach(var item in value)
{
f.Value(item);
}
f.EndList();
}
public static void __constraint_Serialize_Rotation(JsonFormatter f, RotationConstraint value)
{
f.BeginMap();
@ -174,16 +104,6 @@ public static void __constraint_Serialize_Rotation(JsonFormatter f, RotationCons
f.Value(value.Source.GetValueOrDefault());
}
if(true){
f.Key("sourceSpace");
f.Value(value.SourceSpace.ToString());
}
if(true){
f.Key("destinationSpace");
f.Value(value.DestinationSpace.ToString());
}
if(value.FreezeAxes!=null&&value.FreezeAxes.Count()>=3){
f.Key("freezeAxes");
__constraint__rotation_Serialize_FreezeAxes(f, value.FreezeAxes);
@ -209,99 +129,5 @@ public static void __constraint__rotation_Serialize_FreezeAxes(JsonFormatter f,
f.EndList();
}
public static void __constraint_Serialize_Aim(JsonFormatter f, AimConstraint value)
{
f.BeginMap();
if(value.Extensions!=null){
f.Key("extensions");
(value.Extensions as glTFExtension).Serialize(f);
}
if(value.Extras!=null){
f.Key("extras");
(value.Extras as glTFExtension).Serialize(f);
}
if(!string.IsNullOrEmpty(value.Name)){
f.Key("name");
f.Value(value.Name);
}
if(value.Source.HasValue){
f.Key("source");
f.Value(value.Source.GetValueOrDefault());
}
if(true){
f.Key("sourceSpace");
f.Value(value.SourceSpace.ToString());
}
if(true){
f.Key("destinationSpace");
f.Value(value.DestinationSpace.ToString());
}
if(value.AimVector!=null&&value.AimVector.Count()>=3){
f.Key("aimVector");
__constraint__aim_Serialize_AimVector(f, value.AimVector);
}
if(value.UpVector!=null&&value.UpVector.Count()>=3){
f.Key("upVector");
__constraint__aim_Serialize_UpVector(f, value.UpVector);
}
if(value.FreezeAxes!=null&&value.FreezeAxes.Count()>=2){
f.Key("freezeAxes");
__constraint__aim_Serialize_FreezeAxes(f, value.FreezeAxes);
}
if(value.Weight.HasValue){
f.Key("weight");
f.Value(value.Weight.GetValueOrDefault());
}
f.EndMap();
}
public static void __constraint__aim_Serialize_AimVector(JsonFormatter f, float[] value)
{
f.BeginList();
foreach(var item in value)
{
f.Value(item);
}
f.EndList();
}
public static void __constraint__aim_Serialize_UpVector(JsonFormatter f, float[] value)
{
f.BeginList();
foreach(var item in value)
{
f.Value(item);
}
f.EndList();
}
public static void __constraint__aim_Serialize_FreezeAxes(JsonFormatter f, bool[] value)
{
f.BeginList();
foreach(var item in value)
{
f.Value(item);
}
f.EndList();
}
} // class
} // namespace

View File

@ -390,18 +390,10 @@ namespace UniVRM10
UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint vrmConstraint = default;
switch (constraint)
{
case VRM10PositionConstraint positionConstraint:
vrmConstraint = ExportPostionConstraint(positionConstraint, model, converter);
break;
case VRM10RotationConstraint rotationConstraint:
vrmConstraint = ExportRotationConstraint(rotationConstraint, model, converter);
break;
case VRM10AimConstraint aimConstraint:
vrmConstraint = ExportAimConstraint(aimConstraint, model, converter);
break;
default:
throw new NotImplementedException();
}
@ -424,24 +416,6 @@ namespace UniVRM10
};
}
static UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint ExportPostionConstraint(VRM10PositionConstraint c, Model model, ModelExporter converter)
{
return new UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint
{
Constraint = new UniGLTF.Extensions.VRMC_node_constraint.Constraint
{
Position = new UniGLTF.Extensions.VRMC_node_constraint.PositionConstraint
{
Source = model.Nodes.IndexOf(converter.Nodes[c.Source.gameObject]),
SourceSpace = c.SourceCoordinate,
DestinationSpace = c.DestinationCoordinate,
FreezeAxes = ToArray(c.FreezeAxes),
Weight = c.Weight,
}
},
};
}
static UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint ExportRotationConstraint(VRM10RotationConstraint c, Model model, ModelExporter converter)
{
return new UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint
@ -451,8 +425,6 @@ namespace UniVRM10
Rotation = new UniGLTF.Extensions.VRMC_node_constraint.RotationConstraint
{
Source = model.Nodes.IndexOf(converter.Nodes[c.Source.gameObject]),
SourceSpace = c.SourceCoordinate,
DestinationSpace = c.DestinationCoordinate,
FreezeAxes = ToArray(c.FreezeAxes),
Weight = c.Weight,
},
@ -460,23 +432,6 @@ namespace UniVRM10
};
}
static UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint ExportAimConstraint(VRM10AimConstraint c, Model model, ModelExporter converter)
{
return new UniGLTF.Extensions.VRMC_node_constraint.VRMC_node_constraint
{
Constraint = new UniGLTF.Extensions.VRMC_node_constraint.Constraint
{
Aim = new UniGLTF.Extensions.VRMC_node_constraint.AimConstraint
{
Source = model.Nodes.IndexOf(converter.Nodes[c.Source.gameObject]),
// AimVector = ReverseX(c.AimVector),
// UpVector = ReverseX(c.UpVector),
Weight = c.Weight,
},
},
};
}
static UniGLTF.Extensions.VRMC_vrm.MeshAnnotation ExportMeshAnnotation(RendererFirstPersonFlags flags, Transform root, Func<Renderer, int> getIndex)
{
return new UniGLTF.Extensions.VRMC_vrm.MeshAnnotation

View File

@ -639,36 +639,15 @@ namespace UniVRM10
{
var constraint = ext.Constraint;
var node = Nodes[i];
if (constraint.Position != null)
{
var p = constraint.Position;
var positionConstraint = node.gameObject.AddComponent<VRM10PositionConstraint>();
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)
if (constraint.Rotation != null)
{
var r = constraint.Rotation;
var rotationConstraint = node.gameObject.AddComponent<VRM10RotationConstraint>();
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<VRM10AimConstraint>();
aimConstraint.Source = Nodes[a.Source.Value];
// aimConstraint.AimVector = Vector3InvertX(a.AimVector);
// aimConstraint.UpVector = Vector3InvertX(a.UpVector);
}
}
}

@ -1 +1 @@
Subproject commit f2d8f158297fc883aef9c3071ca68fbe46b03f45
Subproject commit 6fb6baaf9b9095a84fb82c8384db36e1afeb3558