uLipSync
uLipSync copied to clipboard
uLipSyncTimelineEventの挙動の修正
概要
現在、Timelineとの連携の際に以下のような問題があります。
- TimelineのProcessFrameのタイミングでリップシンクを動かすことができない(全てUpdateのタイミングになってしまう)
- uLipSyncClipが無い箇所を再生していてもLipSyncUpdateEventが呼ばれてしまう
そこで、uLipSyncClipがある箇所を再生しているときだけ、uLipSyncTimelineEventのLipSyncUpdateEventをProcessFrameのタイミングで呼び出すように変更しました。
この変更は本来の実装の意図と異なっている可能性がありますので、ご意見頂けますと幸いです:bow:
詳細
uLipSyncMixer側
再生している箇所にuLipSyncClipがある場合のみ、OnFrameを呼び出すようにしました。
uLipSyncTimelineEvent側
OnFrameが呼び出された直後にLipSyncUpdateEventを発火させるだけの実装に変更しました。
問題点
uLipSyncTimelineEventのLipSyncUpdateEventに自作のイベントを登録している場合は挙動が変わってしまいます。 そのため、アナウンスをするか従来の挙動をするイベントを用意する必要があるかもしれません。 (個人的には従来の挙動をするイベントもあると分かりづらくなってしまうと思うので、アナウンスだけで良いかもしれません)
プルリクありがとうございます🙇 問題点把握いたしました。
仰るように Update()
タイミングだと微妙ですね。何かしら修正が必要そうです。。
ただ現在の仕様は、Timeline での情報を受け取って uLipSyncBlendShape
が動いてくれるように実装しています。
その関係で BakedFrame
をキャッシュしておいて毎フレーム呼び出す、という実装になってしまっております。
(ただ今の実装もタイムライン実行にも関わらずフィルタでぬる〜〜っと口が動いて目的位置に到達する、みたいな挙動をするのでここも改善したい次第です…)
OnFrame()
タイミングでのみイベントを受け取るけれどタイムライン上で uLipSyncBlendShape
がプレビューできる、みたいな実装がなにかあれば良いのですが…、すぐには思いつかないためもう少し時間をいただけると助かります。
現在の実装
ご提案いただいた実装
なるほど…確かにそうですね… ありがとうございます 僕の方でも良い方法が無いか考えてみます:bow:
ありがとうございます!🙇♂️
おそらく根本としては私の設計が悪いところがあります... 毎フレーム更新前提の uLipSyncBlendShape
をそのまま流用できるように、解析結果を保存した BakedData
のフレーム情報を流し込む、という手法をとっていますが、あるフレームを指定するとそのフレームの結果が決まるようなタイムラインの手法と相性が良くないのですよね... (フィルタでスムージングしたりするので前の方のフレームの影響を受けるため)。
後は uLipSyncTrack
のパラメタとして更新方法を指定するのもありかもしれません。毎フレーム呼ぶか、クリップがあるときだけ呼ぶかみたいな設定を持ち、Mixer でその設定に従って処理をして、その設定も含め uLipSyncTimelineEvent
へ流す、というイメージです。もう少し推敲してみます。