diff --git a/Assets/VRM10/Editor/VRM10ExportSettings.cs b/Assets/VRM10/Editor/VRM10ExportSettings.cs
index 9b328e5a2..f191598d5 100644
--- a/Assets/VRM10/Editor/VRM10ExportSettings.cs
+++ b/Assets/VRM10/Editor/VRM10ExportSettings.cs
@@ -10,23 +10,31 @@ namespace UniVRM10
///
/// エクスポート時にBlendShapeClipから参照されないBlendShapeを削除する
///
- [Tooltip("not implemented yet. Remove blendshape that is not used from BlendShapeClip")][ReadOnly]
+ [Tooltip("not implemented yet. Remove blendshape that is not used from BlendShapeClip")]
+ [ReadOnly]
public bool ReduceBlendshape = false;
///
/// skip if BlendShapeClip.Preset == Unknown
///
- [Tooltip("not implemented yet. Remove blendShapeClip that preset is Unknown")][ReadOnly]
+ [Tooltip("not implemented yet. Remove blendShapeClip that preset is Unknown")]
+ [ReadOnly]
public bool ReduceBlendshapeClip = false;
[Tooltip("Use sparse accessor for morph target")]
public bool MorphTargetUseSparse = true;
+ ///
+ /// FreezeBlendShape
+ ///
+ [Tooltip("freeze rotation and scale and blendshape")]
+ public bool FreezeMesh = false;
+
public GltfExportSettings MeshExportSettings => new GltfExportSettings
{
UseSparseAccessorForMorphTarget = MorphTargetUseSparse,
ExportOnlyBlendShapePosition = true,
- DivideVertexBuffer = true,
+ DivideVertexBuffer = true,
};
public GameObject Root { get; set; }
diff --git a/Assets/VRM10/Editor/Vrm10ExportDialog.cs b/Assets/VRM10/Editor/Vrm10ExportDialog.cs
index 51b2e4d3f..729e8d848 100644
--- a/Assets/VRM10/Editor/Vrm10ExportDialog.cs
+++ b/Assets/VRM10/Editor/Vrm10ExportDialog.cs
@@ -258,6 +258,24 @@ namespace UniVRM10
string m_logLabel;
+ class TmpDisposer : IDisposable
+ {
+ List _disposables = new();
+ public void Push(UnityEngine.Object o)
+ {
+ _disposables.Add(o);
+ }
+
+ public void Dispose()
+ {
+ foreach (var o in _disposables)
+ {
+ GameObject.DestroyImmediate(o);
+ }
+ _disposables.Clear();
+ }
+ }
+
protected override void ExportPath(string path)
{
m_logLabel = "";
@@ -268,11 +286,35 @@ namespace UniVRM10
try
{
+ using (var disposer = new TmpDisposer())
using (var arrayManager = new NativeArrayManager())
{
+ if (m_settings.FreezeMesh)
+ {
+ Debug.Log("vrm-1.0 FreezeMesh");
+ var copy = GameObject.Instantiate(root);
+ disposer.Push(copy);
+ root = copy;
+
+ // Transform の回転とスケールを Mesh に適用します。
+ // - BlendShape は現状がbakeされます
+ // - 回転とスケールが反映された新しい Mesh が作成されます
+ // - Transform の回転とスケールはクリアされます。world position を維持します
+ var newMeshMap = BoneNormalizer.NormalizeHierarchyFreezeMesh(root);
+
+ // SkinnedMeshRenderer.sharedMesh と MeshFilter.sharedMesh を新しいMeshで置き換える
+ BoneNormalizer.Replace(root, newMeshMap, true, true);
+ }
+
var converter = new UniVRM10.ModelExporter();
var model = converter.Export(arrayManager, root);
+ // ///
+ // /// freezeblendshape
+ // ///
+ // [tooltip("freeze rotation and scale and blendshape")]
+ // public bool FreezeMesh = false;
+
// 右手系に変換
m_logLabel += $"convert to right handed coordinate...\n";
model.ConvertCoordinate(VrmLib.Coordinates.Vrm1, ignoreVrm: false);