Skip to content

Commit

Permalink
Merge pull request #26 from vrm-c/merge/release-vrma
Browse files Browse the repository at this point in the history
Merge/release vrma
  • Loading branch information
ousttrue authored Feb 15, 2024
2 parents 7d94ca4 + 7c75407 commit bffc0d6
Show file tree
Hide file tree
Showing 26 changed files with 893 additions and 421 deletions.
109 changes: 109 additions & 0 deletions docs/api/mesh/bake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Mesh Bake の実装

## Mesh Bake とは

:::tip この機能を Freeze と呼ぶこともあります
:::

Unity にはその名もずばり BakeMesh という関数があります。

[SkinnedMeshRenderer-BakeMesh - Unity スクリプトリファレンス](https://docs.unity3d.com/jp/current/ScriptReference/SkinnedMeshRenderer.BakeMesh.html)

SkinnedMesh で bone を動かしてからこの関数を呼ぶと、その状態の mesh を得ることができます。

:::warning blendShape の変更も Bake されます
:::

:::warning mesh に入っている blendshape は変更されません
:::

## Bake と Mesh.bindposes

bake された Mesh を SkinnedMeshRenderer で動かすには、
bake した状態の bone から Mesh.bindposes を計算して置き換える必要があります。
以下のコードでできます。

```cs
SkinnedMeshRenderer smr;
mesh.bindposes = smr.bones.Select(x => x.worldToLocalMatrix).ToArray();
```

:::tip
逆に言うとこの計算で得られる値と異なる bindposes には、
なんからの mesh 変形が含まれています。

- scaling, mirrorring … etc
- A スタンスの T スタンスへの補正
- Z-UP を Y-UP に回転
:::

:::tip クリーンナップする効果があります。
例えば、mirror を表現する負のスケーリングをクリアする効果があります。

mesh が反転して格納されていて、bondpose でミラーリングする手法があった。
:::

## bindposes の変更

bone の world 位置を維持して回転と拡大縮小を変更してから bindposes を計算した場合でも、
Skinning が壊れることはありません。

:::tip bone の position が関節の回転原点
:::

:::tip 回転は自由に設定しても問題ありません
任意の流儀の rig に合わせられます。
:::

:::danger スケールは 1 がお勧め

lossyScale と同じ問題があり、行列では表現できるが scale では表現できないなどのトラブルがあります。
:::

## blendshape に対応する

blendshape を列挙してひとつずつ weight を上げてから bake して、
元の mesh の vertices を引き算することで blendshape の bake を得ることができます。

`Assets\UniGLTF\Runtime\MeshUtility\MeshFreezer.cs`

:::danger ヒエラルキーに拡大縮小が含まれているとうまくいかない例がある
:::

:::warning position だけを処理対象にしておくのが無難と思われます
:::

## vrm-0.x 正規化

BakeMesh に対する boneposes 計算前に回転と拡大縮小を変更することが可能であることを利用して、
無回転、無拡大縮小にするのが vrm-0.x の正規化処理です。
事前に T-Pose にするという規約が追加されています。

`Assets\UniGLTF\Runtime\MeshUtility\MeshFreezer.cs`

## 関連

- https://github.com/vrm-c/UniVRM/issues?q=is%3Aissue+bake+is%3Aclosed
- https://github.com/vrm-c/UniVRM/issues?q=is%3Aissue+freeze+is%3Aclosed

## bake 処理の改修

[v0.116](/release/112/v0.116.0/)
, [v0.117](/release/112/v0.117.0/)
, [v0.119](/release/112/v0.119.0/)

https://github.com/vrm-c/UniVRM/blob/v0.115.0/Assets/UniGLTF/Runtime/MeshUtility/BoneNormalizer.cs#L226

正規化処理を複数のステップに分割して、
読めるようにする。

- Mesh の bake
- Hierarchy の正規化
- SkinnedMeshRenderer へのアタッチと bindposes の計算

### TODO

- glTF exporter 統合
- vrm1 exporter 統合


46 changes: 46 additions & 0 deletions docs/api/sample/VRM10Viewer/animation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# import animation

VRM-1.0 を import します。

```cs title="load vrm-1.0"
var vrm10Instance = await Vrm10.LoadPathAsync(path,
canLoadVrm0X: true,
showMeshes: false,
awaitCaller: m_useAsync.enabled
? (IAwaitCaller)new RuntimeOnlyAwaitCaller()
: (IAwaitCaller)new ImmediateCaller(),
materialGenerator: GetVrmMaterialDescriptorGenerator(m_useUrpMaterial.isOn),
vrmMetaInformationCallback: m_texts.UpdateMeta,
ct: cancellationToken);
if (cancellationToken.IsCancellationRequested)
{
UnityObjectDestroyer.DestroyRuntimeOrEditor(vrm10Instance.gameObject);
cancellationToken.ThrowIfCancellationRequested();
}

var instance = vrm10Instance.GetComponent<RuntimeGltfInstance>();
instance.ShowMeshes();
instance.EnableUpdateWhenOffscreen();
```

VRM-Animation を import します。

```cs title="load vrm-animation"
// gltf, glb etc...
using GltfData data = new AutoGltfFileParser(path).Parse();
using var loader = new VrmAnimationImporter(data);
var instance = await loader.LoadAsync(new ImmediateCaller());
var vrmAnimation = instance.GetComponent<Vrm10AnimationInstance>();
instance.GetComponent<Animation>().Play();
```

VRM-1.0 と VRM-Animation を連結します。

```cs title="connect model with vrm-animation"
vrm10Instance.Runtime.VrmAnimation = vrmAnimation;
```

:::info
以降 Vrm10Instance の Update もしくは LateUpdate で、
VRM-Animation のポーズが Vrm-1.0 に転送されます。
:::
13 changes: 13 additions & 0 deletions docs/api/sample/VRM10Viewer/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# VRM10Viewer

![image](./vrm10viewer.jpg)

vrm-1.0 の Runtime ローダーのサンプルです。

以下のフォーマットをロードできます。

- (model) vrm-1.0
- (model) vrm-0.x(vrm-1.0 に動的に変換する)
- (motion) bvh
- (motion) vrm-animation

Binary file added docs/api/sample/VRM10Viewer/vrm10viewer.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions docs/release/112/v0.119.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ https://github.com/vrm-c/UniVRM/milestone/82?closed=1
- [\[UniGLTF-0.116.0\] MeshUtility のデフォルト設定で例外「NotImplementedException: WIP」が発生する · Issue #2235 · vrm-c/UniVRM · GitHub](https://github.com/vrm-c/UniVRM/issues/2235)

:::

## 関連

- [Mesh Bake の実装](/api/mesh/bake/)
59 changes: 59 additions & 0 deletions docs/vrm/showcase.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
---
date: 2024-02-09
---

# ShowCase の登録/更新について

以下の内容を [issues](https://github.com/vrm-c/vrm.dev/issues) に作ってください。
PullRequest でなくても大丈夫です。

## 登録/更新

| 項目 | |
| ----------- | ------------------------------------------------- |
| title | 必須 |
| url | 必須 |
| description | オプション |
| preview | オプション |
| tag | オプション[showcase](/showcase)から選んでください |

- 日本または英語片方だけの場合はコピーします
- description と preview が無い場合は、初回登録時にスクリプトで OGP を取得します

##

```md
# ShowCase 登録依頼

## title

ザ・シードオンライン

## url

https://virtualcast.jp/store/

```

## json format

```json
{
"tag": "CharacterPlatform",
"ja": {
"title": "ザ・シードオンライン",
"url": "https://virtualcast.jp/store/",
"description": "`1.0` アップロード可。3D viewer は `1.0` 未対応",
"preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png"
},
"en": {
"title": "The Seed Online",
"url": "https://virtualcast.jp/store/",
"description": "`1.0` can be uploaded. 3D viewer does not support `1.0`",
"preview": "https://virtualcast.jp/img/common/logo/virtual_cast_570_270_white.png"
},
"vrm": "1.0"
}
```

https://github.com/vrm-c/vrm.dev/blob/master/src/data/users.ts
147 changes: 0 additions & 147 deletions docs/vrm1/changed.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
---
weight: 1
date: 2021-08-05
---

Expand All @@ -19,149 +18,3 @@ date: 2021-08-05
- VRM0: mtoon => `VRMC_materials_mtoon`
- `新規` => `VRMC_node_constraint`

## glTF: z+ forward

モデルは Z+ 方向が前方になるように格納します。

| | VRM0 | VRM1 |
|---------|------|------|
| forward | z- | z+ |
| right | x+ | x- |

:::warning 実装

Y軸 180 度の回転になります。

```csharp
Vector3 vrm0;
var vrm1 = new Vector3(-vrm0.x, vrm0.y, -vrm0.z);
```
:::

## glTF: divided vertex buffer

bufferView の primitive 間での共有をやめます。

| | VRM0 | VRM1 |
|------------|-----------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| bufferView | shared | divided |
| 利点 | GameEngine メモリレイアウトに近いので変換が少ない | 一般的な glTF ローダーでロードできる |
| 欠点 | UniVRM 以外の glTF ローダーでメモリ使用量が爆発する可能性(ロードできるが頂点バッファに未使用領域ができてしまう) | export 時に頂点の増加・並び順の変化がありえる。import 時に連結する手間。morphTarget の扱いが煩雑 |

:::warning 実装

`Vrm` 専用の共有頂点ローダーをやめて、
一般的な `glTF` ローダーで問題ありません。

:::

## VRMC_vrm: meta

`TODO`

## VRMC_vrm: humanoid

必須ボーンの見直し。

| | VRM0 | VRM1 |
|---------------------|------|------|
| neck | 必須 | |
| head | 必須 | 必須 |
| hips | 必須 | 必須 |
| spine | 必須 | 必須 |
| chest | 必須 | |
| left/right UpperArm | 必須 | 必須 |
| left/right LowerArm | 必須 | 必須 |
| left/right Hand | 必須 | 必須 |
| left/right UpperLeg | 必須 | 必須 |
| left/right LowerLeg | 必須 | 必須 |
| left/right Foot | 必須 | 必須 |

以下の項目が廃止になります(`VRMHumanoidDescription` に記録されていた)。

* armStretch
* legStretch
* upperArmTwist
* lowerArmTwist
* upperLegTwist
* lowerLegTwist
* feetSpacing
* hasTranslationDoF

## VRMC_vrm: expression

BlendShapeは、Expression に名称を変更します。

:::warning BlendShape

BlendShapeは Unity の MorphTarget 機能のことで、区別が付きにくかったためです。

:::

preset の見直し

| | VRM0 | VRM1 |
|------|-----------------------------------------------------------------------|------------|
|| joy(joyとfunが曖昧) | happy |
|| angry | angry |
|| sorrow(文語) | sad |
|| fun(joyとfunが曖昧) | relaxed |
|| (新規追加) | surprised |
|| a(非日本語で自然なように変更) | aa |
|| i(非日本語で自然なように変更) | ih |
|| u(非日本語で自然なように変更) | ou |
|| e(非日本語で自然なように変更) | ee |
|| o(非日本語で自然なように変更) | oh |

- overrideMouse, overrideLipSync, overrideBlink 設定の追加
- VRM0 の materialBind から MaterialColorBind と TextureTransformBind に整理

## VRMC_vrm: lookat

* `degreemap.curve` が廃止になります

## VRMC_vrm: firstperson

* `firstPersonBone` は廃止になり、`Head` 固定になります
* `firstPersonBoneOffset` は、`lookAt.offsetFromHeadBone` になります

## VRMC_springBone

| | VRM0 | VRM1 |
|----------|-------------------------|---------------------|
| 設定単位 |||
|| children[0] | children のいずれか |
| 末端 | 7cm の遠さに 自動で追加 | 追加しない |

- 拡張を分離 => 独立した `VRMC_springBone` 拡張
- Collider 形状に Capsule を追加
- Unity座標系の混在を修正

## VRMC_materials_hdr_emissiveMultiplier

エミッションによる発光表現です。

glTF では emissiveFactor(float3) の値域が [0.0, 1.0] です。
これに係数を追加することで、1.0 を越える値を表せるようにします。

| | VRM0 | VRM1 |
|-------------------------|-------------------------------------|---------------------------------------------------------|
| mtoon の emissiveFactor | 独自に格納していた(0, 1 制限が無い) | gltf material の emissiveFactor に格納(0, 1 制限がある) |

gltf-2.0 の標準マテリアル(PBR), VRMC_materials_mtoon から利用します。

## VRMC_materials_mtoon

- 拡張を分離 => 独立した `VRMC_materials_mtoon` 拡張

`TODO`

## VRMC_node_constraint

`開発中`

### translation

### rotation

### aim
3 changes: 3 additions & 0 deletions docs/vrm1/constraint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# VRMC_node_constraint

https://github.com/vrm-c/vrm-specification/tree/master/specification/VRMC_node_constraint-1.0
Loading

0 comments on commit bffc0d6

Please sign in to comment.