mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-11 13:29:41 -05:00
Merge pull request #957 from ousttrue/fix/drop_lookat_curve_param
正規化時にLookAtのパラメーターが落ちてしまうのを修正
This commit is contained in:
@@ -7,7 +7,7 @@ using UnityEngine;
|
||||
namespace VRM
|
||||
{
|
||||
[Serializable]
|
||||
public class CurveMapper
|
||||
public class CurveMapper : IEquatable<CurveMapper>
|
||||
{
|
||||
public AnimationCurve Curve = AnimationCurve.Linear(0, 0, 1.0f, 1.0f);
|
||||
|
||||
@@ -37,6 +37,12 @@ namespace VRM
|
||||
}
|
||||
}
|
||||
|
||||
public void Assign(CurveMapper mapper)
|
||||
{
|
||||
CurveXRangeDegree = mapper.CurveXRangeDegree;
|
||||
CurveYRangeDegree = mapper.CurveYRangeDegree;
|
||||
}
|
||||
|
||||
public void Apply(glTF_VRM_DegreeMap degreeMap)
|
||||
{
|
||||
CurveXRangeDegree = degreeMap.xRange;
|
||||
@@ -71,5 +77,21 @@ namespace VRM
|
||||
}
|
||||
return Curve.Evaluate(src / CurveXRangeDegree) * CurveYRangeDegree;
|
||||
}
|
||||
|
||||
public bool Equals(CurveMapper other)
|
||||
{
|
||||
if (CurveXRangeDegree != other.CurveXRangeDegree) return false;
|
||||
if (CurveYRangeDegree != other.CurveYRangeDegree) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is CurveMapper mapper)
|
||||
{
|
||||
return Equals(mapper);
|
||||
}
|
||||
return base.Equals(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,6 +228,10 @@ namespace VRM
|
||||
if (src != null)
|
||||
{
|
||||
var dst = root.AddComponent<VRMLookAtBoneApplyer>();
|
||||
dst.HorizontalInner.Assign(src.HorizontalInner);
|
||||
dst.HorizontalOuter.Assign(src.HorizontalOuter);
|
||||
dst.VerticalUp.Assign(src.VerticalUp);
|
||||
dst.VerticalDown.Assign(src.VerticalDown);
|
||||
}
|
||||
}
|
||||
{
|
||||
@@ -236,6 +240,9 @@ namespace VRM
|
||||
if (src != null)
|
||||
{
|
||||
var dst = root.AddComponent<VRMLookAtBlendShapeApplyer>();
|
||||
dst.Horizontal.Assign(src.Horizontal);
|
||||
dst.VerticalUp.Assign(src.VerticalUp);
|
||||
dst.VerticalDown.Assign(src.VerticalDown);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace VRM
|
||||
var go = loader.Root;
|
||||
var fp = go.GetComponent<VRMFirstPerson>();
|
||||
GameObject.DestroyImmediate(go.GetComponent<VRMLookAtBoneApplyer>());
|
||||
go.AddComponent<VRMLookAtBlendShapeApplyer>();
|
||||
var lookAt = go.AddComponent<VRMLookAtBlendShapeApplyer>();
|
||||
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
|
||||
{
|
||||
PoseFreeze = true,
|
||||
@@ -40,9 +40,80 @@ namespace VRM
|
||||
|
||||
var parser2 = new GltfParser();
|
||||
parser2.Parse(AliciaPath, bytes);
|
||||
var loader2 = new VRMImporterContext(parser2);
|
||||
using (var loader2 = new VRMImporterContext(parser2))
|
||||
{
|
||||
Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
|
||||
}
|
||||
}
|
||||
|
||||
Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType);
|
||||
[Test]
|
||||
public void VRMLookAtCurveMapWithFreezeTest()
|
||||
{
|
||||
var parser = new GltfParser();
|
||||
parser.ParsePath(AliciaPath);
|
||||
byte[] bytes = default;
|
||||
CurveMapper horizontalInner = default;
|
||||
using (var loader = new VRMImporterContext(parser))
|
||||
{
|
||||
loader.Load();
|
||||
loader.ShowMeshes();
|
||||
|
||||
var go = loader.Root;
|
||||
var fp = go.GetComponent<VRMFirstPerson>();
|
||||
var lookAt = go.GetComponent<VRMLookAtBoneApplyer>();
|
||||
horizontalInner = lookAt.HorizontalInner;
|
||||
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
|
||||
{
|
||||
PoseFreeze = true,
|
||||
});
|
||||
}
|
||||
|
||||
var parser2 = new GltfParser();
|
||||
parser2.Parse(AliciaPath, bytes);
|
||||
using (var loader = new VRMImporterContext(parser2))
|
||||
{
|
||||
loader.Load();
|
||||
loader.ShowMeshes();
|
||||
|
||||
var lookAt = loader.Root.GetComponent<VRMLookAtBoneApplyer>();
|
||||
Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree);
|
||||
Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VRMLookAtCurveMapTest()
|
||||
{
|
||||
var parser = new GltfParser();
|
||||
parser.ParsePath(AliciaPath);
|
||||
byte[] bytes = default;
|
||||
CurveMapper horizontalInner = default;
|
||||
using (var loader = new VRMImporterContext(parser))
|
||||
{
|
||||
loader.Load();
|
||||
loader.ShowMeshes();
|
||||
|
||||
var go = loader.Root;
|
||||
var fp = go.GetComponent<VRMFirstPerson>();
|
||||
var lookAt = go.GetComponent<VRMLookAtBoneApplyer>();
|
||||
horizontalInner = lookAt.HorizontalInner;
|
||||
bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings
|
||||
{
|
||||
PoseFreeze = false,
|
||||
});
|
||||
}
|
||||
|
||||
var parser2 = new GltfParser();
|
||||
parser2.Parse(AliciaPath, bytes);
|
||||
using (var loader = new VRMImporterContext(parser2))
|
||||
{
|
||||
loader.Load();
|
||||
loader.ShowMeshes();
|
||||
|
||||
var lookAt = loader.Root.GetComponent<VRMLookAtBoneApplyer>();
|
||||
Assert.AreEqual(horizontalInner.CurveXRangeDegree, lookAt.HorizontalInner.CurveXRangeDegree);
|
||||
Assert.AreEqual(horizontalInner.CurveYRangeDegree, lookAt.HorizontalInner.CurveYRangeDegree);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user