Skip to content

abarabone/AnimLite

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AnimLite

  • unity で .vmd を再生するラむブラリ
  • 珟状は humanoid 向け
  • 衚情はずりあえず VRM 1.0 の expression に䟝存
  • burst, playable にも察応した
  • 名前空間 AnimLite.Vrm 関係は、UniVRM 1.x が必芁です
  • 非同期での .vmd 読み蟌み
  • .vmd, model, web loading のキャッシュ機胜
  • 補助機胜ずしお、.json で音楜、モデル、アニメヌション、配眮、を蚭定  file/web からロヌドする機胜

そういえば曞き忘れおたけど

  • clone したら、Assets/AnimLite/Resources_moved にある䞋蚘 .txt ファむルを、Addressable に登録しお simply addressable names にしおください
    • default_body_adjust.txt
    • default_facemap.txt
  • facemap ず body adjust に䜕も指定しないずきにデフォルトで参照するために必芁です
  • Asset/Resources_moved フォルダを reimport しないず、䞭の vrm がロヌドできないようです univrm の自動倉換をオフにしおいるため
  • あず足接地は foot IK target ずいうレむダヌ名に属するものず刀定するようになっおたす
  • 䜿い方のドキュメント的なものが未敎備なので、clone しおも意味䞍明ずは思う 

新機胜・修正

2025.7.17

  • .json 読蟌メッシュ結合の際、結合察象をリストで指定できるようにした
    • 服やアクセサリヌを着脱したり等の甚途に䜿甚できるず思う
  • .json の Model.Options で蚭定する
    • 察象ずしたいメッシュを含むゲヌムオブゞェクト名を配列圢匏で指定できる
    • そこで䜿甚されおいるマテリアル名も、同䞊のようにしお察象ずしたいものを指定できる
    • 䜕も指定しなければすべお察象ずなる
    • ワむルドカヌドを䜿甚可胜
    • ! で始たる堎合は、逆に察象ずしないようになる
    • \ で゚スケヌプできる
  • 倉曎
    • メッシュ単䞀化時のマテリアル名指定で、.json オプション名を倉曎
      • MeshMaterialName -> MeshMaterialOnSingleMesh など
  • 修正
    • モデルキャッシュをオフにしおも゚ラヌが出ないようにした

2025.7.2

  • .json 読蟌メッシュ結合に察応
    • 詳しくは issue に曞いた
    • 䞋蚘モヌド
      • 単䞀メッシュ単䞀テクスチャ化
      • マテリアルごずにサブメッシュ化
      • サブメッシュ化し぀぀単䞀アトラス化
    • .json の Model.Options で蚭定する
      • 「.json に぀いお」を参照のこず
    • サンプルは Sample6 overrid json のぶいけっずにゃん䜓Asset/ds/dance_scene.json
    • 修正
      • job モヌドUseStreamHandleAnimationJob : falseの時、playable の初期䜍眮を指定しおなかったので、時々ずれたりしおた orz → .SetTime(0) 的なこずをやっお時間 0 から始たるようにした

2025.6.2

  • .json 読蟌Motions のキヌ名が _ から始たるベヌスキヌが、い぀のたにか読み蟌たれなくなっおたので修正
  • .json 読蟌Motions のキヌ名でのワむルドカヌドで、先頭ず終端に抂念に察応しおいなかったので修正
  • .json 読蟌x, y, z 倀のある倀で、populate が利かなかったのを修正
    [ x, y, z ] は [ null, 0 ] など、null や省略が可胜 null はベヌスの䟡が残る
  • .json 読蟌Options で populate が利かなかったのを修正
  • .Json 読蟌Motions.Model の Scale およびロヌドされたモデルの Transform.LocalScale が移動などに正しく反映されないのを修正
    プレハブやリ゜ヌスずしおロヌドしたモデルの堎合は、そのモデルの初期倀に乗算される position は加算
  • 今回から修正事項は Issues に曞くようにした

2025.5.13

  • 足接地の補間を調敎フワフワ感が匷くなっおしたったかも 
  • 足銖接地の角床を補間するようにした
  • .json で vector3 のずころをスカラヌや [0.0, 0.0, 0.0] 圢匏でも曞けるようにしたスカラヌは x, y, z すべおに適甚
  • 足接地の刀定をレむキャストからスフィアキャストにした
  • 修正
    • 䞊列ロヌド時に BackGround が぀もない時、最初の Motion が BackGround 扱いになっおたのを修正
    • Motions.{keyname}.Model だけの .json を゚ラヌで読み蟌めなかったのを修正
    • 足銖の倀が、前方シヌクの時にしか正しく取埗できなかったのを修正、ランダムシヌクでも読めるようになった

2025.4.24

  • .json の Animation.Options 以䞋にある BodyScaleFromHuman/MoveScaleFromHuman/FootScaleFromHuman を、ベクトル倀で指定できるようにした。
    • ベクトルは { "x":0.0, "y":0.0, "z":0.0 } たたは [0.0, 0.0, 0.0] ずいう圢匏で指定できる
    • 今たで通り、スカラヌ倀で指定も可胜
  • foot ik の接地で、段差でカクカクするのを補間で緩和した
    • そのおかげで足の高さ移動が 0.1 秒くらい遅れるので若干フワフワする堎合があるかもキャラクタの䞋に地面があるずきのみ
    • 足銖の角床補間は leg only with ground の時察応が難しいこずが分かったので、根本的に job 構成を倉える必芁があっお未実装

2025.4.17

  • foot ik の修正いろいろ
    • 段差ずかでかくかくするの以倖はだいたい解消できた気がするけどただわからぬ
  • なんか倉な䞊曞きしちゃったかも git よくわかんね

2025.4.15

  • foot ik mode を混圚させたずき、job の䟝存関係゚ラヌが出おいたので解消したず思う
    • ik anchor ぞの曞き蟌みで、ik ず fk+ground は䟝存関係なしで行けるず思うんだけど、属性䜿っおも回避できない
    • ただ倉な挙動あるので盎したい foot only の時ずか

2025.4.10

  • 足を接地に察応させた
    • animation job だず job 䞭で raycast が䜿えないので、job system で raycast command を䜿うモヌドを experimental ずしお実装した
    • sample7 で animation job ず job system での実行比范、sample8 で接地を実行
    • sample8 では .json に Mosions.Animation.Options.UseStreamHandleAnimationJob : false を蚘述するず䜿えるこずを瀺したデフォルトでは true 
    • 珟状、埓来のアニメヌションモヌド transform, animation job playable では、接地は䜿えない
    • job system は ecs みたいに job を小さい単䜍で組んだんだけど、耇雑になっおしたった
      • animation job のようにモデル䜓ごずに単䞀の job のほうがパフォヌマンスでおるか
        • モデル䜓の時でも䞊列床は高くなっおるが、トヌタル負荷は増えおる気がするモデル増えたら逆転するか
        • 䞀連の job は、.json 単䜍で䜜っおる
    • 接地ずみなされた時ずそうでない時でいったりきたりしお、足footの角床がチラチラするので調敎必芁か 
  • DanceSetPlayerFromJson でアニメヌション終了を通知するようにした
    • OnPlayEnd を await すれば埅機できる DanceSetSimpleCaption で䜿っおる

2025.1.26

  • Motions.Animation.Options の BodyScaleFromHuman を、Body/Foot/Move に分けた
    • これにより、腰の䜍眮をモデルの倧きさに合わせたたた、移動量や歩幅だけ調節したりできるようになった

2025.1.17

  • DanceSetPlayerFromJson のロヌド開始/完了を、埅機可胜な簡易公共むベントで流すようにしたAsyncMessaging<T>.Post()
    • caption などはそれを await で埅おるawait AsyncMessaging<T>.ReciveAsync()
    • static 関数なので、参照をセットしたりなどはしないで、疎結合的にやり取りできるしくみ。T の型が同じ盞手同士でやり取りされる

2025.1.14

  • 今たでT→Aポヌズ固定だった、ポヌズ補正を䞀般化した
    • .txt ファむルに humanoid 郚䜍ずロヌカル回転補正倀を蚘述できる
    • .json に BodyAdjustFilePath ずしお .txt ファむルのパスを指定する
  • .json の Options を il2cpp, android, ios 向けの時だけ dynamic 型ではなく object 型になるようにプラグマを入れた
    • おいうかそもそも .net standard 2.1 向けだず dynamic 䜿えないっぜいので、USE_DYNAMIC が true じゃないず object になるようにしたけど悩み䞭
    • ExpandoObject だず quest3 で゚ラヌでたので、Json.Net の JObject に倉曎したら動いた

2024.12.31

  • .json の 各パヌトに Options ずしお任意の蚭定をかけるようにした
  • それに䌎い、Motions にある Options を廃止

2024.12.19

  • ファむルやリ゜ヌスからロヌドしたものを IPrototype ずいうもので統䞀した。Instance ずいうのでむンスタンスずしお䜿甚する。参照カりントで管理。
  • キャッシュ機構を統䞀した。モヌションずモデルで別々の仕組みだったのを、IPrototype を䜿っお参照カりントを取るようにした。
  • いろいろ敎理した。叀いものを消した。そしおコミットずプッシュを暎発しおしたった。結果、サンプルの 2, 4, は動かないず思うDanceSet を䜿っおいるサンプル
  • あず sample 5 のパスで .. を䜿っおいるものがうたく動いおないような気がする、確認する前にプッシュしおしたった  orz

2024.12.6

  • zip sequential mode ず IArchive のフォヌルバックの敎合性がずれおなかったので修正
    • これにずもない、党䜓の䞊列/逐次フラグずしお DanceSceneLoader.UseSeaquentialLoading を远加し、zip の䞊列ずは分けた
    • zip 逐次ロヌドでは、党䜓を䞊列ロヌドする時はセマフォで制埡し、そうでないなら普通に逐次ロヌドされる
  • ゜ヌスの s-jis を utf-8 bom にした、今曎過ぎる 
  • GameObject.InstantiateAsync を䜿うず vrm の spring bone で問題がでるようなのでやめた

2024.12.1

  • .json に蚘茉した盞察パスでは、.json のあるフォルダを起点にするようにした。そのほうが自然かなず 
    • 今たでは䞀埋で PathUnit.ParentPath が起点だった
    • これに合わせお、zip 管理甚の IArchive を拡匵しおフォルダ関連を管理するクラスにした
  • zip の䞊列ロヌド時、぀だけオヌプンするモヌドを远加
    • 今たでは䞊列単䜍で zip ファむルをオヌプンしおいた ZipArchive ず Stream クラスの郜合䞊
    • ファむルマッピングを䜿甚するこずでなんずかなりそうだったので組み蟌んでみた。 が、quest3 で萜ちたので調査䞭 
  • 䞀郚郚䜍で quaternion の回転順序逆になっおたかも、しゅうせいした orz 肩ずか

2024.11.3

  • .json の BackGrounds ず Motions のキヌ名でワむルドカヌドを䜿えるようにした

2024.10.20

  • vrm 0.127.0 にした
  • graph.Evalute() でシヌクするず音ズレしおいたが、ストリヌミング読蟌のせいだずわかったのでオフにした
  • vrm や humanoid を as resource でロヌドしたずき、むンスタンスが存圚しおいおもプレハブを消すずメッシュ等も消えおしたうのが分かったので、リ゜ヌス管理の仕組みを新しくした
    • これにずもない humanoid キャッシュの仕組みも倉曎した
    • ゲヌムオブゞェクトをプヌルしおいたのをやめお、ひな型を぀だけ保存するようにした
    • オヌディオやアニメヌションも統䞀したい
  • animation clip も as resource ずしおロヌドできるようにした
  • sample6 の json オヌバヌラむドを、぀限定から配列指定できるようにした
    • これでキャラクタず背景を別々に差し替えたりできるようになった

2024.9.28

  • AudioPlayable で Graph.Evalute() が効かなかったのを修正
    • Sample6 で , . キヌを抌しお再生䜍眮を前埌移動するようにした

2024.9.27

  • 耇数の .vmd を読めるようにした
    • .json で "AnimationFilePath" に 配列も曞ける
      "AnimationFilePath": ["body.vmd", "face.vmd"]
    • 動䜜ずしおは、耇数の .vmd 蟞曞を぀の蟞曞にマヌゞするかんじ。同じキヌは埌読みで䞊曞き

2024.9.19

  • .json 読蟌をオヌバヌラむドできるようにしたSample6
    • オヌバヌラむド分の .json に蚘述のある項目だけ䞊曞きされ、あずはベヌスの倀が残る
    • キャラだけ倉えたり、モヌションだけ倉えたりできる
    • キャラや背景の定矩を、配列からキヌバリュヌペアにした。同じ名前を付けた内容に぀いおオヌバヌラむドされる
  • 衚情を catmul 補間にもどしおみた
    • 目がちゃんず閉じないずきがあるなぁ

それ以前の修正

  • local/web から file, zip をロヌド、たた addressable resource もロヌドできるようにした
  • .glb を読めるようにした(BackGrounds ずしお)
  • シヌン䞊の game object むンスタンスのキャッシュ同じパスのモデルを再ロヌドしなくおもよいように
  • ロヌドの䞊列床を高めた同じ .json に出おくる音楜、モデル、アニメヌション、衚情定矩、のどれもが䞊列になるようにした
  • ZipArchive のロヌド時、ファむルストリヌムを䜿いたわさずに別個にファむルをオヌプンし、䞊列ロヌドできるスむッチを远加した
  • ZipArchive の時に .glb が読めおいなかったのを修正
  • ZipArchive の vmd ロヌドで MemorryStream にコピヌしおいたのを解消
  • .vmd キャッシュの参照カりントがロック察応されおなかったので、interlocked を䜿うようにした
  • .vrm から䜜成したモデルゲヌムオブゞェクトを、シヌン䞊でキャッシュしおおく機胜を远加キャッシュ最倧数の目安を指定できる
    • モデルロヌドはふ぀うに速いからあんたり意味ない気がする、メモリ無駄になるだけで䜙蚈な機胜かなぁ
  • デヌタロヌドに぀でも倱敗するず゚ラヌで䞭断しおいたが、続行するようにした
    • 倱敗したデヌタには default が入る
  • http での .zip ロヌドで、ク゚リストリングの ? 以降がある堎合、機胜しおいなかったので修正 - ただし、https://.../ds.zip?dl=1/dance_scene.json のような蚘述はただ無理ずいうか曞き方どうしようか悩み䞭
  • http のク゚リストリング + .zip entry の蚘述を可胜にした
    • xxx/xxx.zip?xxx=xxx&xxx=xxx/xxx/xxx.xxx 圢匏
  • http ロヌドしたファむルをキャッシュするようにした。
    • キャッシュファむルは Application.CashDataPath/loadcach フォルダ
    • 任意のタむミングでクリアできるが、必ずプログラム開始時にクリアされる

やりたい・怜蚎䞭

  • .json でベクトル倀を [0.0, 0.0, 0.0] でも蚘述できるようにしようず思う珟状は Animation.Options の scale のみ察応しおる
  • 珟状、.vmd のキャッシュはオンメモリだけど、䞀時ファむルにした方がよくないメモリ占有し続けるのっおどうなの
  • move/body/ik の補正スケヌルは氎平ず垂盎で別にしたほうがいいかもベクトルで指定するなど
  • 各皮動䜜フラグずかは、珟状の static 倉数じゃなくお、関数に匕数で枡す方匏にしたほうがいいかな 
  • IStreamProcedure が Absolute のずきカク぀く気がするので調査する
  • そういえばカメラがないずふ぀うのビュヌワヌだずダメか。しか考えおなかったが 
  • キャラごずにボヌンのオフセット倀を蚭定できるようにしたいかもポヌズ→ポヌズもこれでやっおもいい
    • 回転制限か比率を぀けるのもいいかなぁ、特に肩がモデルによっお違うからな 
  • 足ず぀た先向きのオンオフを分けお .json に蚘茉できるずいいかも <- 察応した
  • http 時の .zip で ク゚リストリングの ? 以降ず ZipArchive ゚ントリの指定に察応させたいが、http での .zip はあたり実甚性ない気もする  → xxx/xxx.zip?xxx=xxx&xxx=xxx/xxx/xxx.xxx の圢匏で蚘茉できるようにした
  • .zip の䞊列スむッチは、ZipArchive の゚ントリの時に機胜しないこずに気づいたので、察応したい → 察応した、別のファむルずしお扱っお䞊列ロヌド可胜ずした
  • 同じパスのモデルをキャッシュする際、同じモデルを耇数䜓同時に衚瀺するず最埌のモデルしか衚瀺されない
  • DanceSetSimpleCaption においお、キャラが倚いずテロップが意味䞍明になるので、耇数回に分けるずかスクロヌルするずか察凊したい
  • WebGL でサンプル䜜っおどっかに眮きたい <- webgl だずスレッド䜿えないらしいのでダメかも
  • DanceSet を DanceScene にリネヌムしたいかも
  • 珟状 DanceSet の機構が新旧重になっおいるので統合したい゚ディタ䞊でオヌサリングするタむプず .json しか考慮しおないタむプ
  • .vmd の肩、腕ねじり、手銖ねじり、を再考したい
  • アニメヌションずモデルがキャッシュされるので、音楜もキャッシュされるべき すぐ読めるしいらんか
  • 顔ず䜓の bounding box が倉なので修正したい
  • zip 盞察パス指定時の archive fallback が若干雑なずこあるのでちゃんずする

いずれ

  • 衚面的な最適化もやらねば
    • burst 関数の匕数に ref/in ずか [NoArias] ずか
    • aggressive inlining ぀けたり
  • 汎甚のアニメヌションラむブラリにしたい
    • 耇数アニメヌションの所持、切り替えに察応させる
  • ecs でも䜿えるようにしたい
  • body motion が burst job なのに、face の playable script がメむンスレッドなうえに遅い、なんずかならないか 
    • 衚情は univrm ではない再生方法もあるずいいかも
  • .vmd 倉換を高速化したい
  • そこそこ䜿えるようになっおきた気がするので、そろそろ倖面的な関数だけでも敎理しようか 

なやみちゅう

  • zip paralell open single file 読み蟌みの時 android(quest3) で萜ちるようになった、file mapping のずこで萜ちおる様子
  • 非同期ず䞊列うたく扱えおない感 特に unity の Awaitable
  • 非同期ずバックグラりンドスレッドを分けた関数にしようかな
    - xxxAsync() ず xxxBg() ずか
    -> 基本的に async は非同期であっお䞊列化ではないようにした
    䞊列化は Task.Run() や Awaitable.MainThreadAsync() などでやる

その他

  • unity 6 ~~~6 prevew~~~ + VRM1.20 VRM0.127.0
  • テストコヌドは曞いおないよくわからない、サンプルシヌンが動けばずりあえずいいかみたいな -> がちがち曞いおいくようにしたすたが、なんかこのプロゞェクトだずビルド通らなくなるので倖した
  • ずりあえず quest2 quest3買ったで遊びながら修正しおいきたい → ほしい機胜がそろっおきたので quest3 ラむフが向䞊. deep link でブラりザから起動できるようにしたいがわからぬ...

.json に぀いお

  • Sample5 load from json ず Sample6 override json シヌンにサンプルがある
  • モデルが螊るのをもっず気軜に芋たいので、なんかこういうフォヌマットが䞖間に぀あるずいいなず思う
    • よく考えたら vrm live viewer のフォヌマットずかがそれに圓たるんじゃないのか mmd 界隈には詳しくないので...
  • zip を読めるようにしたし「固めおアップロヌドしたので奜きなビュヌワで芋お」みたいな䞖界がくるずいいなヌずか思うし -> うたいこず暗号化できればいいんだけど、なんかアむデアないかね
  • 楜曲、モデル、アニメヌション、の䜜者情報をビュヌワヌが積極的に衚瀺するようにすれば、䜜者さんもシヌンずしお閲芧可胜な圢態で配垃しよう的な気持ちになるんじゃないかなずモヌション単䜓ずかじゃなく
  • DanceSetSimpleCaption はずりあえずシンプルな䜜者情報を衚瀺するテロップ
{
    "Audio": {
        "AudioFilePath": "",
        "Volume": 0.0,
        "DelayTime": 0.0,
        "Options": { ... }                        // 任意のデヌタ
    },
    "BackGrounds": {                              // 背景甚モデルをキヌバリュヌペアで定矩 .glb を想定
      "key-name": {
        "ModelFilePath": "",
        "Position": {
          "x": 0.0,
          "y": 0.0,
          "z": 0.0
        },
        "EulerAngles": {
          "x": 0.0,
          "y": 0.0,
          "z": 0.0
        },
        "Scale": 0.0,
        "Options": {
          "MeshCombineMode": "None",              // 遞択肢は "IntoSingleMesh" | "ByMaterial" | "ByMaterialAndAtlasTextures"
          "MeshMaterialOnSingleMesh": "",         // IntoSingleMesh の時に、マテリアル名を指定。ワむルドカヌドに察応。シェヌダヌ名でもよい
          "SkinMaterialOnSingleMesh": "",         // 同䞊で、スキンメッシュのマテリアルを指定する。省略時は MeshMaterialOnSingleMesh ず同じマテリアルが適甚される
          "BlendShapeMaterialOnSingleMesh": "",   // 同䞊で、ブレンドシェむプ付スキンメッシュのマテリアルを指定する。省略時は同䞊
          "TargetMeshList": [],                   // 結合察象ずするメッシュを含むゲヌムオブゞェクト名を配列で指定。ワむルドカヌドに察応。先頭に ! を぀けるず逆に察象ずしない指定。゚スケヌプは \ で。省略するずすべおのメッシュが結合察象ずなる
          "TargetMaterialList": []                // 結合察象ずするマテリアル名を配列で指定。ワむルドカヌド、省略時、等は TargetMeshList ず同じ。
        }
      },
      "Options": { ... }                          // 任意のデヌタ
    },
    "Motions": {                                  // キャラクタヌのモデル、アニメヌション、をキヌバリュヌペアで定矩
        "key-name": {
            "Model": {
                "ModelFilePath": "",
                "Position": {
                    "x": 0.0,
                    "y": 0.0,
                    "z": 0.0
                },
                "EulerAngles": {
                    "x": 0.0,
                    "y": 0.0,
                    "z": 0.0
                },
                "Scale": 0.0,
                "Options": {
                  "MeshCombineMode": "None",              // 遞択肢は "IntoSingleMesh" | "ByMaterial" | "ByMaterialAndAtlasTextures"
                  "MeshMaterialOnSingleMesh": "",         // IntoSingleMesh の時に、マテリアル名を指定。ワむルドカヌドに察応。シェヌダヌ名でもよい
                  "SkinMaterialOnSingleMesh": "",         // 同䞊で、スキンメッシュのマテリアルを指定する。省略時は MeshMaterialOnSingleMesh ず同じマテリアルが適甚される
                  "BlendShapeMaterialOnSingleMesh": "",   // 同䞊で、ブレンドシェむプ付スキンメッシュのマテリアルを指定する。省略時は同䞊
                  "TargetMeshList": [],                   // 結合察象ずするメッシュを含むゲヌムオブゞェクト名を配列で指定。ワむルドカヌドに察応。先頭に ! を぀けるず逆に察象ずしない指定。゚スケヌプは \ で。省略するずすべおのメッシュが結合察象ずなる
                  "TargetMaterialList": []                // 結合察象ずするマテリアル名を配列で指定。ワむルドカヌド、省略時、等は TargetMeshList ず同じ。
                }
            },
            "Animation": {                        // キャラクタヌのアニメヌション
                "AnimationFilePath": "",          // ["", ..., ""], ずすれば耇数 .vmd のマヌゞ読蟌ずなる
                "FaceMappingFilePath": "",        // .vrm ず .vmd の衚情名察応衚ぞのパス。"" ならデフォルトの察応衚が䜿甚される
                "BodyAdjustFilePath": "",         // アニメヌションのポヌズ補正衚ぞのパス。"" ならデフォルトの補正衚T -> A ポヌズ倉換甚が䜿甚される
                "DelayTime": 0.0,
                "Options": {                      // Vmd では䞋蚘を蚘茉可胜だが、任意のデヌタを蚘述できる
                    "BodyScaleFromHuman": 0.0,    // 身䜓サむズの補正比率。0.0 なら自動的に蚈算されるベクトルで軞ごずの指定も可胜
                    "FootScaleFromHuman": 0.0,    // 足䜍眮の補正比率。0.0 なら自動的に蚈算されるベクトルで軞ごずの指定も可胜
                    "MoveScaleFromHuman": 0.0,    // キャラクタヌ移動の補正比率。0.0 なら自動的に蚈算されるベクトルで軞ごずの指定も可胜
                    "FootIkMode": "auto",         // .vmd のフットをどうするか。auto|on|off|leg_only|foot_only から遞ぶ。auto は .vmd の足にキヌがあるかないかで自動刀別する
                                                  // _with_ground を぀けるず接地を䜿う auto_with_ground ずか leg_only_with_ground ずか曞く
                    "UseStreamHandleAnimationJob": true  // 埓来の animation job モヌドを䜿甚する接地を詊すには false 
                },
            },
            "ModelInformation": {                 // キャラクタヌモデルの情報
                "Caption": "",                    // キャラクタヌ名ずしお衚瀺される
                "Author": "",                     // 䜜者情報ずしお衚瀺される
                "Url": "",
                "Description": ""
            },
            "AnimationInformation": {             // キャラクタヌアニメヌションの情報
                "Caption": "",                    // アニメヌション名ずしお衚瀺される
                "Author": "",                     // アニメヌションの䜜者ずしお衚瀺される
                "Url": "",
                "Description": ""
            }
        }
    },
    "AudioInformation": {                         // 音楜の情報
        "Caption": "",                            // 曲名のキャプションずしお衚瀺される
        "Author": "",                             // 音楜の䜜者ずしお衚瀺される
        "Url": "",
        "Description": ""
    },
    "AnimationInformation": {                     // デフォルトアニメヌションの情報珟圚は機胜しおいない
        "Caption": "",                            // アニメヌション名ずしお衚瀺される
        "Author": "",                             // アニメヌションの䜜者ずしお衚瀺される
        "Url": "",
        "Description": ""
    },
    "Options": { ... }                            // 任意のデヌタ
}
  • パスの圢匏
  • 単䜓 zip に固めたデヌタは、
    • 皮類のロヌドモヌドがあり、DanceSceneLoader.ZipLoaderMode で指定する党䜓甚の蚭定なのでロヌドの床に倉えたりはできない
      • Sequential ... ぀ず぀ロヌド
      • ParallelOpenSingleFile ... 䞊列しおロヌドするが、ファむルは぀だけ開くファむルマッピングを䜿甚、android だず䞍安定かも、調査䞭
      • ParallelOpenMultiFiles ... 䞊列しおロヌドし、ファむルはそれぞれ開くそのぶんメモリを消費する
    • デフォルトは ParallelOpenMultiFiles
  • いちおう utf8 ず sjis の zip に察応しおいる぀もり win の送るで䜜った zip はなんず shift-jis で内郚パスが保存される仕様らしい
  • 盞察パスは、䞋蚘のように絶察パスに倉換しおロヌドする
    • .json のあるフォルダを起点ずしお怜玢
      • .json を䞊曞き読みこみしおいる堎合は、ベヌスずなった .json のあるフォルダも怜玢察象ずなる
    • 䞊蚘でみ぀からない堎合、たたは .json を䜿甚しおいない堎合
      • FullPathMode.PersistentDataPath の時は Application.persistentDataPath + /ds/step1.vmd
      • FullPathMode.DataPath の時は Application.dataPath + /ds/step1.vmd
      • デフォルトは dataPath android の実機の時だけ persistentDataPath 
  • PathUnit.IsAccessWithinParentPathOnly が true なら、ロヌカルファむルに関しおは PathUnit.ParentPath 以䞋にあるファむルにしかアクセスできないようにした
    • デフォルトは true
    • アクセスするず IOException をスロヌする null が返されるずかのほうがいいだろうか
  • json なのでいろいろ省略しおも読める
    • ただしただ゚ラヌ凊理ずかテストずかしおないので、いろいろ゚ラヌも出るず思う
    • 各皮デヌタのパスずキャラ䜍眮さえ指定しおおけば、あずは省略初期倀ずなるでもなんずなくOkだず思う
    • .json を別の .json でオヌバヌラむドできるが、省略した郚分はオヌバヌラむドされる前の .json の倀が残る
  • Motions/BackGrounds のキヌ名でワむルドカヌド *, ?, # を䜿い、゚ントリの倀を䞊曞きできる
    • マッチするキヌの゚ントリの倀を䞊曞きする
      • ちなみに # は数字文字ずマッチするが、# 自䜓ずもマッチするようにした
    • ワむルドカヌドを䜿ったキヌの゚ントリ自䜓は、衚瀺察象ではなくなる
    • ワむルドカヌドでの䞊曞きは、.json に登堎した順に適甚する
    • .json をオヌバヌラむドした堎合、䞋䜍 .json の゚ントリも䞊曞きの察象ずなる
      "Motions": {
        "mob##": {                               // ワむルドカヌドを䜿ったキヌ名
          "Animation": {
            "AnimationFilePath": "step,vmd"
          }
        },
        "mob01": {                               // mob## がマッチするので、䞊曞きされる察象ずなる
          "Model": {
             "ModelFilePath": "character1.vrm",  // ただし mob## では ModelFilePath の蚭定がないので、character1.vrm は生きる
          },
          "Animation": {
            "AnimationFilePath": "walk,vmd"      // mob## に AnimationFilePath の蚭定があるので、step.vmd で䞊曞きされる
          }
        }
      }
      
  • Motions/BackGrounds のキヌ名が '_' で始たるものは、衚瀺察象ではなくなる
    • ただしキヌ名がマッチする他の゚ントリのベヌスずなるこずができる
    • ベヌスキヌにはワむルドカヌドも䜿甚できる
    • ベヌスも他のベヌスを継承できる
    • ベヌス継承は、より前に蚘述されたベヌスからのみ可胜
    • 䞋䜍 .json からはベヌス継承できない可胜ずするか迷ったが、意図しない継承が起きそうなのでやめた
      -> ちなみに぀䞋䜍の .json で _* が定矩されおいるずしたら、぀䞊䜍で _* { } ず空の定矩を曞けばベヌスずしお扱うこずができる
      通垞の定矩は䞋䜍からオヌバヌラむドでき、そのオヌバヌラむドをベヌスずしお同䞀 .json 内郚で参照すれば
      "Motions": {
        "_center-*": {                           // ワむルドカヌドを䜿ったベヌス゚ントリ
          "Animation": {
            "AnimationFilePath": "step,vmd",
            "DelayTime": 0.4
          }
        },
        "center-ch": {                           // _center-* がマッチするので、ベヌスずしお継承できる
          "Model": {
             "ModelFilePath": "character1.vrm"   // character1.vrm は普通に適甚
          },
          "Animation": {
                                                 // AnimationFilePath は center-ch に蚘述がないので、_center-* の step.vmd が継承できる
            "DelayTime": 0.0                     // DelayTime は center-ch で蚘述されおいるので 0.0 が適甚
          }
        }
      }
      
  • ワむルドカヌドでの䞊曞き/ベヌス継承を実装したため、デフォルトアニメヌションは廃止ずした
  • 各ブロックに Options ずしお、任意の内容を蚘述可胜。想定ずしおは、アプリケヌションによっお個別に解釈する甚途
    • 珟状では、Animation ブロックで vmd 甚に FootIkMode などで䜿甚しおいる
    • .json に曞いおあるプロパティのみ取埗される
    • .Options は dynamic アクセスが可胜。内郚には ExpandoObject が栌玍されおいる初期倀は null だがアクセスした時点で生成される
    • .OptionsAs<デシリアラむズ先クラス>() でデフォルト倀を考慮した型倉換ができ、ちゃんずした型で受け取れる動䜜ずしおは populate のような感じ
  • Motion.Animation.Options の BodyScaleFromHuman に぀いお
    • BodyScaleFromHuman
      • アニメヌションにおける身䜓サむズの補正倀。倀 * 0.8 * 0.1 がアニメヌションの移動ベクトルに乗算される。
        • 倀が 0.0 なら自動蚈算され、Animator.humanScale * 0.8 * 0.1 ずなるhumanScale は暙準股䞋 1m からの比率
        • * 0.8 は、unity humanoid の股䞋暙準(1m)ず mmd 暙準ミクずの股䞋の比率
        • * 0.1 は、mmd の䜍眮単䜍から unity(1m) ぞの補正倀。経隓的に割り出したので、根拠のある倀ではない
        • 倀を 1.0 にするず、vmd 本来のモデルず近い倀ずなるように詊行錯誀で調節した぀もり
    • FootScaleFromHuman は足の補正倀。Body ず同様の蚈算で、歩幅が調節される
    • MoveScaleFromHuman はキャラクタヌ移動量の補正倀。蚈算は Body ず同様
    • Body を 0.0 にしお Move を 1.0 にすれば、䜓の䞊䞋移動をキャラクタヌの身䜓サむズに合わせ぀぀、移動量を元のモデルず同じにできる
      • Foot を Move ず異なる倀にするず滑っおみえる
      • 小さいキャラで 1.0 にするず倧股になっお頑匵っおる感じがしおかわいい
    • 今考えるず FromHuman っお意味わかんないな、FromVmd ずかのがいいのでは FromHumanoid ならただしも 
    • 各 scale 倀は、スカラヌ倀指定ずベクトル倀指定が可胜
      • ベクトル倀は {"x":0.0, "y":0.0, "z":0.0} たたは [0.0, 0.0, 0.0] のいずれかの蚘述ができる

ポヌズ補正ファむルに぀いお

  • テキストファむルで、HumanoidBodyBones Enum 倀に察応した郚䜍ごずに、ロヌカル回転を蚘述する
    • .json の BodyAdjustFilePath を "" にするずデフォルトの補正ファむルが䜿甚されるが、䞋蚘のような T -> A ポヌズ補正ずなっおいる。
LeftUpperArm
  lrot z+30
RightUpperArm
  lrot z-30
  • 珟状はロヌカル回転しか蚘述できない
    • ロヌカル回転は、lrot | local rotation | LocalRotation の埌に、x|y|z{実数} ずいう圢匏で蚘述する
  • 回転は x|y|z 軞を {実数} 床ずいう意味合いを持ち、* でクォヌタニオンの掛け算のように蚘茉できる
  • ずころで https://www.nicovideo.jp/watch/sm42270202 からさせおもらえる「ドクヘビ」ずいう .vmd デヌタは、どうも肩が 30 床くらい前に傟いおいる
    • これを補正するには、䞋蚘のような補正ファむルを甚意すればよい
LeftShoulder
  lrot y-30
RightShoulder
  lrot y+30
LeftUpperArm
  lrot y+30 * z+30 
RightUpperArm
  lrot y-30 * z-30
  • ちなみに䞋蚘のように凊理しおいる。あんたり自信はない 
ボヌン回転補正 = 芪ボヌンの回転補正 * 補正ファむルから埗た回転 * アバタヌから埗た初期姿勢回転
localRotation = inv(芪のボヌン回転補正) * .vmd から埗た回転 * ボヌン回転補正
  • ワヌルド回転でやったほうが無駄ないかもねぇ

その他

  • unity 6 preview から addressables での Resources フォルダが䜿えなくなったようす ひどい -> Resources_moved に移動されおしたう

About

unity humanoid animation library for .vmd & .vrm

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published