バーチャルリアリティ学 第4章 学習メモ

本記事は、私が [VR 技術者認定試験](https://vrsj.org/events/seminar/) に向けて [バーチャルリアリティ学](https://www.amazon.co.jp/dp/4904490053) を学習するために作成したメモです。
解説を目的とはしておりませんので、書籍を読んでいないとよくわからない点も多々あるかと思います。なにとぞご了承ください。

##### バーチャルリアリティ学 学習メモシリーズ
- [バーチャルリアリティ学 第1章 学習メモ](https://qiita.com/segur/items/ae75540f48d88d82d912)
- [バーチャルリアリティ学 第2章 学習メモ](https://qiita.com/segur/items/310e9e5323491a3c4178)
- [バーチャルリアリティ学 第3章 学習メモ](https://qiita.com/segur/items/4d37c27c7e40873144ba)
- バーチャルリアリティ学 第4章 学習メモ ← 本記事


# 4.1 総論

## 4.1.1 バーチャルリアリティのためのモデリング

VR は、実世界と実質的に同等な体験をさせることをめざす。
この体験世界のことを、 `バーチャル世界` と呼ぶ。

バーチャル世界はリアリタイム性が重要なので、体験の目的に応じてモデリングする範囲を絞ることが重要。

- 例: 都市景観が目的なら、通行人との会話のモデリングは不要。
- 例: 礼儀作法が目的なら、遠方の山やビルのモデリングは不要。

汎用的なバーチャル世界の構築は、1 つの夢ではあるが、すべてをモデリングしつくことは困難。

## 4.1.2 レンダリング、シミュレーションとモデル

`レンダリング` とは、バーチャル世界の情報をディスプレイに適した形式へ変換すること。

`シミュレーション` とは、物理法則・化学法則等に当てはめてモデルを変化させること。

## 4.1.3 処理量とデータ量のトレードオフ

レンダリングの計算量とモデルのデータ量には、トレードオフの関係がある。

|                       | レンダリングの計算量 | モデルのデータ量 | 計算量・データ量が不十分な場合 |
| --------------------- | -------------------- | ---------------- | ------------------------------ |
| image-based rendering | 少                   | 多               | 自由に `視点` を移動できない       |
| 3D computer graphics  | 多                   | 少               | 映像の `リアリティー` が減る       |

# 4.2 レンダリング

## 4.2.1 レンダリングのためのモデル

- 視覚レンダリングに必要なモデルは、 `光源や物体の位置・向き` 、 `物体の色` 等。
- 聴覚レンダリングに必要なモデルは、 `バーチャル世界での反射や回析` 、 `体験者の耳での反射や回析` 。
- 力覚レンダリングに必要なモデルは、 `物体の形状、表面の硬さや摩擦係数、質量` 等の `動力学特性` 。

## 4.2.2 視覚レンダリングとモデル

### 投影処理

`投影` とは、3 次元図形を 2 次元スクリーン上の図形へ変換すること。
`透視投影` が代表的な手法。
`透視投影` は、遠いものほど小さく表示する。

### 隠面除去

`隠面除去` は、 `Zバッファ法` が主流。
ハードウェア化が容易で、処理が高速。
画素ごとに `Z値` を計算し、記憶する。

以下の図において、上が3次元画像で、下がZバッファ。奥のものほど白く描かれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6a63ab56-1798-1500-7cec-759a9080e6e7.png)

※引用: [Wikipedia / Zバッファ](https://ja.wikipedia.org/wiki/Z%E3%83%90%E3%83%83%E3%83%95%E3%82%A1)

### 輝度計算

#### シェーディング計算

`シェーディング計算` は、物体の材質や面の向きによって輝度を計算する。

3 つの成分がある。

- `拡散反射光` : 視点・光源の位置によらず輝度が変化しない反射光
- `鏡面反射光` : 視点・光源の位置によって輝度が変化する反射光
  - 例: 金属
- `環境光` : 周囲の物体に反射してあたる光。
  - 厳密な計算は高コストなので定数で近似する。

#### シャドウイング計算

`シャドウイング計算` は、ある物体が他の物体へ落とす影を計算する。

## 4.2.3 聴覚レンダリングとモデル

### 初期反射音

`初期反射音` とは、物体に 1 回反射した音のこと。
反射波の密度が低く、方向が知覚されやすい。

### 幾何音響理論

`幾何音響理論` は、音の反射を、光線の鏡面反射のように扱う。
音の波動性を考慮していないので、低周波数の精度は低い。

以下の2つの手法がある。

- 音線法
- 虚像法

#### 音線法

`音線法` は、音源から発射された音の線を追跡する方法。
反射音の次数によらず、計算量が一定。
受音点近傍を通過する音線を計算するので、任意の時刻・場所における反射音を求めることができない。

#### 虚像法

`虚像法` は、鏡の向こうの位置に虚像を仮定する方法。
反射の次数に対して、指数関数的に計算量が増加してしまう。

### 後部残響音

`後部残響音` とは、物体に複数回反射した音の集合体のこと。
いわゆる `響き` や `余韻` と認識される部分。

反射波の密度が高く、方向が知覚されにくい。

初期感謝音と後部残響音は、違和感のないように接続する必要がある。

### 回析

`回析` は、波が障害物の背後に回り込む現象のこと。
低周波数で起きやすい。つまり `低域通過型` 。

### ドプラ効果

`ドプラ効果` は、波の発生源が移動する、あるいは観測者が移動することで観測される周波数が変化する現象のこと。
音源や聴取点が移動するなら、ドプラ効果もレンダリングすることが望ましい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/df4d93d5-f51d-4cff-d1f0-99d7f77e01dd.png)

※引用: [Wikipedia / ドップラー効果](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%83%E3%83%97%E3%83%A9%E3%83%BC%E5%8A%B9%E6%9E%9C)

## 4.2.4 力触覚レンダリングとモデル

典型的な力覚レンダリングは、以下の計算が周期的に実行される。

- `力覚ポインタ` の位置・方向の検出
- `力覚ポインタ` と `バーチャル物体` の接触検出
- `反力計算` と `物体変形`
- `力` と `トルク` の提示

この `力計算周期` には1kHz以上が必要とされる。

### 力覚ポインタ

`力覚ポインタ` とは、指先や手先等の接触点のこと。

### God-object, proxy point

`God-object` とは、物体接触時における `理想的なポインタ` のこと。
物体表面上を移動する。

### 表面情報のレンダリング

`表面情報のレンダリング` は、 凹凸等の `物体形状` 、表面の `摩擦特性` `粘性特性` の組み合わせで表現される。

静止摩擦と動摩擦をシミュレートすることで、 `スティックスリップ現象` を再現することも可能。

#### スティックスリップ現象

`スティックスリップ現象` とは、摩擦によって `固着` と `滑り` が交互に発生する現象。

- 例: チョークで黒板に線を書く時に、振動する。

# 4.3 シミュレーション

## 4.3.1 シミュレーションのためのモデル

`シミュレーション` とは、モデルを法則にしたがって変化させること。

## 4.3.2 空間のシミュレーション

### オイラー角

`オイラー角` は、姿勢を `ロール` 、 `ピッチ` 、 `ヨー` で表現する手法。
ただし、実装には `クォータニオン` の使用が多い。

### scene graph

`scene graph` は、VR 空間をオブジェクトの階層構造で表現します。

Unity で例えるなら、 `GameObject` の `Hierarchy` がまさに `scene graph` だと思います。

地面や建物のような物だけでなく、カメラ・照明・音等、あらゆるものを `オブジェクト` として扱います。

## 4.3.3 物体のシミュレーション

### 剛体のシミュレーション

`拘束力` の直接計算は、難易度が高いため、計算を簡略化した以下の2つの方法がある。

- ペナルティ法
- 解析法（の近似解法）

#### ペナルティ法

`ペナルティ法` は、拘束条件を違反した量に比例した力を、物体に加える方法。
計算量は少ない。
しかし、ペナルティ量やペナルティ力が収束する保証はない。

#### 解析法

`解析法` は、運動方程式と拘束条件式の連立方程式を解く方法。
拘束に関係している剛体が増えると、連立させる式も増え、計算量も増えてしまうため、近似解法を用いるのが一般的。

### 変形のシミュレーション

`変形` とは、 `変位` が生じる状態のこと。
`変位` が微小であれば、一般に物体は `弾性変形` を示す。

#### 弾性

`弾性` とは、外力がなくなると元に戻る性質のこと。

#### バネ質点モデル

`バネ質点モデル` は、質点と質点を結ぶバネで物体を表現する。
簡潔な実装。

#### 有限要素モデル

`有限要素モデル` は、物体を三角形要素などの集合として表現する。
弾性論に基づいた物体変形を表現する。
高精度の変形を可能とする。
実装が複雑であり、計算量が多い。

#### 弾性パラメーターの計測法

変形シミュレーションには、弾性パラメーターを事前に設定する必要がある。
弾性パラメーターの計測法として、以下がある。

- 引張試験
- 超音波エラストグラフィ
- MRE (Magnetic Resonance Elastography）

#### 実時間性

- 変形シミュレーションの `忠実性` と `実時間性` にはトレードオフの関係がある。
- 外科手術への応用には忠実性が求められる。
- エンターテイメントへの応用には実時間性が求められる。

### 流体のシミュレーション

非圧縮性ナビエ・ストークス方程式は、 `速度ベクトル` および `圧力` を未知変数とする。

#### 流体非圧縮の式

```math
\nabla \cdot u = 0
```

## 4.3.4 人物のシミュレーション

### 人体物理モデル

`人体物理モデル` は、複数の `関節` と `剛体` からなる `剛体リンク系`（articulated rigid bodies）。
人のおおまかな動きを表現できる。

- `球面関節` は、3自由度。股関節等。
- `回転関節` は、1自由度。膝・肘等。

### 逆運動学

`逆運動学` とは、リンクの位置から関節の角度を計算する方法。
物をつかむ動作などに用いられる。

- 解析的手法
- 数値的手法

の 2 種類ある。

ただ、解が無数に存在する場合がある。

- 例: 手と肩の位置を固定したまま、肘を円弧上に動かすことができる。

#### 解析的手法

`解析的手法` は、リンクの位置を関節角の関数とし、その `逆関数` を求める。
脚・腕では比較的容易に導出できる。

#### 数値的手法

`数値的手法` は、 `位置誤差の2乗` を評価関数とする最適化問題を解く方法。
汎用性が高く、全身の逆運動学問題を解くことも可能。

### 力学シミュレーション

`力学シミュレーション` は、物理的に自然な運動を生成できる。

力学シミュレーションの制御系として典型的なものに、以下の2つがある。

- 関節制御
- バランス制御

#### 関節制御

`関節制御` は、 `関節角・速度の誤差` を利用して `関節トルク` を計算する手法。
各関節は、目標値に追従するが、全身のバランスは考慮していない。
目標値には、モーションキャプチャーデータの使用が可能。

#### バランス制御

`バランス制御` は、姿勢を制御する手法。
具体的には、重心位置のフィードバックを利用する方法がある。
外力に対する反応などの運動が生成できるため、ダイナミックな環境での運動生成に適している。
ただ、人間らしい運動を生成するのは難しい。
また、キャラクターが転倒しないことを保証できない。転倒しないための制御が必須。

#### 有限状態機械 （ `finite state machine` ）

`有限状態機械` は、各状態のための制御器をあらかじめ用意し、状態遷移の条件を定義する方法。

（有限状態機械は、Unityにおける `Animator Controller` に相当する。）

複雑な制御系設計を多少容易にできる。

たとえば、走行運動のための有限状態機械は以下のようになる。

```mermaid
flowchart LR
    B((右足支持))
    C((左足支持))
    D((空　　中))

    B -->|右足離地| D -->|左足接地| C
    C -->|左足離地| D -->|右足接地| B
```



### モーショングラフ

`モーショングラフ` は、モーションキャプチャーを用いた複数のクリック間を用意し、似た姿勢のフレームを滑らかにつなげる手法。

- 例: 走行クリップで右手を出したフレームと、ジャンプクリップの右手を出したフレームをつなげ、走行→ジャンプという新しいアニメーションを生成する。

# さいごに

本記事作成にあたり以下を参考にさせていただきました。ありがとうございました！

- [VR 技術者認定講習会・試験](https://vrsj.org/events/seminar/)