Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[exporter][blendshape][bake] 基準メッシュバグ #2466

Merged
merged 2 commits into from
Oct 21, 2024

Conversation

ousttrue
Copy link
Contributor

@ousttrue ousttrue commented Oct 18, 2024

fixed #2465

blendshapeを変化させた状態で bake したときに、
最初に 0 クリアすることで base mesh が意図したものではなく、
すべて 0 のもになる。
かつ、ループが進むごとに変化状態に復帰する bug。

  • 0.x, 1.0
  • すべての blendshape が 0 じゃない
  • export 時に pose_freeze オプション

で発動

BlendShapeを上げた状態を基準にbakeすることができない。

blendshapeが一個進むごとに基準meshが変わる動きになりうる!
@ousttrue ousttrue changed the title ここで全部クリアすると基準メッシュがすべてのBlendShapeを0にしたものになり、 [blendshape][bake] 基準メッシュバグ Oct 18, 2024
@ousttrue ousttrue added the mod_export For example, remove bone label Oct 18, 2024
@ousttrue ousttrue added this to the next export bake 関連 milestone Oct 18, 2024
@ousttrue ousttrue added the bug Something isn't working label Oct 18, 2024
@ousttrue ousttrue requested a review from Santarh October 18, 2024 08:38
@ousttrue ousttrue changed the title [blendshape][bake] 基準メッシュバグ [exporter][blendshape][bake] 基準メッシュバグ Oct 18, 2024
@Santarh
Copy link
Contributor

Santarh commented Oct 21, 2024

#2465 の挙動について理解はするのですが、この修正によって意図しない挙動となるパターンもあるかと思います。
Issue の例で言えば、裏返しの見方として「口 Expression の定義は半目ではないのに、出力したら半目のままになった」となるでしょう。

  • 😄 出力時にベース表情を気軽に変更できる
  • 😢 表情ファイルの定義とは異なる表情が出力されてしまう(暗黙的)

ということです。
このように「Expression 定義に設定した通りの Expression が出力されなくなる」のは事実なので、それを是とするのかどうかは重要です。

この PullRequest 以外の解決方法としては「Pose Freeze で BlendShape がベイクされる挙動をやめる」があるかなと思います。

  • 😄 Neutral Expression 含め、表情ファイルの定義通りの表情が出力される(明示的)
  • 😢 表情定義の手間が多少大変

しかしそれはそれでデメリットはもちろんあります。

この問題は UniVRM 仕様としての決めの問題なので、自分としてはどちらがいいのかという意見は持ちませんが、どちらを是とするのかは決めていただければと思います。

@ousttrue
Copy link
Contributor Author

Pose Freeze と Morph Freeze を別のオプションにしようと思います。

var meshFreeze = ToggleIsModified("FreezeMesh", ref MeshUtility.FreezeMesh);
var meshFreezeKeepRotation = ToggleIsModified("FreezeMeshKeeprotation", ref MeshUtility.FreezeMeshKeepRotation);
var meshFreezeUseCurrentWeight = ToggleIsModified("FreezeMeshCurrentBlendShapeWeight", ref MeshUtility.FreezeMeshCurrentBlendShapeWeight);
return meshFreeze || meshFreezeKeepRotation || meshFreezeUseCurrentWeight;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BlendShapeRotationScaling が 3つに分離。

  • FreezeMesh
  • suboption: FreezeMeshKeeprotation(回転を残す正規化)
  • suboption: FreezeMeshCurrentBlendShapeWeight(blendShape bake)

FreezeMeshKeeprotation は実装していたけど外出ししていなかった(
bakeのバグが難航していたため)

@@ -120,7 +120,7 @@ Transform[] dstBones
return newBoneWeights;
}

public static Mesh NormalizeSkinnedMesh(SkinnedMeshRenderer src)
public static Mesh NormalizeSkinnedMesh(SkinnedMeshRenderer src, bool bakeCurrentBlendShape)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bakeCurrentBlendShape を追加して、
MeshFreeze 時に BlendShape を焼くか否かを明示するようにしました。
ここに引数を伝達するために呼び出し側に波及しています。

@@ -237,7 +257,7 @@ private static void BakeBlendShapes(SkinnedMeshRenderer src, Mesh mesh)
throw new Exception("different vertex count");
}

src.SetBlendShapeWeight(i, backcup[i]);
src.SetBlendShapeWeight(i, blendShapeBase == null ? 0 : blendShapeBase[i]);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bake するときは base 状態に復帰し、
bake しないときは 0 にクリアする。

@ousttrue
Copy link
Contributor Author

freezepose

glb, vrm-1.0 のオプションを追加しました。
vrm-0.x は前と同じ動作ということで変更を見送りました(正規化とbakeがセットで決め打ち)。

Copy link
Contributor

@Santarh Santarh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

場所によって bakefreeze の名称が五分五分で使われているのが気になりました。
使い分けがあるなら大丈夫です。

@ousttrue
Copy link
Contributor Author

bake はテクスチャー用語ぽい。

@ousttrue
Copy link
Contributor Author

https://docs.unity3d.com/ja/2023.2/ScriptReference/SkinnedMeshRenderer.BakeMesh.html
これに由来して bake も使っている。

@ousttrue ousttrue merged commit d7a0357 into vrm-c:master Oct 21, 2024
1 check passed
@ousttrue ousttrue deleted the fix/expression_bake_bug branch October 21, 2024 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working mod_export For example, remove bone Non breaking changes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Pose Freeze によって BlendShape を ベイクすると他の BlendShape が壊れる
2 participants