From c427cb3701d0f91c5dcde1baf6e3251b8ef69d3a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 17 Dec 2024 10:58:44 +0900 Subject: [PATCH 1/7] update --- docs/api/springbone/center.md | 0 docs/api/springbone/index.md | 18 ----------- docs/api/springbone/note.md | 31 ------------------- docs/api/springbone/update.md | 24 -------------- ...time.md => VRM_IVrm0XSpringBoneRuntime.md} | 9 +++++- .../{scaling.md => vrm0/VRM_VRMSpringBone.md} | 28 +++++++++++++++-- docs/api/springbone/vrm0/index.md | 1 - docs/api/springbone/{ => vrm0}/jobs.md | 19 ++++++++++++ docs/api/springbone/vrm1/index.md | 5 +++ docs/api/springbone/{ => vrm1}/startup.md | 0 docs/release/100/v0.106.0.md | 2 +- docs/release/112/v0.126.0.md | 2 +- docs/release/112/v0.127.0.md | 4 --- docs/release/112/v0.127.1.md | 2 +- sidebars.ts | 12 +++---- src/css/custom.css | 22 +++++-------- 16 files changed, 73 insertions(+), 106 deletions(-) delete mode 100644 docs/api/springbone/center.md delete mode 100644 docs/api/springbone/index.md delete mode 100644 docs/api/springbone/note.md delete mode 100644 docs/api/springbone/update.md rename docs/api/springbone/vrm0/{runtime.md => VRM_IVrm0XSpringBoneRuntime.md} (92%) rename docs/api/springbone/{scaling.md => vrm0/VRM_VRMSpringBone.md} (51%) rename docs/api/springbone/{ => vrm0}/jobs.md (52%) rename docs/api/springbone/{ => vrm1}/startup.md (100%) diff --git a/docs/api/springbone/center.md b/docs/api/springbone/center.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/api/springbone/index.md b/docs/api/springbone/index.md deleted file mode 100644 index 4a0d1560d..000000000 --- a/docs/api/springbone/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# SpringBone - -## vrm-1.0 - -実行システムを切り替えられるようになりました。 - -- `v0.86` **Vrm10FastSpringboneRuntime(default)**: Unity job system で実装されています。すべての vrm の spring bone まとめて処理するシングルトンです。 -- `v0.127` **Vrm10FastSpringboneRuntimeStandalone**: Unity job system で実装されています。モデル毎に個別に実行します。 - -## vrm-0.x - -実行システムを切り替えられるようになりました。 - -- **Vrm0XSpringBoneDefaultRuntime(default)**: 通常の MonoBehaviour です。 -- `v0.85` **Vrm0XFastSpringboneRuntime**: Unity job system で実装されています。すべての vrm の spring bone まとめて処理するシングルトンです。 - -これらの実装は importer の引数で切り替え可能です。`from v0.127.0` - diff --git a/docs/api/springbone/note.md b/docs/api/springbone/note.md deleted file mode 100644 index c5526900f..000000000 --- a/docs/api/springbone/note.md +++ /dev/null @@ -1,31 +0,0 @@ -# note - -:::info job版のロジックは vrm-0.x と vrm-1.0 で共通化されました - -- https://github.com/vrm-c/UniVRM/issues/2422 - -::: - -:::note job は房並列です - -joint 毎ではなく房(根元 から末端まで)単位の並列です。 -根元から順番に長さで拘束して位置を確定させる都合で親の位置・方向が先に決まる必要があるためです。 - -- 伸縮せずに見た目がきれい -- 並列化できない - -というトレードオフがあります。 - -::: - -## Spring の状態変化 - -| input | 変化 | 備考 | -| ----------------------------------------------- | -------- | ------------------------------- | -| 初期姿勢 | 不変 | bone local. スケール抜き? | -| 構成(joint アタッチ情報) | 不変 | editor では変わりうる。再初期化 | -| runtime(center, scale, exernal...etc) | フレーム | center, scale で難 | -| joint設定(stiffness, dragForce, gravity... etc) | フレーム | | -| collider(radius) | フレーム | | - -- `0.x` [VRM 0 系で FastSpringBone を使用した際に VRM の最親のゲームオブジェクトに FastSpringBone が追従しない · Issue #2047 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2047) diff --git a/docs/api/springbone/update.md b/docs/api/springbone/update.md deleted file mode 100644 index 6c05fc8a6..000000000 --- a/docs/api/springbone/update.md +++ /dev/null @@ -1,24 +0,0 @@ -# update のカスタマイズ - -## `v0.106` SpringBone の手動更新 - -from [v0.106.0](/release/100/v0.106.0) - -[\#1866](https://github.com/vrm-c/UniVRM/pull/1886) - -- VRMSpringBone.SpringBoneUpdateType.Manual を追加 -- VRMSpringBone.ManualUpdate を追加 - -以下のように呼び出すことができます。 - -```csharp -VRMSpringBone spring; - -// setup -spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual; - -// each frame -spring.ManualUpdate(time.deltaTime); -``` - -- spring.ManualUpdate を使う前に spring.m_updateType を `Manual` に設定する必要があります。 diff --git a/docs/api/springbone/vrm0/runtime.md b/docs/api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime.md similarity index 92% rename from docs/api/springbone/vrm0/runtime.md rename to docs/api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime.md index 7a33782f8..afb206483 100644 --- a/docs/api/springbone/vrm0/runtime.md +++ b/docs/api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime.md @@ -1,4 +1,11 @@ -# SpringBone Runtime +# VRM.IVrm0XSpringBoneRuntime + +実行システムを切り替えられるようになりました。 + +- **Vrm0XSpringBoneDefaultRuntime(default)**: 通常の MonoBehaviour です。 +- `v0.85` **Vrm0XFastSpringboneRuntime**: Unity job system で実装されています。すべての vrm の spring bone まとめて処理するシングルトンです。 + +これらの実装は importer の引数で切り替え可能です。`from v0.127.0` [SimpleViewer](https://github.com/vrm-c/UniVRM/blob/master/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs)を参照してください。 diff --git a/docs/api/springbone/scaling.md b/docs/api/springbone/vrm0/VRM_VRMSpringBone.md similarity index 51% rename from docs/api/springbone/scaling.md rename to docs/api/springbone/vrm0/VRM_VRMSpringBone.md index 3d172cefb..fbc2c2bb3 100644 --- a/docs/api/springbone/scaling.md +++ b/docs/api/springbone/vrm0/VRM_VRMSpringBone.md @@ -1,4 +1,29 @@ -# 拡大縮小の対応状況 +# VRM.VRMSpringBone + +## Update の手動呼び出し + +from [v0.106.0](/release/100/v0.106.0) + +[\#1866](https://github.com/vrm-c/UniVRM/pull/1886) + +- VRMSpringBone.SpringBoneUpdateType.Manual を追加 +- VRMSpringBone.ManualUpdate を追加 + +- spring.ManualUpdate を使う前に spring.m_updateType を `Manual` に設定します。 + +以下のように呼び出すことができます。 + +```csharp +VRMSpringBone spring; + +// setup +spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual; + +// each frame +spring.ManualUpdate(time.deltaTime); +``` + +## 拡大縮小の対応状況 :::warning スケーリングは uniform(xyz が同じ) のみの対応です ::: @@ -6,4 +31,3 @@ - `0.x` [SpringBone does not work correctly if you change the model size, for example scale (8,8,8). · Issue #2242 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2242) - `0.x` [Scale が VRM Spring Bone に正しく適用されません · Issue #922 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/922) - [SpringBone does not work correctly if you change the model size, for example scale (8,8,8). · Issue #2242 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2242) - diff --git a/docs/api/springbone/vrm0/index.md b/docs/api/springbone/vrm0/index.md index f438c5247..dcf7d8712 100644 --- a/docs/api/springbone/vrm0/index.md +++ b/docs/api/springbone/vrm0/index.md @@ -3,4 +3,3 @@ :::note オリジナル blog `Rocket Jump` の `Unityで揺れものを揺らす` という記事(2014年)に基いています。 ::: - diff --git a/docs/api/springbone/jobs.md b/docs/api/springbone/vrm0/jobs.md similarity index 52% rename from docs/api/springbone/jobs.md rename to docs/api/springbone/vrm0/jobs.md index 47c2c08e0..a427a2a81 100644 --- a/docs/api/springbone/jobs.md +++ b/docs/api/springbone/vrm0/jobs.md @@ -1,5 +1,24 @@ # FastSpringBone(Unity job)について +:::info job版のロジックは vrm-0.x と vrm-1.0 で共通化されました + +- https://github.com/vrm-c/UniVRM/issues/2422 + +::: + +:::note job は房並列です + +joint 毎ではなく房(根元 から末端まで)単位の並列です。 +根元から順番に長さで拘束して位置を確定させる都合で親の位置・方向が先に決まる必要があるためです。 + +- 伸縮せずに見た目がきれい +- 並列化できない + +というトレードオフがあります。 + +::: + + `from v0.85` ## 概要 diff --git a/docs/api/springbone/vrm1/index.md b/docs/api/springbone/vrm1/index.md index a53273527..1411641e6 100644 --- a/docs/api/springbone/vrm1/index.md +++ b/docs/api/springbone/vrm1/index.md @@ -1,5 +1,10 @@ # vrm-1.0 の SpringBone +実行システムを切り替えられるようになりました。 + +- `v0.86` **Vrm10FastSpringboneRuntime(default)**: Unity job system で実装されています。すべての vrm の spring bone まとめて処理するシングルトンです。 +- `v0.127` **Vrm10FastSpringboneRuntimeStandalone**: Unity job system で実装されています。モデル毎に個別に実行します。 + ## 仕様 - https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone-1.0 diff --git a/docs/api/springbone/startup.md b/docs/api/springbone/vrm1/startup.md similarity index 100% rename from docs/api/springbone/startup.md rename to docs/api/springbone/vrm1/startup.md diff --git a/docs/release/100/v0.106.0.md b/docs/release/100/v0.106.0.md index 80875b89b..2f1d55e8d 100644 --- a/docs/release/100/v0.106.0.md +++ b/docs/release/100/v0.106.0.md @@ -20,7 +20,7 @@ Application をビルドするときの問題の修正 * [[\#1886](https://github.com/vrm-c/UniVRM/pull/1886)] [1.0][0.x] SpringBone の手動更新 * [SpringBone manual update](/api/springbone/vrm1) - * [0_106_spring_manual_update](/api/springbone/update) + * [VRM.VRMSpringBone](/api/springbone/vrm0/VRM_VRMSpringBone) * [[\#1868](https://github.com/vrm-c/UniVRM/pull/1868)] SpringBoneに対して外力を渡すインターフェースを実装する * [毎フレーム外力を加える](/api/springbone/vrm1) * [[\#1878](https://github.com/vrm-c/UniVRM/pull/1878)] modGltf 引き数を追加 diff --git a/docs/release/112/v0.126.0.md b/docs/release/112/v0.126.0.md index a984549f3..e53459362 100644 --- a/docs/release/112/v0.126.0.md +++ b/docs/release/112/v0.126.0.md @@ -30,7 +30,7 @@ https://github.com/vrm-c/UniVRM/milestone/91?closed=1 3つある SpringBone の部品を共通化して、 修正を同時に反映できるようにする予定です。 -[SpringBone の実装状況](/api/springbone/scaling) +[VRM.VRMSpringBone](/api/springbone/vrm0/VRM_VRMSpringBone) ## API diff --git a/docs/release/112/v0.127.0.md b/docs/release/112/v0.127.0.md index 464827939..3c076b45e 100644 --- a/docs/release/112/v0.127.0.md +++ b/docs/release/112/v0.127.0.md @@ -25,7 +25,3 @@ https://github.com/vrm-c/UniVRM/milestone/92?closed=1 - runtime load 時にモデルの向きの影響を受けなくなります - scene 配置時は次で修正予定 - [IVrm10SpringBoneRuntime.InitializeAsync by ousttrue · Pull Request #2443 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2443) - -### API - -- [API SpringBone](/api/springbone/) diff --git a/docs/release/112/v0.127.1.md b/docs/release/112/v0.127.1.md index cd1412514..707e68f1d 100644 --- a/docs/release/112/v0.127.1.md +++ b/docs/release/112/v0.127.1.md @@ -27,4 +27,4 @@ https://github.com/vrm-c/UniVRM/milestone/93?closed=1 ### 詳細 - [vrm-1.0](/api/springbone/vrm1/runtime/) -- [vrm-0.x](/api/springbone/vrm0/runtime/) +- [vrm-0.x](/api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime/) diff --git a/sidebars.ts b/sidebars.ts index 13931310c..7e867a92d 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -362,7 +362,6 @@ const sidebars: SidebarsConfig = { { type: "category", label: "SpringBone", - link: { type: "doc", id: "api/springbone/index" }, items: [ { type: "category", @@ -372,6 +371,7 @@ const sidebars: SidebarsConfig = { "api/springbone/vrm1/runtime", "api/springbone/vrm1/VRMC_springBone_extended_collider", "api/springbone/vrm1/FastSpringBoneService", + 'api/springbone/vrm1/startup', ] }, { @@ -379,15 +379,11 @@ const sidebars: SidebarsConfig = { label: "vrm-0.x", link: { type: "doc", id: "api/springbone/vrm0/index" }, items: [ - "api/springbone/vrm0/runtime", + "api/springbone/vrm0/VRM_VRMSpringBone", + "api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime", + "api/springbone/vrm0/jobs", ] }, - "api/springbone/update", - "api/springbone/jobs", - 'api/springbone/center', - 'api/springbone/scaling', - 'api/springbone/startup', - 'api/springbone/note', ], }, { diff --git a/src/css/custom.css b/src/css/custom.css index 6cad3918c..424ae3602 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -6,26 +6,20 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #2e8555; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; + --ifm-color-primary: #ee5e20; + --ifm-color-primary-dark: #e25011; + --ifm-color-primary-darker: #d54c10; + --ifm-color-primary-darkest: #b03e0d; + --ifm-color-primary-light: #f07039; + --ifm-color-primary-lighter: #f17946; + --ifm-color-primary-lightest: #f4946b; + --ifm-code-font-size: 95%; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); } /* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme="dark"] { - --ifm-color-primary: #25c2a0; - --ifm-color-primary-dark: #21af90; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } From 20fac55ea2210bbe2d71e8f94cb8dfd90b266de4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 17 Dec 2024 16:30:42 +0900 Subject: [PATCH 2/7] update springbone --- .../{ => editor-import}/scripted_importer.md | 0 docs/api/first_person.mdx | 23 -- .../{ => firstperson}/check_firstperson.jpg | Bin .../{ => firstperson}/check_thirdperson.jpg | Bin docs/api/firstperson/first_person.md | 17 ++ docs/api/{ => firstperson}/firstperson.md | 2 +- docs/api/{ => firstperson}/tags_layers.jpg | Bin .../api/{ => firstperson}/vrm1_firstperson.md | 2 +- docs/api/{ => gltf}/0_36_update.md | 0 docs/api/{ => gltf}/format.md | 0 docs/api/{ => gltf}/how_to_impl_extension.md | 0 docs/api/{ => humanoid}/ControlRig.png | Bin docs/api/humanoid/humanoid_animation.md | 4 +- docs/api/{ => humanoid}/vrm1_controlrig.md | 0 ...untime_resource_management.md => index.md} | 0 docs/api/index.mdx | 6 - .../0_76_texture_deserializer.md | 0 .../0_96_1_use_gamma_colorspace.md | 0 .../{ => material}/texture_manipulation.md | 0 docs/api/{ => material}/transparent_zwrite.md | 0 docs/api/runtime-import/UniVRM10_Vrm10.md | 4 +- docs/api/springbone/vrm0/VRM_VRMSpringBone.md | 72 +++++ .../springbone/vrm1/FastSpringBoneService.md | 57 ---- ...{runtime.md => IVrm10SpringBoneRuntime.md} | 270 +++++++++++------- .../vrm1/VRMC_springBone_extended_collider.md | 4 +- docs/api/springbone/vrm1/index.md | 21 +- docs/api/springbone/vrm1/startup.md | 16 -- docs/release/079/v0.88.0.md | 2 +- docs/release/112/v0.127.1.md | 2 +- docs/vrma/univrm-vrma/retarget.md | 2 +- sidebars.ts | 41 ++- 31 files changed, 306 insertions(+), 239 deletions(-) rename docs/api/{ => editor-import}/scripted_importer.md (100%) delete mode 100644 docs/api/first_person.mdx rename docs/api/{ => firstperson}/check_firstperson.jpg (100%) rename docs/api/{ => firstperson}/check_thirdperson.jpg (100%) create mode 100644 docs/api/firstperson/first_person.md rename docs/api/{ => firstperson}/firstperson.md (96%) rename docs/api/{ => firstperson}/tags_layers.jpg (100%) rename docs/api/{ => firstperson}/vrm1_firstperson.md (97%) rename docs/api/{ => gltf}/0_36_update.md (100%) rename docs/api/{ => gltf}/format.md (100%) rename docs/api/{ => gltf}/how_to_impl_extension.md (100%) rename docs/api/{ => humanoid}/ControlRig.png (100%) rename docs/api/{ => humanoid}/vrm1_controlrig.md (100%) rename docs/api/{runtime_resource_management.md => index.md} (100%) delete mode 100644 docs/api/index.mdx rename docs/api/{ => material}/0_76_texture_deserializer.md (100%) rename docs/api/{ => material}/0_96_1_use_gamma_colorspace.md (100%) rename docs/api/{ => material}/texture_manipulation.md (100%) rename docs/api/{ => material}/transparent_zwrite.md (100%) delete mode 100644 docs/api/springbone/vrm1/FastSpringBoneService.md rename docs/api/springbone/vrm1/{runtime.md => IVrm10SpringBoneRuntime.md} (60%) delete mode 100644 docs/api/springbone/vrm1/startup.md diff --git a/docs/api/scripted_importer.md b/docs/api/editor-import/scripted_importer.md similarity index 100% rename from docs/api/scripted_importer.md rename to docs/api/editor-import/scripted_importer.md diff --git a/docs/api/first_person.mdx b/docs/api/first_person.mdx deleted file mode 100644 index 86208a5c4..000000000 --- a/docs/api/first_person.mdx +++ /dev/null @@ -1,23 +0,0 @@ -# VRアプリケーションの FirstPerson 設定による Renderer の可視制御 - -* `isSelf==true` 自分のアバター -* `isSelf==false` 自分以外のアバター -* FP Camera: HMDと連動するカメラ -* TP Camera: それ以外のすべてのカメラ - -| isSelf | FirstPerson設定 | FP Camera | TP Camera | レイヤーによる可視制御例 | -|--------|-----------------|-----------|-----------|-----------------------------------------------| -| true | FirstPersonOnly | ✅ | ❌ | FIRSTPERSON | -| true | ThirdPersonOnly | ❌ | ✅ | THIRDPERSON | -| true | Both | ✅ | ✅ | default | -| true | Auto | - | - | Both と ThirdPersonOnly に分割する | -| false | FirstPersonOnly | ❌ | ❌ | 完全に描画されない。Rendererの描画を止める | -| false | ThirdPersonOnly | ✅ | ✅ | default | -| false | Both | ✅ | ✅ | default | -| false | Auto | ✅ | ✅ | default。メッシュ分割など特別な処理は不要 | - - -import DocCardList from '@theme/DocCardList'; - - - diff --git a/docs/api/check_firstperson.jpg b/docs/api/firstperson/check_firstperson.jpg similarity index 100% rename from docs/api/check_firstperson.jpg rename to docs/api/firstperson/check_firstperson.jpg diff --git a/docs/api/check_thirdperson.jpg b/docs/api/firstperson/check_thirdperson.jpg similarity index 100% rename from docs/api/check_thirdperson.jpg rename to docs/api/firstperson/check_thirdperson.jpg diff --git a/docs/api/firstperson/first_person.md b/docs/api/firstperson/first_person.md new file mode 100644 index 000000000..dae093826 --- /dev/null +++ b/docs/api/firstperson/first_person.md @@ -0,0 +1,17 @@ +# VRアプリケーションの FirstPerson 設定による Renderer の可視制御 + +- `isSelf==true` 自分のアバター +- `isSelf==false` 自分以外のアバター +- FP Camera: HMDと連動するカメラ +- TP Camera: それ以外のすべてのカメラ + +| isSelf | FirstPerson設定 | FP Camera | TP Camera | レイヤーによる可視制御例 | +| ------ | --------------- | --------- | --------- | ------------------------------------------ | +| true | FirstPersonOnly | ✅ | ❌ | FIRSTPERSON | +| true | ThirdPersonOnly | ❌ | ✅ | THIRDPERSON | +| true | Both | ✅ | ✅ | default | +| true | Auto | - | - | Both と ThirdPersonOnly に分割する | +| false | FirstPersonOnly | ❌ | ❌ | 完全に描画されない。Rendererの描画を止める | +| false | ThirdPersonOnly | ✅ | ✅ | default | +| false | Both | ✅ | ✅ | default | +| false | Auto | ✅ | ✅ | default。メッシュ分割など特別な処理は不要 | diff --git a/docs/api/firstperson.md b/docs/api/firstperson/firstperson.md similarity index 96% rename from docs/api/firstperson.md rename to docs/api/firstperson/firstperson.md index d5b66aa85..99a472733 100644 --- a/docs/api/firstperson.md +++ b/docs/api/firstperson/firstperson.md @@ -1,6 +1,6 @@ # `vrm-0.x` VRMFirstPersonの使い方 -[FirstPerson と Renderer の可視制御 ](/api/first_person) +[FirstPerson と Renderer の可視制御 ](/api/firstperson/first_person) 実行時に**VRMFirstPerson.Setup**を呼び出すことで、FirstPerson設定に応じた Renderer の可視制御を行うことができます。 明示的に外部から呼び出してください。 diff --git a/docs/api/tags_layers.jpg b/docs/api/firstperson/tags_layers.jpg similarity index 100% rename from docs/api/tags_layers.jpg rename to docs/api/firstperson/tags_layers.jpg diff --git a/docs/api/vrm1_firstperson.md b/docs/api/firstperson/vrm1_firstperson.md similarity index 97% rename from docs/api/vrm1_firstperson.md rename to docs/api/firstperson/vrm1_firstperson.md index 0300ec2be..572a3ad7f 100644 --- a/docs/api/vrm1_firstperson.md +++ b/docs/api/firstperson/vrm1_firstperson.md @@ -1,6 +1,6 @@ # `vrm-1.0` FirstPerson -[FirstPerson と Renderer の可視制御 ](/api/first_person) +[FirstPerson と Renderer の可視制御 ](/api/firstperson/first_person) :::warning VR 用の機能です diff --git a/docs/api/0_36_update.md b/docs/api/gltf/0_36_update.md similarity index 100% rename from docs/api/0_36_update.md rename to docs/api/gltf/0_36_update.md diff --git a/docs/api/format.md b/docs/api/gltf/format.md similarity index 100% rename from docs/api/format.md rename to docs/api/gltf/format.md diff --git a/docs/api/how_to_impl_extension.md b/docs/api/gltf/how_to_impl_extension.md similarity index 100% rename from docs/api/how_to_impl_extension.md rename to docs/api/gltf/how_to_impl_extension.md diff --git a/docs/api/ControlRig.png b/docs/api/humanoid/ControlRig.png similarity index 100% rename from docs/api/ControlRig.png rename to docs/api/humanoid/ControlRig.png diff --git a/docs/api/humanoid/humanoid_animation.md b/docs/api/humanoid/humanoid_animation.md index 7cd366f75..29048cdd2 100644 --- a/docs/api/humanoid/humanoid_animation.md +++ b/docs/api/humanoid/humanoid_animation.md @@ -46,9 +46,9 @@ BVH の初期姿勢は特に決まっていません。 ### vrm-1.0 ControlRig で変換コピーする -![img](../ControlRig.png) +![img](./ControlRig.png) -[ControlRig](/api/vrm1_controlrig) +[ControlRig](/api/humanoid/vrm1_controlrig) :::tip 正規化さていないスケルトン/モーションを変換できます。 diff --git a/docs/api/vrm1_controlrig.md b/docs/api/humanoid/vrm1_controlrig.md similarity index 100% rename from docs/api/vrm1_controlrig.md rename to docs/api/humanoid/vrm1_controlrig.md diff --git a/docs/api/runtime_resource_management.md b/docs/api/index.md similarity index 100% rename from docs/api/runtime_resource_management.md rename to docs/api/index.md diff --git a/docs/api/index.mdx b/docs/api/index.mdx deleted file mode 100644 index 3a69c67c9..000000000 --- a/docs/api/index.mdx +++ /dev/null @@ -1,6 +0,0 @@ -import DocCardList from '@theme/DocCardList'; - -# UniVRM API - - - diff --git a/docs/api/0_76_texture_deserializer.md b/docs/api/material/0_76_texture_deserializer.md similarity index 100% rename from docs/api/0_76_texture_deserializer.md rename to docs/api/material/0_76_texture_deserializer.md diff --git a/docs/api/0_96_1_use_gamma_colorspace.md b/docs/api/material/0_96_1_use_gamma_colorspace.md similarity index 100% rename from docs/api/0_96_1_use_gamma_colorspace.md rename to docs/api/material/0_96_1_use_gamma_colorspace.md diff --git a/docs/api/texture_manipulation.md b/docs/api/material/texture_manipulation.md similarity index 100% rename from docs/api/texture_manipulation.md rename to docs/api/material/texture_manipulation.md diff --git a/docs/api/transparent_zwrite.md b/docs/api/material/transparent_zwrite.md similarity index 100% rename from docs/api/transparent_zwrite.md rename to docs/api/material/transparent_zwrite.md diff --git a/docs/api/runtime-import/UniVRM10_Vrm10.md b/docs/api/runtime-import/UniVRM10_Vrm10.md index 0d043c817..6cc812619 100644 --- a/docs/api/runtime-import/UniVRM10_Vrm10.md +++ b/docs/api/runtime-import/UniVRM10_Vrm10.md @@ -49,7 +49,7 @@ vrm-0.x とアタッチされるコンポーネントが異なります。 unity の humanoid を経由せずに直接操作する場合のユーティリティーです。 -[正規化されていないモデルを操作する](/api/vrm1_controlrig) +[正規化されていないモデルを操作する](/api/humanoid/vrm1_controlrig) ### showMeshes: Load完了時に表示させるか @@ -108,7 +108,7 @@ public class ImporterContextSettings ### springboneRuntime: SpringBone の Runtime 選択 -[SpringBone Runtime](/api/springbone/vrm1/runtime) +[SpringBone Runtime](/api/springbone/vrm1/IVrm10SpringBoneRuntime) ## LoadBytesAsync diff --git a/docs/api/springbone/vrm0/VRM_VRMSpringBone.md b/docs/api/springbone/vrm0/VRM_VRMSpringBone.md index fbc2c2bb3..6fbdbbb8e 100644 --- a/docs/api/springbone/vrm0/VRM_VRMSpringBone.md +++ b/docs/api/springbone/vrm0/VRM_VRMSpringBone.md @@ -1,5 +1,77 @@ # VRM.VRMSpringBone +## インタフェース抜粋 + +```cs +public sealed class VRMSpringBone : MonoBehaviour +{ + [SerializeField] public string m_comment; + [SerializeField] private Color m_gizmoColor = Color.yellow; + [SerializeField] public float m_stiffnessForce = 1.0f; + [SerializeField] public float m_gravityPower; + [SerializeField] public Vector3 m_gravityDir = new Vector3(0, -1.0f, 0); + [SerializeField][Range(0, 1)] public float m_dragForce = 0.4f; + [SerializeField] public Transform m_center; + [SerializeField] public List RootBones = new List(); + [SerializeField] public float m_hitRadius = 0.02f; + [SerializeField] public VRMSpringBoneColliderGroup[] ColliderGroups; + + /// + /// - アプリケーション開発者用のパラメタである + /// - Runtime 制御用のパラメタである + /// - シリアライズ対象でない + /// - true にすることで、モデルをスケーリングしたときも SpringBone の見た目上の動き(角速度)がなるべく保たれるようになる + /// - Non-Uniform scaling 下における動作は保証しない + /// + public bool UseRuntimeScalingSupport { get; set; } + + /// + /// VRM-1.0 からのバックポート。 + /// - Runtime 制御用のパラメタである + /// - シリアライズ対象でない + /// - World座標系 + /// + public Vector3 ExternalForce { get; set; } + + public enum SpringBoneUpdateType + { + LateUpdate, + FixedUpdate, + Manual, + } + [SerializeField] public SpringBoneUpdateType m_updateType = SpringBoneUpdateType.LateUpdate; + + [ContextMenu("Reset bones")] + public void Setup(bool force = false) + { + if (RootBones != null) + { + m_system.Setup(Scene, force); + } + } + + public void ReinitializeRotation() + { + m_system.ReinitializeRotation(Scene); + } + + public void SetModelLevel(UniGLTF.SpringBoneJobs.Blittables.BlittableModelLevel modelSettings) + { + UseRuntimeScalingSupport = modelSettings.SupportsScalingAtRuntime; + ExternalForce = modelSettings.ExternalForce; + } + + public void ManualUpdate(float deltaTime) + { + if (m_updateType != SpringBoneUpdateType.Manual) + { + throw new System.ArgumentException("require SpringBoneUpdateType.Manual"); + } + m_system.UpdateProcess(deltaTime, Scene, Settings); + } +} +``` + ## Update の手動呼び出し from [v0.106.0](/release/100/v0.106.0) diff --git a/docs/api/springbone/vrm1/FastSpringBoneService.md b/docs/api/springbone/vrm1/FastSpringBoneService.md deleted file mode 100644 index e8858019b..000000000 --- a/docs/api/springbone/vrm1/FastSpringBoneService.md +++ /dev/null @@ -1,57 +0,0 @@ -# FastSpringBoneService - -## FastSpringBoneService.Instance - -- シングルトンサービス - -:::info -`FastSpringBoneService.LateUpdate` - -```csharp -[DefaultExecutionOrder(11010)] -``` - -::: - -:::tip - -Vrm10Instance より後ろです。 - -```csharp -[DefaultExecutionOrder(11000)] -public class Vrm10Instance : MonoBehaviour -``` - -::: - -## Update - -### `v0.106.0` 手動更新 - -- FastSpringBoneService.UpdateTypes.Manual を追加 -- FastSpringBoneService.ManualUpdate を追加 - -```csharp -// 管理している VRM-1.0 がすべて入っている -List instances; - -// setup -foreach(var instance in instances) -{ - // SpringBone を手動にするために、 - // VRM-1.0 本体も手動に変更している。 - // VRM本体 => SpringBone という処理順を守る。 - instance.UpdateType = UpdateTypes.None; -} -FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual; - -// each frame -foreach(var instance in instances) -{ - // SpringBone よりも先に VRM10Instance を更新 - instance.Runtime.Process(); -} -// 最後に FastSpringBoneService を更新 -// すべての VRM-1.0 の SpringBone がまとめて処理されます。 -FastSpringBoneService.Instance.ManualUpdate(time.deltaTime); -``` diff --git a/docs/api/springbone/vrm1/runtime.md b/docs/api/springbone/vrm1/IVrm10SpringBoneRuntime.md similarity index 60% rename from docs/api/springbone/vrm1/runtime.md rename to docs/api/springbone/vrm1/IVrm10SpringBoneRuntime.md index 6c397c5df..bb54ede77 100644 --- a/docs/api/springbone/vrm1/runtime.md +++ b/docs/api/springbone/vrm1/IVrm10SpringBoneRuntime.md @@ -1,120 +1,53 @@ -# SpringBone Runtime +# IVrm10SpringBoneRuntime -[VRM10Viewer](https://github.com/vrm-c/UniVRM/blob/master/Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs)を参照してください。 +`v0.127` -## `v0.127` import 時の Springbone Runtime 切り替えについて +runtime に以下のようにアクセスできます。 ```cs -clss Vrm10Importer { - public Vrm10Importer( - Vrm10Data vrm, - IReadOnlyDictionary externalObjectMap = null, - ITextureDeserializer textureDeserializer = null, - IMaterialDescriptorGenerator materialGenerator = null, - bool useControlRig = false, - ImporterContextSettings settings = null, - IVrm10SpringBoneRuntime springboneRuntime = null // 👈 - ) -} +Vrm10Instance vrm; +IVrm10SpringBoneRuntime springbone = vrm.Runtime.SpringBobe; ``` -この引き数により SpringBone の Runtime をカスタマイズできます。 - -- `new Vrm10FastSpringboneRuntime` (default) -- `new Vrm10FastSpringboneRuntimeStandalone` - -を渡してください。 -`null` の場合は `Vrm10FastSpringboneRuntime` になります。 - -## `v0.127` scene 配置時の Springbone Runtime 切り替えについて - -- `Vrm10FastSpringboneRuntimeProvider` -- `Vrm10FastSpringboneRuntimeStandaloneProvider` - -をアッタチしてください。 - -### `v0.128` editor の scene play 時は Standalone 版がデフォルトになります - -- `Vrm10FastSpringboneRuntimeStandalone` - -になります。 - -## Vrm10FastSpringboneRuntime - -vrm-1.0 default の SpringBone Runtime です。 - -### 特徴 - -- Unity job system で実装されている -- すべての Vrm の SpringBone を Singleton でまとめて処理する - - 非play時に動作できません。DontDestroyOnLoad - -### FastSpringBoneService(シングルトン)について - -FastSpringBone が実行されると、`FastSpringBone Service` GameObject が `DontDestroyOnLoad` で生成されます。 +:::info SpringBone 関連の操作をまとめました ```cs -[DefaultExecutionOrder(11010)] -public sealed class FastSpringBoneService : MonoBehaviour -{ - public static FastSpringBoneService Instance - { - get { - DontDestroyOnLoad(gameObject); - } - } - - private void LateUpdate() -} +vrm.Runtime.ReconstructSpringBone(); +// 👇 +vrm.Runtime.SpringBone.ReconstructSpringBone(); ``` -これは全 VRM の FastSpringBone を集め、バッファの構築や FastSpringBone の実行タイミングの制御などを行う GameObject です。 - -:::note -明示的に破棄を行いたい場合は `FastSpringBoneService.Free` を呼んでください。 ::: -## Vrm10FastSpringboneRuntimeStandalone - -Vrm10FastSpringboneRuntime と同じ job を使用します。シングルトンでは無いバージョンです。 - -- [UniVRM タイムライン…プレイモードとエデットモードで挙動が異なる · Issue #1971 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1971) -- [\[1.0\] FastSpringBone Service does not disposed when I change the code while playing in editor · Issue #1567 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1567) - -### 特徴 - -- Unity job system で実装されている -- vrm-1.0 の update 処理の 6 番目に実行される +## interface 抜粋 ```cs -public class Vrm10Runtime : IDisposable +public interface IVrm10SpringBoneRuntime : IDisposable { - public void Process() - { - // 1. Update From VrmAnimation - // 2. Control Rig - // 3. Constraints - // 4. Gaze control - // 5. Apply Expression - // 6. SpringBone - SpringBone.Process(); // 👈 - } + /// + /// SpringBone の構成変更を反映して再構築する。 + /// + public bool ReconstructSpringBone(); + + /// + /// initialTransform 状態に復帰。verlet の速度 も 0 に。 + /// + public void RestoreInitialTransform(); + + /// + /// Joint レベルの可変情報をセットする + /// stiffness, + /// + public void SetJointLevel(Transform joint, BlittableJointMutable jointSettings); + + /// + /// Model レベルの可変情報をセットする + /// 風, pause, scaling + /// + public void SetModelLevel(Transform modelRoot, BlittableModelLevel modelSettings); } ``` -## Runtime の操作 - -`v0.128.0` - -### Runtime を取得する - -Vrm10Instance から取得してください。 - -```cs -Vrm10Instance vrm; -IVrm10SpringBoneRuntime springboneRuntime = vrm.Runtime.Springbone; -``` - ### 再構築する SpringBone の構成が変わったり、T-Poseが変わった場合に最初から再構築します。 @@ -216,3 +149,142 @@ vrm.Runtime.Springbone.SetModelLevel(joint.transform, joint.Blittable); ``` - [VRM1.0でエディターの再生中にSpringBobeの調整ができない · Issue #2410 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2410) + +- `Vrm10FastSpringboneRuntimeStandalone` + +になります。 + +- `Vrm10FastSpringboneRuntimeProvider` +- `Vrm10FastSpringboneRuntimeStandaloneProvider` + +をアッタチしてください。 + +## Vrm10FastSpringboneRuntime + +vrm-1.0 デフォルトの SpringBone ランタイムです。 + +- Unity C# Job System +- シングルトンでシーンすべての vrm-1.0 をバッチングする + +という特徴があります。 + +### RuntimeImport + +デフォルトで Vrm10FastSpringboneRuntime になります。 +特に作業は必要ありません。 + +### シーン配置 + +シーンに配置された `vrm-1.0` のルートに `Vrm10FastSpringboneRuntimeProvider` をアタッチしてください。 + +### FastSpringBoneService(singleton) + +```cs +[DefaultExecutionOrder(11010)] +public sealed class FastSpringBoneService : MonoBehaviour +{ + public static FastSpringBoneService Instance + { + get { + DontDestroyOnLoad(gameObject); + } + } + + private void LateUpdate() +} +``` + +:::tip + +Vrm10Instance より後ろです。 + +```csharp +[DefaultExecutionOrder(11000)] +public class Vrm10Instance : MonoBehaviour +``` + +::: + +:::warning 非play時に動作できません + +DontDestroyOnLoad + +::: + +:::note +明示的に破棄を行いたい場合は `FastSpringBoneService.Free` を呼んでください。 +::: + +### FastSpringBoneService(manual update) + +`v0.106.0` + +- FastSpringBoneService.UpdateTypes.Manual を追加 +- FastSpringBoneService.ManualUpdate を追加 + +```cs +// 管理している VRM-1.0 がすべて入っている +List instances; + +// setup +foreach(var instance in instances) +{ + // SpringBone を手動にするために、 + // VRM-1.0 本体も手動に変更している。 + // VRM本体 => SpringBone という処理順を守る。 + instance.UpdateType = UpdateTypes.None; +} +FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual; + +// each frame +foreach(var instance in instances) +{ + // SpringBone よりも先に VRM10Instance を更新 + instance.Runtime.Process(); +} +// 最後に FastSpringBoneService を更新 +// すべての VRM-1.0 の SpringBone がまとめて処理されます。 +FastSpringBoneService.Instance.ManualUpdate(time.deltaTime); +``` + +## Vrm10FastSpringboneRuntimeStandalone + +Vrm10FastSpringboneRuntime のシングルトンをやめて Vrm10Instance.LateUpdate から駆動するように 改造した版です。 +EditorPlay など小規模なシーンを想定しています。 + +- [UniVRM タイムライン…プレイモードとエデットモードで挙動が異なる · Issue #1971 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1971) +- [\[1.0\] FastSpringBone Service does not disposed when I change the code while playing in editor · Issue #1567 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1567) + +- Unity job system で実装されている +- Vrm10Runtime.Process 処理の 6 番目に実行される + +```cs +public class Vrm10Runtime : IDisposable +{ + public void Process() + { + // 1. Update From VrmAnimation + // 2. Control Rig + // 3. Constraints + // 4. Gaze control + // 5. Apply Expression + // 6. SpringBone + SpringBone.Process(); // 👈 + } +} +``` + +### RuntimeImport + +`importer` の引数に `Vrm10FastSpringboneRuntimeStandalone` を明示的に渡してください。 + +### シーン配置 + +デフォルトで Vrm10FastSpringboneRuntimeStandalone になります。 +特に作業は必要ありません。 + +:::info editor の scene play 時は Standalone 版がデフォルトになりました + +`v0.128` + +::: diff --git a/docs/api/springbone/vrm1/VRMC_springBone_extended_collider.md b/docs/api/springbone/vrm1/VRMC_springBone_extended_collider.md index 8e20c085b..b7c2e42a3 100644 --- a/docs/api/springbone/vrm1/VRMC_springBone_extended_collider.md +++ b/docs/api/springbone/vrm1/VRMC_springBone_extended_collider.md @@ -1,4 +1,6 @@ -# コライダー拡張 +# VRMC_springBone_extended_collider-1.0 + +`from v0.123.0` 3つのコライダー形状が追加されます。 diff --git a/docs/api/springbone/vrm1/index.md b/docs/api/springbone/vrm1/index.md index 1411641e6..134705f05 100644 --- a/docs/api/springbone/vrm1/index.md +++ b/docs/api/springbone/vrm1/index.md @@ -1,11 +1,18 @@ -# vrm-1.0 の SpringBone +# VRMC_springBone-1.0 -実行システムを切り替えられるようになりました。 +- https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone-1.0 -- `v0.86` **Vrm10FastSpringboneRuntime(default)**: Unity job system で実装されています。すべての vrm の spring bone まとめて処理するシングルトンです。 -- `v0.127` **Vrm10FastSpringboneRuntimeStandalone**: Unity job system で実装されています。モデル毎に個別に実行します。 +## 原点前向き以外で初期化 -## 仕様 +- [Imported VRM hair and clothes goes to the left no matter the position · Issue #2440 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2440) -- https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone-1.0 -- https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_springBone_extended_collider-1.0 `from v0.123.0` +## T-Pose 以外で初期化 + +`SpringBone` の初期化は T-Pose が必須です。 +対策として `T-Pose` である間に SpringBone の初期化を完了してください。 + +- `1.0` `~v0.126` 最初 SpringBone が動作する直前で初期化をしていました。`load` => 姿勢変更 => springbone初期化 という順番になったときにspringbone初期化で問題が発生していました。 +- `1.0` `v0.127` Import 関数の中で SpringBone の初期化をするように変更しました。`runtime` load では初期姿勢に配慮する必要はありません。 + +- [After using the “FastSpringBoneReplacer.ReplaceAsync” interface, scaling the VRM model results in incorrect behavior. · Issue #2158 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2158) +- [\[0.77\]AsyncでランタイムロードしたモデルのScaleを1以上にするとSpringBoneの動作が怪しくなる · Issue #1115 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1115) diff --git a/docs/api/springbone/vrm1/startup.md b/docs/api/springbone/vrm1/startup.md deleted file mode 100644 index d163674e1..000000000 --- a/docs/api/springbone/vrm1/startup.md +++ /dev/null @@ -1,16 +0,0 @@ -# 初期化問題 - -## 原点前向き以外で初期化 - -- [Imported VRM hair and clothes goes to the left no matter the position · Issue #2440 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2440) - -## T-Pose 以外で初期化 - -`SpringBone` の初期化は T-Pose が必須です。 -対策として `T-Pose` である間に SpringBone の初期化を完了してください。 - -- `1.0` `~v0.126` 最初 SpringBone が動作する直前で初期化をしていました。`load` => 姿勢変更 => springbone初期化 という順番になったときにspringbone初期化で問題が発生していました。 -- `1.0` `v0.127` Import 関数の中で SpringBone の初期化をするように変更しました。`runtime` load では初期姿勢に配慮する必要はありません。 - -- [After using the “FastSpringBoneReplacer.ReplaceAsync” interface, scaling the VRM model results in incorrect behavior. · Issue #2158 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2158) -- [\[0.77\]AsyncでランタイムロードしたモデルのScaleを1以上にするとSpringBoneの動作が怪しくなる · Issue #1115 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/1115) diff --git a/docs/release/079/v0.88.0.md b/docs/release/079/v0.88.0.md index 6ea2ed416..ade59f75c 100644 --- a/docs/release/079/v0.88.0.md +++ b/docs/release/079/v0.88.0.md @@ -2,7 +2,7 @@ ## 過去に TransparentZWrite シェーダーでエクスポートしたファイルをロード時に変換する修正 -* [TransparentZWrite ](/api/transparent_zwrite) +* [TransparentZWrite ](/api/material/transparent_zwrite) * [[\#1331](https://github.com/vrm-c/UniVRM/pull/1331)] Fix UnlitTransparentZWrite fallback code. ## buffer.uri に `data:` を使っている glb/gltf に対応 diff --git a/docs/release/112/v0.127.1.md b/docs/release/112/v0.127.1.md index 707e68f1d..927fb41f8 100644 --- a/docs/release/112/v0.127.1.md +++ b/docs/release/112/v0.127.1.md @@ -26,5 +26,5 @@ https://github.com/vrm-c/UniVRM/milestone/93?closed=1 ### 詳細 -- [vrm-1.0](/api/springbone/vrm1/runtime/) +- [vrm-1.0](/api/springbone/vrm1/IVrm10SpringBoneRuntime) - [vrm-0.x](/api/springbone/vrm0/VRM_IVrm0XSpringBoneRuntime/) diff --git a/docs/vrma/univrm-vrma/retarget.md b/docs/vrma/univrm-vrma/retarget.md index e0437708e..bf8137ed2 100644 --- a/docs/vrma/univrm-vrma/retarget.md +++ b/docs/vrma/univrm-vrma/retarget.md @@ -14,7 +14,7 @@ UniVRM の vrm-1.0 実装には、初期姿勢の変換をサポートする `Co 含まれています。 ランタイムロードでは自動的にセットアップされます。 -[ControlRig 正規化されていないモデルを操作する](/api/vrm1_controlrig/) +[ControlRig 正規化されていないモデルを操作する](/api/humanoid/vrm1_controlrig/) :::tip Unity の mecanim humanoid に肩代りしてもらうこともできます diff --git a/sidebars.ts b/sidebars.ts index 7e867a92d..06398ef09 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -337,7 +337,7 @@ const sidebars: SidebarsConfig = { items: [ 'api/editor-import/vrm0x', 'api/editor-import/vrm10', - { type: "doc", id: "api/scripted_importer" }, + "api/editor-import/scripted_importer", ] }, { @@ -346,18 +346,20 @@ const sidebars: SidebarsConfig = { items: [ "api/material/urp", "api/runtime-import/import_basisu", - { type: "doc", id: "api/0_96_1_use_gamma_colorspace" }, - { type: "doc", id: "api/0_76_texture_deserializer" }, - { type: "doc", id: "api/texture_manipulation" }, - { type: "doc", id: "api/transparent_zwrite" }, - { type: "doc", id: "gltf/emission_glow" }, + "api/material/0_96_1_use_gamma_colorspace", + "api/material/0_76_texture_deserializer", + "api/material/texture_manipulation", + "api/material/transparent_zwrite", + "gltf/emission_glow", ], }, { type: "category", label: "FirstPerson", - link: { type: "doc", id: "api/first_person" }, - items: ["api/vrm1_firstperson", "api/firstperson"], + items: [ + "api/firstperson/first_person", + "api/firstperson/vrm1_firstperson", + "api/firstperson/firstperson",], }, { type: "category", @@ -368,10 +370,8 @@ const sidebars: SidebarsConfig = { label: "vrm-1.0", link: { type: "doc", id: "api/springbone/vrm1/index" }, items: [ - "api/springbone/vrm1/runtime", - "api/springbone/vrm1/VRMC_springBone_extended_collider", - "api/springbone/vrm1/FastSpringBoneService", - 'api/springbone/vrm1/startup', + "api/springbone/vrm1/IVrm10SpringBoneRuntime", + { type: "doc", label: "ExtendedCollider", id: "api/springbone/vrm1/VRMC_springBone_extended_collider" }, ] }, { @@ -393,7 +393,7 @@ const sidebars: SidebarsConfig = { items: [ "api/humanoid/humanoid_animation", "vrma/univrm-vrma/retarget", - { type: "doc", id: "api/vrm1_controlrig" }, + "api/humanoid/vrm1_controlrig", ], }, { @@ -407,16 +407,15 @@ const sidebars: SidebarsConfig = { { type: "category", label: "glTF", - link: { type: "doc", id: "gltf/index" }, items: [ - { type: "doc", id: "gltf/glb_import" }, - { type: "doc", id: "gltf/glb_export" }, - { type: "doc", id: "gltf/animation_exporter" }, + "gltf/glb_import", + "gltf/glb_export", + "gltf/animation_exporter", "gltf/root_node", - { type: "doc", id: "api/0_36_update" }, - { type: "doc", id: "api/format" }, - { type: "doc", id: "api/how_to_impl_extension" }, - { type: "doc", id: "api/coordinate" }, + "api/gltf/0_36_update", + "api/gltf/format", + "api/gltf/how_to_impl_extension", + "api/coordinate", ], }, ], From 965b0afde3efee645d09908e5402f73380926179 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 19 Dec 2024 15:15:05 +0900 Subject: [PATCH 3/7] update --- docs/api/api_update.md | 10 ++-- docs/api/editor-import/vrm10.md | 1 - docs/api/sample/AnimationBridgeSample.md | 3 - docs/api/sample/RuntimeExporterSample.md | 6 -- docs/api/sample/Vrm10FirstPersonSample.md | 13 ----- docs/api/sample/index.md | 0 docs/api/sample/index.mdx | 6 -- docs/api/sample/sample_from_upm.jpg | Bin 0 -> 77375 bytes docs/api/sample/sample_install.md | 15 +++-- .../api/sample/vrm0x/AnimationBridgeSample.md | 5 ++ docs/api/sample/vrm0x/FirstPersonSample.md | 14 +++++ .../api/sample/vrm0x/RuntimeExporterSample.md | 7 +++ docs/api/sample/{ => vrm0x}/SimpleViewer.md | 5 +- .../{ => vrm0x}/vrm0_firstperson_sample.jpg | Bin docs/api/sample/vrm10/ClothSample.md | 7 +++ docs/api/sample/vrm10/SimpleVrma.md | 3 + .../vrm10/VRM10RuntimeExporterSample.md | 3 + .../Vrm10FirstPersonSample.md} | 9 +-- .../index.md => vrm10/Vrm10Viewer.md} | 5 +- .../{VRM10Viewer => vrm10}/vrm10viewer.jpg | Bin .../{ => vrm10}/vrm1_firstperson_sample.jpg | Bin .../sample/VRM10Viewer => vrma}/animation.md | 0 docs/vrma/univrm-vrma/vrma-import.md | 2 +- sidebars.ts | 55 ++++++++++-------- 24 files changed, 94 insertions(+), 75 deletions(-) delete mode 100644 docs/api/editor-import/vrm10.md delete mode 100644 docs/api/sample/AnimationBridgeSample.md delete mode 100644 docs/api/sample/RuntimeExporterSample.md delete mode 100644 docs/api/sample/Vrm10FirstPersonSample.md create mode 100644 docs/api/sample/index.md delete mode 100644 docs/api/sample/index.mdx create mode 100644 docs/api/sample/sample_from_upm.jpg create mode 100644 docs/api/sample/vrm0x/AnimationBridgeSample.md create mode 100644 docs/api/sample/vrm0x/FirstPersonSample.md create mode 100644 docs/api/sample/vrm0x/RuntimeExporterSample.md rename docs/api/sample/{ => vrm0x}/SimpleViewer.md (71%) rename docs/api/sample/{ => vrm0x}/vrm0_firstperson_sample.jpg (100%) create mode 100644 docs/api/sample/vrm10/ClothSample.md create mode 100644 docs/api/sample/vrm10/SimpleVrma.md create mode 100644 docs/api/sample/vrm10/VRM10RuntimeExporterSample.md rename docs/api/sample/{FirstPersonSample.md => vrm10/Vrm10FirstPersonSample.md} (57%) rename docs/api/sample/{VRM10Viewer/index.md => vrm10/Vrm10Viewer.md} (62%) rename docs/api/sample/{VRM10Viewer => vrm10}/vrm10viewer.jpg (100%) rename docs/api/sample/{ => vrm10}/vrm1_firstperson_sample.jpg (100%) rename docs/{api/sample/VRM10Viewer => vrma}/animation.md (100%) diff --git a/docs/api/api_update.md b/docs/api/api_update.md index 0009c69e7..444ab4add 100644 --- a/docs/api/api_update.md +++ b/docs/api/api_update.md @@ -32,12 +32,11 @@ ## Expression -```{admonition} VRMBlendShapeProxy は Vrm10Instance.Runtime.Expression になりました。 -:class: info +:::info VRMBlendShapeProxy は Vrm10Instance.Runtime.Expression になりました。 ImmediatelySetValue と AccumulateValue は、SetWeight に一本化されました。 ImmediatelySetValue は無くなりました。 -``` +::: ```csharp var proxy = root.GetComponent(); @@ -53,12 +52,11 @@ vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPres ## LookAt -```{admonition} VRMLookAt は Vrm10Instance.Runtime.LookAt になりました。 -:class: info +:::info VRMLookAt は Vrm10Instance.Runtime.LookAt になりました。 vrm10.Gaze.position か vrm10.Runtime.LookAt.SetLookAtYawPitch で予め更新しておいた値が、 後で vrm10.Runtime により適用されます。 -``` +::: ### Gaze diff --git a/docs/api/editor-import/vrm10.md b/docs/api/editor-import/vrm10.md deleted file mode 100644 index 3287995e6..000000000 --- a/docs/api/editor-import/vrm10.md +++ /dev/null @@ -1 +0,0 @@ -# GLTF / VRM-1.0 の EidtorImport 動作 diff --git a/docs/api/sample/AnimationBridgeSample.md b/docs/api/sample/AnimationBridgeSample.md deleted file mode 100644 index 88b211a8c..000000000 --- a/docs/api/sample/AnimationBridgeSample.md +++ /dev/null @@ -1,3 +0,0 @@ -# AnimationBridgeSample - -AnimationClip に BlendShape の変換を記録して反映するサンプルです。 diff --git a/docs/api/sample/RuntimeExporterSample.md b/docs/api/sample/RuntimeExporterSample.md deleted file mode 100644 index 8d4806540..000000000 --- a/docs/api/sample/RuntimeExporterSample.md +++ /dev/null @@ -1,6 +0,0 @@ -# RuntimeExporter - -VRM を Runtime Export するサンプルです。 - -`Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs` - diff --git a/docs/api/sample/Vrm10FirstPersonSample.md b/docs/api/sample/Vrm10FirstPersonSample.md deleted file mode 100644 index 8fbbe35dd..000000000 --- a/docs/api/sample/Vrm10FirstPersonSample.md +++ /dev/null @@ -1,13 +0,0 @@ -# FirstPersonSample - -![image](./vrm0_firstperson_sample.jpg) - -VR アプリで FistPerson の設定に合わせて、可視設定を反映するサンプルです。 - -画面が4分割されて、 - -* HMDカメラ -* その他のカメラ - -の描画を例示します。 - diff --git a/docs/api/sample/index.md b/docs/api/sample/index.md new file mode 100644 index 000000000..e69de29bb diff --git a/docs/api/sample/index.mdx b/docs/api/sample/index.mdx deleted file mode 100644 index a663db694..000000000 --- a/docs/api/sample/index.mdx +++ /dev/null @@ -1,6 +0,0 @@ -import DocCardList from '@theme/DocCardList'; - -# Samples - - - diff --git a/docs/api/sample/sample_from_upm.jpg b/docs/api/sample/sample_from_upm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..591c50173736a6a99f9e2f2cde0ac31e05760b99 GIT binary patch literal 77375 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 UwawtfDCxg|YaJ3e{$=2Q0E5rqPXGV_ literal 0 HcmV?d00001 diff --git a/docs/api/sample/sample_install.md b/docs/api/sample/sample_install.md index 00e8065d2..ed8984027 100644 --- a/docs/api/sample/sample_install.md +++ b/docs/api/sample/sample_install.md @@ -1,13 +1,19 @@ -# UniVRM サンプルをインストールする +# Install UniVRM Sample -このセクションでは、[UniVRM パッケージをインストール](/univrm/install/univrm_install)したことを想定しています。 +## UPM -## UniVRM サンプルのパッケージ +![PackageManager](./sample_from_upm.jpg) + +## Unity Package + +[UniVRM パッケージをインストール](/univrm/install/univrm_install) の場合 + +### UniVRM サンプルのパッケージ `v0.81.0` から UniVRM サンプルは UniVRM パッケージに含まれています。 最新の UniVRM バージョンがインストールされている場合は、**UniVRM サンプルのシーンを実行する**セクションをご覧ください。 -### ~ v0.80.0 +#### ~ v0.80.0 https://github.com/vrm-c/UniVRM/releases @@ -22,4 +28,3 @@ https://github.com/vrm-c/UniVRM/releases 以下の画像ようにインポートウィンドウを見たら、`Import`ボタンをクリックしてください: ![sample_package_import](/images/vrm/sample_package_import.jpg) - diff --git a/docs/api/sample/vrm0x/AnimationBridgeSample.md b/docs/api/sample/vrm0x/AnimationBridgeSample.md new file mode 100644 index 000000000..fb71a404b --- /dev/null +++ b/docs/api/sample/vrm0x/AnimationBridgeSample.md @@ -0,0 +1,5 @@ +# AnimationBridgeSample + +[Assets/VRM_Samples/AnimationBridgeSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM_Samples/AnimationBridgeSample) + +AnimationClip に BlendShape の変換を記録して反映するサンプルです。 diff --git a/docs/api/sample/vrm0x/FirstPersonSample.md b/docs/api/sample/vrm0x/FirstPersonSample.md new file mode 100644 index 000000000..dbe9931da --- /dev/null +++ b/docs/api/sample/vrm0x/FirstPersonSample.md @@ -0,0 +1,14 @@ +# FirstPersonSample + +[Assets/VRM_Samples/FirstPersonSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM_Samples/FirstPersonSample) + +![FirstPersonSample](./vrm0_firstperson_sample.jpg) + +VR アプリで FistPerson の設定に合わせて、可視設定を反映するサンプルです。 + +画面が4分割されて、 + +- HMDカメラ +- その他のカメラ + +の描画を例示します。 diff --git a/docs/api/sample/vrm0x/RuntimeExporterSample.md b/docs/api/sample/vrm0x/RuntimeExporterSample.md new file mode 100644 index 000000000..96b860cbc --- /dev/null +++ b/docs/api/sample/vrm0x/RuntimeExporterSample.md @@ -0,0 +1,7 @@ +# RuntimeExporterSample + +[Assets/VRM_Samples/RuntimeExporterSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM_Samples/RuntimeExporterSample) + +VRM を Runtime Export するサンプルです。 + +`Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs` diff --git a/docs/api/sample/SimpleViewer.md b/docs/api/sample/vrm0x/SimpleViewer.md similarity index 71% rename from docs/api/sample/SimpleViewer.md rename to docs/api/sample/vrm0x/SimpleViewer.md index e06f56f8e..adece75ae 100644 --- a/docs/api/sample/SimpleViewer.md +++ b/docs/api/sample/vrm0x/SimpleViewer.md @@ -1,5 +1,7 @@ # SimpleViewer +[Assets/VRM_Samples/SimpleViewer](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM_Samples/SimpleViewer) + Runtime ローダーのサンプルです。 `Assets/VRM_Samples/SimpleViewer/ViewerUI.cs` @@ -16,7 +18,4 @@ Runtime ローダーのサンプルです。 ![sample_viewer_activate](/images/vrm/sample_viewer_activate.jpg) -`VRM.Samples`に[ランタイム VRM エクスポート](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM/Samples/RuntimeExporterSample)と[一人称レンダリング](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM/Samples/FirstPersonSample)のサンプルがあります。 - Alicia モデルは[こちら](https://github.com/vrm-c/UniVRM/blob/master/Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm)。 - diff --git a/docs/api/sample/vrm0_firstperson_sample.jpg b/docs/api/sample/vrm0x/vrm0_firstperson_sample.jpg similarity index 100% rename from docs/api/sample/vrm0_firstperson_sample.jpg rename to docs/api/sample/vrm0x/vrm0_firstperson_sample.jpg diff --git a/docs/api/sample/vrm10/ClothSample.md b/docs/api/sample/vrm10/ClothSample.md new file mode 100644 index 000000000..0d8a58d96 --- /dev/null +++ b/docs/api/sample/vrm10/ClothSample.md @@ -0,0 +1,7 @@ +# ClothSample + +`v0.128.1` + +🚧 🚧 🚧 + +[Assets/VRM10_Samples/ClothSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM10_Samples/ClothSample) diff --git a/docs/api/sample/vrm10/SimpleVrma.md b/docs/api/sample/vrm10/SimpleVrma.md new file mode 100644 index 000000000..1e86f32bf --- /dev/null +++ b/docs/api/sample/vrm10/SimpleVrma.md @@ -0,0 +1,3 @@ +# SimpleVrma + +[Assets/VRM10_Samples/SimpleVrma](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM10_Samples/SimpleVrma) diff --git a/docs/api/sample/vrm10/VRM10RuntimeExporterSample.md b/docs/api/sample/vrm10/VRM10RuntimeExporterSample.md new file mode 100644 index 000000000..f16ed7ee3 --- /dev/null +++ b/docs/api/sample/vrm10/VRM10RuntimeExporterSample.md @@ -0,0 +1,3 @@ +# VRM10RuntimeExporterSample + +[Assets/VRM10_Samples/VRM10RuntimeExporterSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM10_Samples/VRM10RuntimeExporterSample) diff --git a/docs/api/sample/FirstPersonSample.md b/docs/api/sample/vrm10/Vrm10FirstPersonSample.md similarity index 57% rename from docs/api/sample/FirstPersonSample.md rename to docs/api/sample/vrm10/Vrm10FirstPersonSample.md index 72596e350..d5d1fccfe 100644 --- a/docs/api/sample/FirstPersonSample.md +++ b/docs/api/sample/vrm10/Vrm10FirstPersonSample.md @@ -1,4 +1,6 @@ -# vmr-1.0 FirstPersonSample +# VRM10FirstPersonSample + +[Assets/VRM10_Samples/VRM10FirstPersonSample](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM10_Samples/VRM10FirstPersonSample) ![image](./vrm1_firstperson_sample.jpg) @@ -8,8 +10,7 @@ VR アプリで FistPerson の設定に合わせて、可視設定を反映す 画面が4分割されて、 -* HMDカメラ -* その他のカメラ +- HMDカメラ +- その他のカメラ の描画を例示します。 - diff --git a/docs/api/sample/VRM10Viewer/index.md b/docs/api/sample/vrm10/Vrm10Viewer.md similarity index 62% rename from docs/api/sample/VRM10Viewer/index.md rename to docs/api/sample/vrm10/Vrm10Viewer.md index e026850f9..6dd313bd3 100644 --- a/docs/api/sample/VRM10Viewer/index.md +++ b/docs/api/sample/vrm10/Vrm10Viewer.md @@ -1,6 +1,8 @@ # VRM10Viewer -![image](./vrm10viewer.jpg) +[Assets/VRM10_Samples/VRM10Viewer](https://github.com/vrm-c/UniVRM/tree/master/Assets/VRM10_Samples/VRM10Viewer) + +![vrm10viewer](./vrm10viewer.jpg) vrm-1.0 の Runtime ローダーのサンプルです。 @@ -10,4 +12,3 @@ vrm-1.0 の Runtime ローダーのサンプルです。 - (model) vrm-0.x(vrm-1.0 に動的に変換する) - (motion) bvh - (motion) vrm-animation - diff --git a/docs/api/sample/VRM10Viewer/vrm10viewer.jpg b/docs/api/sample/vrm10/vrm10viewer.jpg similarity index 100% rename from docs/api/sample/VRM10Viewer/vrm10viewer.jpg rename to docs/api/sample/vrm10/vrm10viewer.jpg diff --git a/docs/api/sample/vrm1_firstperson_sample.jpg b/docs/api/sample/vrm10/vrm1_firstperson_sample.jpg similarity index 100% rename from docs/api/sample/vrm1_firstperson_sample.jpg rename to docs/api/sample/vrm10/vrm1_firstperson_sample.jpg diff --git a/docs/api/sample/VRM10Viewer/animation.md b/docs/vrma/animation.md similarity index 100% rename from docs/api/sample/VRM10Viewer/animation.md rename to docs/vrma/animation.md diff --git a/docs/vrma/univrm-vrma/vrma-import.md b/docs/vrma/univrm-vrma/vrma-import.md index ec6dc8624..2351817cb 100644 --- a/docs/vrma/univrm-vrma/vrma-import.md +++ b/docs/vrma/univrm-vrma/vrma-import.md @@ -1,3 +1,3 @@ # VRM-Animation import -[VRM10Viewer](/api/sample/VRM10Viewer/animation/) を参照してください。 +[VRM10Viewer](/vrma/animation/) を参照してください。 diff --git a/sidebars.ts b/sidebars.ts index 06398ef09..2d104b902 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -74,6 +74,7 @@ const sidebars: SidebarsConfig = { "vrma/univrm-vrma/vrma-import", "vrma/univrm-vrma/vrma-export", "vrma/univrm-vrma/retarget", + "vrma/animation", ], }, ], @@ -282,17 +283,28 @@ const sidebars: SidebarsConfig = { link: { type: "doc", id: "api/sample/index" }, items: [ "api/sample/sample_install", - "api/sample/SimpleViewer", - "api/sample/RuntimeExporterSample", - "api/sample/FirstPersonSample", - "api/sample/AnimationBridgeSample", { type: "category", - label: "VRM10Viewer", - link: { type: "doc", id: "api/sample/VRM10Viewer/index" }, - items: ["api/sample/VRM10Viewer/animation"], + label: "vrm-1.0", + items: [ + "api/sample/vrm10/VRM10Viewer", + "api/sample/vrm10/VRM10RuntimeExporterSample", + "api/sample/vrm10/VRM10FirstPersonSample", + "api/sample/vrm10/SimpleVrma", + "api/sample/vrm10/ClothSample", + ], }, - "api/sample/Vrm10FirstPersonSample", + { + type: "category", + label: "vrm-0.x", + items: [ + "api/sample/vrm0x/SimpleViewer", + "api/sample/vrm0x/RuntimeExporterSample", + "api/sample/vrm0x/FirstPersonSample", + "api/sample/vrm0x/AnimationBridgeSample", + ], + }, + , ], }, { @@ -331,15 +343,6 @@ const sidebars: SidebarsConfig = { , ], }, - { - type: "category", - label: "EditorImport", - items: [ - 'api/editor-import/vrm0x', - 'api/editor-import/vrm10', - "api/editor-import/scripted_importer", - ] - }, { type: "category", label: "Material/Texture", @@ -396,14 +399,6 @@ const sidebars: SidebarsConfig = { "api/humanoid/vrm1_controlrig", ], }, - { - type: "category", - label: "Mesh", - items: [ - { type: "doc", id: "gltf/mesh_utility" }, - { type: "doc", id: "api/mesh/bake" }, - ] - }, { type: "category", label: "glTF", @@ -418,6 +413,16 @@ const sidebars: SidebarsConfig = { "api/coordinate", ], }, + { + type: "category", + label: "Others", + items: [ + "gltf/mesh_utility", + "api/mesh/bake", + 'api/editor-import/vrm0x', + "api/editor-import/scripted_importer", + ] + }, ], }, ], From d530542db36d9b6c8a3b5e16f387e905ba4dfca7 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 19 Dec 2024 15:22:22 +0900 Subject: [PATCH 4/7] upper --- .../{Vrm10FirstPersonSample.md => VRM10FirstPersonSample.md} | 0 docs/api/sample/vrm10/{Vrm10Viewer.md => VRM10Viewer.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/api/sample/vrm10/{Vrm10FirstPersonSample.md => VRM10FirstPersonSample.md} (100%) rename docs/api/sample/vrm10/{Vrm10Viewer.md => VRM10Viewer.md} (100%) diff --git a/docs/api/sample/vrm10/Vrm10FirstPersonSample.md b/docs/api/sample/vrm10/VRM10FirstPersonSample.md similarity index 100% rename from docs/api/sample/vrm10/Vrm10FirstPersonSample.md rename to docs/api/sample/vrm10/VRM10FirstPersonSample.md diff --git a/docs/api/sample/vrm10/Vrm10Viewer.md b/docs/api/sample/vrm10/VRM10Viewer.md similarity index 100% rename from docs/api/sample/vrm10/Vrm10Viewer.md rename to docs/api/sample/vrm10/VRM10Viewer.md From b1f90f0e2fc59d277675dc149ac5b2d296d6d751 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 23 Dec 2024 16:08:02 +0900 Subject: [PATCH 5/7] update --- docs/release/128/v0.128.1.md | 20 +++++++++++++++++++ .../release/128/{vv_nextnext.md => v_next.md} | 2 +- docs/release/128/v_nextnext.md | 4 ++++ docs/release/128/vv_next.md | 3 --- 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 docs/release/128/v0.128.1.md rename docs/release/128/{vv_nextnext.md => v_next.md} (74%) create mode 100644 docs/release/128/v_nextnext.md delete mode 100644 docs/release/128/vv_next.md diff --git a/docs/release/128/v0.128.1.md b/docs/release/128/v0.128.1.md new file mode 100644 index 000000000..a2e2a52ef --- /dev/null +++ b/docs/release/128/v0.128.1.md @@ -0,0 +1,20 @@ +# 🚧 v0.128.1 VRMA editor import + +https://github.com/vrm-c/UniVRM/milestone/96?closed=1 + +## vrma + +- [\[vrma\]\[editor\] VRMA の EditorImport by ousttrue · Pull Request #2534 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2534) + +## export + +- [\[0.x\]\[export\] 正規化時にBlendShapeをベイクするチェックボックスが無かった by ousttrue · Pull Request #2512 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2512) + +## SpringBone + +- [\[fastspringbone\] InitCurrentTailsJob use spring.transformIndexOffset by ousttrue · Pull Request #2507 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2507) +- [\[0.x\]\[springbone\] rootBone 重複対策 by ousttrue · Pull Request #2506 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2506) + +## URP + +- [Exporting issue on URP Lit Materials with transparency · Issue #2387 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2387) diff --git a/docs/release/128/vv_nextnext.md b/docs/release/128/v_next.md similarity index 74% rename from docs/release/128/vv_nextnext.md rename to docs/release/128/v_next.md index 8484032c6..8cccd1bba 100644 --- a/docs/release/128/vv_nextnext.md +++ b/docs/release/128/v_next.md @@ -1,3 +1,3 @@ -# 🚧 nextnext +# 🚧 next https://github.com/vrm-c/UniVRM/milestone/97 diff --git a/docs/release/128/v_nextnext.md b/docs/release/128/v_nextnext.md new file mode 100644 index 000000000..37cdebe33 --- /dev/null +++ b/docs/release/128/v_nextnext.md @@ -0,0 +1,4 @@ +# 🚧 nextnext + +https://github.com/vrm-c/UniVRM/milestone/98 + diff --git a/docs/release/128/vv_next.md b/docs/release/128/vv_next.md deleted file mode 100644 index 4b6925cb2..000000000 --- a/docs/release/128/vv_next.md +++ /dev/null @@ -1,3 +0,0 @@ -# 🚧 next - -https://github.com/vrm-c/UniVRM/milestone/96 From 341d78b8d77570af4640b4b0737a30207d215838 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 24 Dec 2024 15:24:23 +0900 Subject: [PATCH 6/7] update --- docs/release/128/v0.128.1.md | 2 +- docs/univrm/error/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release/128/v0.128.1.md b/docs/release/128/v0.128.1.md index a2e2a52ef..ac93222c1 100644 --- a/docs/release/128/v0.128.1.md +++ b/docs/release/128/v0.128.1.md @@ -1,4 +1,4 @@ -# 🚧 v0.128.1 VRMA editor import +# v0.128.1 VRMA editor import https://github.com/vrm-c/UniVRM/milestone/96?closed=1 diff --git a/docs/univrm/error/index.md b/docs/univrm/error/index.md index cedc5be4a..aed222b1c 100644 --- a/docs/univrm/error/index.md +++ b/docs/univrm/error/index.md @@ -10,7 +10,7 @@ [\[0.x\]\[export\] 正規化時にBlendShapeをベイクするチェックボックスが無かった by ousttrue · Pull Request #2512 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/pull/2512) -- fixed `v0.128.1` (予定) +- fixed `v0.128.1` ::: From 045963fa4bdff5a3a0c7aee522814efab13b1127 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 24 Dec 2024 18:43:40 +0900 Subject: [PATCH 7/7] update --- docs/api/api_update.md | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/docs/api/api_update.md b/docs/api/api_update.md index 444ab4add..19ded4b82 100644 --- a/docs/api/api_update.md +++ b/docs/api/api_update.md @@ -1,7 +1,6 @@ # 0.x to 1.0 -`VRM-0.x` の個別のコンポーネントに機能を分散する設計を変更して -`Vrm10Instance` にすべてを集約する方式になりました。 +The design of distributing functions to individual components of `VRM-0.x` has been changed to consolidating everything into `Vrm10Instance`. | 0.x | 1.0 | | ----------------------------- | ------------------------------ | @@ -9,33 +8,32 @@ | VRMLookAt | VRMInstance.Runtime.LookAt | | VRMSpringBone(各SpringのRoot) | VRMInstance.Runtime.SpringBone | -:::info 毎フレーム決まった順番で更新します。 +:::info It updates every frame in a fixed order. 1. Control Rig 2. Constraints 3. Gaze control 4. Expression -ポーズ付け、ポーズの加工を考慮すると +Considering posing and pose processing -- [-2] ControlRig にポーズを付ける(Animator もしくは独自処理) -- [-1] ControlRig の修正。IK など -- [1] ControlRig 適用 から本体へのモーション転送 -- [2] Constraints 解決 -- [3] Gaze control 解決 -- [4] Expression 適用 -- [5] SpringBone 更新 +- [-2] Pose the ControlRig (using Animator or your own process) +- [-1] ControlRig fixes. IK etc. +- [1] Applying ControlRig to transfer motion to the body +- [2] Constraints Solution +- [3] Gaze control solution +- [4] Expression apply +- [5] SpringBone Update -となりそうです。 -順番の制御が必要な場合は、VRMInstance の更新を手動に切り替えて手動で更新してください。 +If you need control over the order, you can update the VRMInstance manually by switching it to update manually. ::: ## Expression -:::info VRMBlendShapeProxy は Vrm10Instance.Runtime.Expression になりました。 +:::info VRMBlendShapeProxy is now Vrm10Instance.Runtime.Expression. -ImmediatelySetValue と AccumulateValue は、SetWeight に一本化されました。 -ImmediatelySetValue は無くなりました。 +ImmediatelySetValue and AccumulateValue have been merged into SetWeight. +ImmediatelySetValue is gone. ::: ```csharp @@ -52,10 +50,9 @@ vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPres ## LookAt -:::info VRMLookAt は Vrm10Instance.Runtime.LookAt になりました。 +:::info VRMLookAt is now Vrm10Instance.Runtime.LookAt. -vrm10.Gaze.position か vrm10.Runtime.LookAt.SetLookAtYawPitch で予め更新しておいた値が、 -後で vrm10.Runtime により適用されます。 +The values ​​previously updated by vrm10.Gaze.position or vrm10.Runtime.LookAt.SetLookAtYawPitch will be applied later by vrm10.Runtime. ::: ### Gaze