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

MotionBuilder->Unity 24FPSのアニメーション同期の質問です。 #81

Closed kouichirouSatou closed 4 years ago

kouichirouSatou commented 4 years ago

■MotionBuilder MesySyncの検証 MotionBuilderのMeshSyncにて「Samples Per Sec」の設定を「24.00」にし、アニメーションをシンクさせたところ、Unity側に出力されたアニメーションクリップの「.anim」は、24FPSのキーが分配された、60FPSのデータとして出ていていました。

アニメーションキーに隙間が空いていて、Unity側MesySyncの「Animation Interpolation」を「Constant」にしていると、同じ絵が2コマ続く現象が出ます。

MotionBuilder側で「Samples Per Sec」の設定を「60.00」に設定して出力しても、キーの数が増えるだけで、カーブの形状としては24FPSの時と同様でした。こちらも同じ絵が2コマ続く現象が出ます。

■MotionBuilder FBXデータの検証 同環境でFBX経由にて出力したアニメーションクリップを確認すると、24FPSのデータとして出力され、MotionBuilderと絵も一致しました。

■質問内容 24FPS、30FPS、60FPS、120FPSなど、納品媒体によってこれらのFPSの指定が必要になるのですが「Samples Per Sec」の指定と、アニメーションクリップのSamplesを同期させる方法がありますでしょうか。宜しくお願いします。

■検証バージョン Unity : 2019_1_2f_s MotionBuilder : 2019 Mesh Sync : 20190423 OS : Windows10

MotionBuilderToUnity_MeshSync24FPS_test

i-saint commented 4 years ago

レポートありがとうございます。 現状リリースされてるバージョンですと対処方法がありません。根本的に対処するには DCC 側から Unity にフレームレート情報を送ることになりますが、Unity 側でフレームレートを選べるようにすることでもとりあえず対処は可能だと思います。

更新したスクリプトを添付いたしましたので、お手数ですが以下の手順を試していただけますでしょうか。

まだ残る問題がありましたらその旨教えていただけますと幸いです。また、根本的な対処は今後の正式リリースに入れる予定です。

#81

kouichirouSatou commented 4 years ago

早いご対応ありがとうございました。

頂きましたCSファイルにて、再度テストを行いました。

Unity側で「Animation Frame Rate」を24に設定し、アニメーションシンクさせたところ アニメーションクリップは24FPSとして出力され、コンスタントなキーも フレーム毎に段階的な形状を描いていました。

データはFBX経由の物に酷似しているのですが、TimeLineに持ち込んで レンダリング結果を確認したところ、同じ絵を出力している フレームが数か所見つかりました。

TimeLineのアニメーションクリップの扱い方に間違いが あるのかもしれないのですが、FBX経由のアニメーションクリップと MeshSync経由のアニメーションクリップとの違いが見つけられずにおります。

添付しましたZIPファイルは、FBX経由とMeshSync経由のアニメーションクリップデータを カメラに割り当てたものです。79コマ目と80コマ目がMeshSync経由の カメラのみ同じ動きになって、止まっています。

両カメラを選択しつつコマを進めることで、動きの差がご覧いただけ ますので、ご確認をお願いできますでしょうか。

unityMotionBuilder_MeshSyncTest.zip

i-saint commented 4 years ago

情報ありがとうございます。 こちらは調べるのに時間がかかりそうです…。可能であれば MotionBuilder のデータも頂けますでしょうか。メール経由でも構いません。

i-saint commented 4 years ago

長らく対応できておらずで申し訳ありません。本件とりあえず原因と回避策が判明しました。 Text でシリアライズする際に発生する浮動小数点の誤差が原因のようです。回避策として、バイナリでシリアライズするようにする (Edit -> Project Settings -> Editor 内にある設定、Asset Serialization -> Mode を Mixed にする)、または、Animation ウィンドウで該当 Clip を表示し、Set Sample Rate を一度 60 に変えてすぐ 24 に戻す (これでいい感じに誤差が丸められる?) で対応できることが確認できました。 根本的な対策はまだ先になりそうですが、差し当たってバイナリでシリアライズするようにしておけば意図した動作になると思われます。

バイナリでシリアライズする設定: Annotation 2019-09-14 203455

Sample Rate 変更: Annotation 2019-09-14 204029

kouichirouSatou commented 4 years ago

お世話になっております。

ドワンゴ ライブ/映像制作部の佐藤浩一郎です。

MeshSyncのご検証ありがとうございました。

手元のシーンで検証してみたいと思います。

-- /////////////////////////////////////////////////////////////////////////// ///////////// 株式会社ドワンゴ VR事業本部 ライブ/映像制作部

氏名 : 佐藤 浩一郎 E-mail : kouichirou_satou@dwango.co.jp kouichiro_satou@dwango.co.jp /////////////////////////////////////////////////////////////////////////// /////////////

2019年9月14日(土) 20:45 Seiya Ishibashi notifications@github.com:

長らく対応できておらずで申し訳ありません。本件とりあえず原因と回避策が判明しました。 Text でシリアライズする際に発生する浮動小数点の誤差が原因のようです。回避策として、バイナリでシリアライズするようにする (Edit -> Project Settings -> Editor 内にある設定、Asset Serialization -> Mode を Mixed にする)、または、Animation ウィンドウで該当 Clip を表示し、Set Sample Rate を一度 60 に変えてすぐ 24 に戻す (これでいい感じに誤差が丸められる?) で対応できることが確認できました。 根本的な対策はまだ先になりそうですが、差し当たってバイナリでシリアライズするようにしておけば意図した動作になると思われます。

バイナリでシリアライズする設定: [image: Annotation 2019-09-14 203455] https://user-images.githubusercontent.com/1488611/64907646-5078b200-d730-11e9-99a4-280601ec61b3.png

Sample Rate 変更: [image: Annotation 2019-09-14 204029] https://user-images.githubusercontent.com/1488611/64907647-58385680-d730-11e9-8035-d5b70349ae6c.png

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/unity3d-jp/MeshSync/issues/81?email_source=notifications&email_token=AMT5L2LZTEAIDD2BIWF7VCTQJTFFDA5CNFSM4ID4JUSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD6W2FWQ#issuecomment-531473114, or mute the thread https://github.com/notifications/unsubscribe-auth/AMT5L2MQXKIFM4LD4TJAXALQJTFFDANCNFSM4ID4JUSA .

i-saint commented 4 years ago

すみません、訂正です。 上記の回避策は、Animation ウィンドウでは機能しますが、Timeline ウィンドウでは機能しないようです。(Animation ウィンドウと Timeline ウィンドウで Time <-> Frame 変換計算が違う) ただ、原因が浮動小数点の誤差なのは確かです。 Release 20190902 で、Animation Tweak という機能が加わっています。ここに "Time Scale" という項目があるので、Offset を 0.0001 とかにして Apply すると 回避できるようです。これは単純にキーフレームの time にオフセットを加えるだけなんですが、それにより浮動小数点の誤差で前のフレームにずれることがなくなり、解決するという理屈です。 大変醜いですが、おそらく今後のリリースで取る対策も Animation Clip 作成時に微小なオフセットを加えるというものになると思います…。

kouichirouSatou commented 4 years ago

お世話になっております。ドワンゴ ライブ/映像制作部の佐藤浩一郎です。

Timelineウィンドウの件、承知致しました。

現行プロジェクトが納期前で、検証に手が回っていないのですが 過去の検証で、Time Scale にて時間のズレを修正したことがありまして シーンの重さによって、Time Scaleの適用数値を変える必要がある ということに気付きました。

アセット数が多かったり、パーティクルやダイナミクスのような シーン生成のものが増えてくると、遅延幅が広がるようです。

ショットによって、Time Scaleの値を探る必要があるので カット制作のワークフローとして、スピード面で厳しそうですね。。。

今一度、ワークフローの整理と検証行ってみたいと思います。

/////////////////////////////////////////////////////////////////////////// ///////////// 株式会社ドワンゴ VR事業本部 ライブ/映像制作部

氏名 : 佐藤 浩一郎 E-mail : kouichirou_satou@dwango.co.jp kouichiro_satou@dwango.co.jp /////////////////////////////////////////////////////////////////////////// /////////////

2019年9月17日(火) 9:38 Seiya Ishibashi notifications@github.com:

すみません、訂正です。 上記の回避策は、Animation ウィンドウでは機能しますが、Timeline ウィンドウでは機能しないようです。(Animation ウィンドウと Timeline ウィンドウで Time <-> Frame 変換計算が違う) ただ、原因が浮動小数点の誤差なのは確かです。 Release 20190902 https://github.com/unity3d-jp/MeshSync/releases で、Animation Tweak https://user-images.githubusercontent.com/1488611/64145334-5b3f6700-ce53-11e9-8bc1-93f48b865e0f.png という機能が加わっています。ここに "Time Scale" という項目があるので、Offset を 0.0001 とかにして Apply すると 回避できるようです。これは単純にキーフレームの time にオフセットを加えるだけなんですが、それにより浮動小数点の誤差で前のフレームにずれることがなくなり、解決するという理屈です。 大変醜いですが、おそらく今後のリリースで取る対策も Animation Clip 作成時に微小なオフセットを加えるというものになると思います…。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/unity3d-jp/MeshSync/issues/81?email_source=notifications&email_token=AMT5L2POUGDHY45CSQ2ALI3QKARG5A5CNFSM4ID4JUSKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD625LEY#issuecomment-532010387, or mute the thread https://github.com/notifications/unsubscribe-auth/AMT5L2JCMJQ7B2MSUTCEKODQKARG5ANCNFSM4ID4JUSA .

i-saint commented 4 years ago

パーティクルやダイナミクスは再現性がない (deterministic ではない) ので、それが関連しているように思います。これは MeshSync に限らず、alembic や fbx でもつきまとう問題で、現状これといった解決策がありません。 Project Settings -> Time の Maximum Allowed Timestep を小さく (0.01666 = 60FPS など) すれば緩和できるのではないかと思いますが、おそらく完全な解決にはなりません。

現在 preview バージョンの新しい物理システム (Unity.Physics: https://docs.unity3d.com/Packages/com.unity.physics@0.2/manual/index.html) は完全に deterministic な物理エンジンとなっていて、シーンと delta time が同じならどんな環境であっても (x86 でも ARM でも) 結果は同じになるように作られているそうです。ダイナミクスに関しては今後これが解決策になる可能性はあります。

sindharta commented 4 years ago

問題が残りつつも、Offsetで回避ができるということで、一旦この Issue を閉じます。 何か問題・質問があれば、こちらに新しい issueを作っていただけると幸いです。 https://github.com/Unity-Technologies/MeshSyncDCCPlugin