unity3d-jp / MeshSync

A package for synchronizing meshes/models editing in DCC tools into Unity in real time.
Other
1.55k stars 174 forks source link

Keyframe Reductionの定義を教えてもらってもいいですか #79

Closed TsuPMC closed 4 years ago

TsuPMC commented 4 years ago

お世話になっております

mayaからのanimationのSyncで質問です

Keyframe Reductionにチェックを入れた際、具体的にどういった処理が実行されるのか差支えなければ改めて伺っても良いでしょうか

とあるsceneで下記のような不具合が出ています skinmeshの人体animationです 人体にはコントロールリグが付いていてそれにanimation keyを打っています

Samples Per Secondを30にして 70frameの尺のanimationをKeyframe Reduction(Keep Flat Curves)でSyncさせようとしています (70frameのうちmayaでanimation keyは必要なところにしか打たれていません)コントロールリグの最初のframeと最後のframeにkeyはちゃんと打っているのですが、どうにも最後のframeのposeの一部がmayaと一致しないという現象が起きています

mayaとUnityで一致しない部分は maya内では60frameからビタ止まりにしているのですが(つまり60frameのkeyと70frameのkeyで値が同じ)SyncしてUnityでanimation clipになると60frameと70frameで微妙に数値が変わっていてビタ止まりになっていないのです

こんな文章だけでは伝わらないでしょうか

簡易モデルのテストデータだと再現しなくて… せめて「Keyframe Reductionにチェックを入れた際、具体的にどういった処理が実行されるのか」がわかればなんとか解明できないかと考えた次第

どうぞよろしくお願いいたします

使用バージョンは各々こちらになります maya2017update5 Unity2018.2.91f

i-saint commented 4 years ago

レポートありがとうございます。返答遅くなりましてすみません。

Keyframe Reduction は、最後のキーの手前に全く同一値のキーが連続している場合、一番手前のものを除きそれを削除するという単純なものです。最初から最後まで変化がないカーブのデータ量を最小化するのが当初の目的だったと記憶しています。
そしてレポートを読んでて気づきましたが、smooth curve だと結果が変わってしまうようです。次のリリースに修正を入れようと思います。急ぎで対応が必要でしたら、カスタムビルドを上げるのでその旨お伝えください。

TsuPMC commented 4 years ago

ご親切なご回答ありがとうございます カスタムビルド頂戴できれば大変ありがたいです お忙しいところ恐縮ですがどうぞよろしくお願い申し上げます

i-saint commented 4 years ago

了解です。来週中には対応します。

TsuPMC commented 4 years ago

大変ありがとうございます

i-saint commented 4 years ago

今立て込んでおりまして、今週中の対応は難しそうです。申し訳ない。 ただ、御社側で以下の対策を入れることで回避できるかもしれません。検討頂けますと幸いです。

TsuPMC commented 4 years ago

あーそういう仕組みなんですね… 社内のエンジニアにちょっと見てもらいます

来週でもいいのでご対応いただけると助かります(アニメーションの本制作はまだまだ続くのです…) どうぞよろしくお願いいたします

TsuPMC commented 4 years ago

すみません、そもそもこれだけの問題でもなかったようです Mayaではリグにanimation keyを打っているのですがUnityでjointにanimationをbakeさせるのに不具合が出ている感じもしています ちょっとこれはきちんとお見せできるサンプルデータを作らないと解決しそうにないのでまた相談させてもらいます

i-saint commented 4 years ago

了解いたしました。

TsuPMC commented 4 years ago

お疲れ様です サンプルデータですが頑張っても再現できませんでした(とほほ)

実は具体的に困っていることは下記のようなことなのです ・Mayaで一つのscene内に一連で作られたanimationを「in」と「loop」という表現の区切りで2clipに分ける必要がある(同じMaya sceneからタイムスライダの範囲設定を変えてUnityの別フォルダへそれぞれSyncしてclipを生成) ・Keyframe ReductionでSyncするとinとloopの区切りでanimationがカクついてつながらない場合がある その場合のanimation clipを調べてみるとinの最後のフレームとloopの最初のフレームで値が一致していない箇所がある ・mayaではinとloopの区切りのフレームには強制的にkeyを打っている ・Samples Per Secondは主に30にしている(フレームレートを30にしているのでReductionのkeyの取りこぼしがないかと思って ちなみに60にしてみても結果は同じでした むしろ絶対とりこぼしたくないkeyだけは拾えるもっと少ないSample数だと一致したりもしたのですが…) ・カーブはsmoothである

で、 「AnimationCurve の最後の 2 つのキーの値が同じであり、かつそれ以前とキー間のインターバルが大きく異なる場合、reduction されたものと判別できる ↑に該当する場合、最後の 2 つのキー間の tangent を水平に変える処理を入れる」 だけで回避できるものでしょうか…(社内のエンジニアでテストはしてみようと思いますが…)

例えば「最後のフレームにMayaでkeyが打たれていればそれをそのまま強制的に出す」わけにはいかないものでしょうか それならば少なくともinとloopのカクツキは回避できるような気がしますが根本的には違うのですかねぇ

もし この文字と画像だけの情報で何かおわかりになることがございましたらご教示いただけますと助かります どうぞよろしくお願いいたします MS_KeyReduction002

i-saint commented 4 years ago

それは私が予想していた意図しない補間カーブ問題とは違いそうです。 念の為確認したいのですが、Keyframe Reduction 有効時 限定 の問題なのは確定しておりますでしょうか。

「最後のフレームにMayaでkeyが打たれていればそれをそのまま強制的に出す」

既にそうなっているはずなので、そもそも Keyframe Reduction が原因なのか疑問に思った次第です。 いずれにせよ、問題を再現できるデータがないと解決は難しいと思います。メールでも結構ですので、送っていただけると幸いです。

TsuPMC commented 4 years ago

お世話になっております

よーくよーく見たらreduction設定で最後にkeyが打たれるものと打たれないものがあるようです テストデータをお送りします inとloopでanimationはつながっているデータになりますが reduction時最後のフレームにkeyが打たれるものと打たれないものがあるのが確認できます これで何かわかると良いのですが…

190723_ReductionTest.zip

maya:2017 update5 unity:2018.2.9f1 MS_KeyReduction004

どうぞよろしくお願いいたします

i-saint commented 4 years ago

ありがとうございます。 ちょっと今すぐには着手できないですが、調査します。

TsuPMC commented 4 years ago

ひとつお伝え忘れがありました

テストデータは 101-171:in 171-201:loop で作成しています

TsuPMC commented 4 years ago

お疲れ様です 追加でKeyflame Reductionで質問です 1-61のanimationをMayaで30FPSで作成し、animation Syncした場合 ①「Samples Per Second = 2 Keep Flat Curvesにチェックを入れない」   →できたanimation clipは0:00, 0:30, 1:00, 1:30, 2:00にkeyが打たれる

②「Samples Per Second = 2 Keep Flat Curvesにチェックを入れる」   →できたanimation clipは0:00, 0:15, 0:30, 0:45, 1:00, 1:15, 1:30, 1:45, 2:00にkeyが打たれる

ようです Keep Flat Curvesにチェックを入れると 初期フレームにのみkeyが打たれているだけのanimationは最終フレームに強制的にkeyが打たれますが 初期フレームだけでなくanimation keyが任意に打たれているanimation CurveはSamples Per Secondの倍でkeyが打たれる…ようになっているように見受けられます

この挙動も意図しているのか合わせてご確認いただけますと助かります どうぞよろしくお願いいたします

i-saint commented 4 years ago

一点、Keyframe Reduction 無効化で正しい結果になるのか (最悪それで乗り切ることが可能であるか) だけ教えていただけますでしょうか。

TsuPMC commented 4 years ago

現在は ①Keyframe Reductionを使用 inとloopが合わないときだけ ②_1 Keyframe Reductionを無効 でフルベイクで出しています ②_2 またはinとloopが合わないmotionだけmayaで事前にフルベイクしてしまい、Keyframe Reductionを使用

でやっています

i-saint commented 4 years ago

ありがとうございます。

mayaで事前にフルベイクしてしまい、Keyframe Reductionを使用

これでベイク前と違う結果になるのは完全に予想外でした。

TsuPMC commented 4 years ago

あっごめんなさい >mayaで事前にフルベイクしてしまい、Keyframe Reductionを使用 は嘘でした 他の事柄と混乱してしまいました

②_1 Keyframe Reductionを無効 でフルベイク でおしまいです

>mayaで事前にフルベイクしてしまい、Keyframe Reductionを使用 しても最後のkeyは打たれないので最後のkeyがmayaと合いません

誤報を出してしまい申し訳ないです よろしくお願いいたします

i-saint commented 4 years ago

なるほど、了解です。

i-saint commented 4 years ago

keyframe reduction は根本的に作り直しました。 削除しても補間により結果にほぼ (閾値で調節可) 影響がないキーのみを削除する、本来あるべき挙動になりました。設定項目は Unity 側に移動し、DCC 側は無くなりました。 開発中のバージョンは色々変わりすぎていて、この変更だけを適用したバージョンをお渡しするのは難しい状態です。次バージョンは今月末のリリースを目指して作業中なので、もう少しお待ち下さい。 keyframe_reduction

また、本件とは直接の関係はありませんが、次のリリースには頂点キャッシュの仕組みが入る予定です。これは端的に説明すると「Unity 専用である代わりにめっちゃ速い Alembic」的なもので、Alembic For Unity で Alembic を再生するより 10 倍近く速く再生できます。 時期的に今のそちらのプロジェクトに使うのは無理だと思われますが、今後候補に入れて頂けると幸いです。 (ここしばらく急ぎの案件でレイトレ影とこの頂点キャッシュかかりっきりでした。本件が後回しになってしまっていたことをお詫びいたします)

TsuPMC commented 4 years ago

承知しました お忙しいのは存じておりましたのでご対応いただけてありがたいです >「Unity 専用である代わりにめっちゃ速い Alembic」的なもの 楽しみですねぇ リリースを心待ちにしております ご連絡どうもありがとうございます

i-saint commented 4 years ago

https://github.com/unity3d-jp/MeshSync/releases/tag/20190902