Blenderで実写合成をやってみる

畑違いの私がBlenderのモーショントラッキングを使って実写合成にチャレンジしてみたので、忘れないうちに作業全体の流れを残しておこうと思います。細かく記載するととても長くなるのでかいつまんで書いてます
やり方の詳細はYouTubeで「Blender モーショントラッキング」などと検索すればたくさんヒットするので、面白そうだなと思った方はそちらをご参照ください

## 作成したもの

以下のように短い動画にスザンヌを合成してみました（短い動画ですが初心者には結構大変な作業でした）

<iframe id="ytplayer" type="text/html" width="720" height="405"
src="https://www.youtube.com/embed/?controls=1&loop=1&playlist=BgTeu04MxT4"
frameborder="0" allowfullscreen />

## 作業の流れ

1. [準備](#準備)
1. [動画のインポート](#動画のインポート)
1. [モーショントラッキング](#モーショントラッキング)
1. [カメラとシーンの設定](#カメラとシーンの設定)
1. [メッシュの追加](#メッシュの追加)
1. [ライティング](#ライティング)
1. [レンダリングと出力](#レンダリングと出力)

### 準備

- Blenderのインストール
公式サイトからダウンロードしてインストールします
- 動画の撮影
スマートフォンで動画を撮影しました。カメラの動きが激しいとトラッキングの難易度が上がってしまうので軽く左右に振れる程度にし、場面の切り替わりがあると作業が大変になってしまうので、なるべく同じ画角で撮影するようにしました

### 動画のインポート

- Blenderを開く
Blenderを開き、新規プロジェクトを作成します。
- 動画の読み込み
`+` > `VFX` > `Motion Tracking`ワークスペースに切り替えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/41063213-a528-7191-2e23-c39212fe5d31.png)
撮影した動画をインポートします。
![スクリーンショット 2023-11-12 151129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/3c950e09-74bc-0f71-fed9-407906d9d346.png)
※ファイル選択画面は省略
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/231aec02-5d9f-c20f-0c64-7afc272f11f8.png)

### モーショントラッキング

- 「Set Scene Frames」と「Prefetch」を実行
動画に合わせて開始と終了のフレームを設定してくれます。また、動画を事前に読み込むことで今後の作業をスムーズに行えるようにしておきます
![setframe_and_prefetch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/ec313bef-b46b-d22c-6ed4-98a7aa0053c1.png)
- `Output Properties`の設定
動画の解像度、フレームレートの値と同じものを`Output Properties`の`Resolution`、`Frame Rate`に設定します
![スクリーンショット 2023-11-12 152747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/eded21ee-6ce2-de68-3be7-ec07fa00ce55.png)


- トラッキングポイントの設定
トラッキングしたいポイントにCtrl + Clickでトラッカーを追加していきます。`Detect Features`で自動検出してくれますが今回は全部手動で設定しました
トラッキングポイントはなるべく色のコントラストがはっきりしたポイントを設定すると良いです
:::note info
最低でも8つのトラッキングポイントを設定する必要があります  
:::

- トラッキングの実行
  `Track Markers`(赤枠内の矢印)ボタンでトラッキング開始し、動画全体でポイントが追跡されることを確認します
![スクリーンショット 2023-11-12 153746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/8ed8b8f2-9c72-ab07-dbcd-841dfc5cb3ee.png)
今回は9点トラッキングしました
:::note info
トラッカーを追加したフレームより後のフレームをトラッキングする場合は右向き矢印のボタンを、前をトラッキングする場合は左向き矢印のボタンを使います
:::

### カメラとシーンの設定

- カメラモーションの解析
  1. 左のメニューから`Solve`タブに移動
  1. `Keyframe A`、`Keyframe B`を動画の開始と終了に合わせる
  1. `Focal Length`にチェックを入れる
  1. `Solve Camera Motion`を実行
  1. 右上に`Solve error`の値が表示される
![スクリーンショット 2023-11-12 155428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/b056ac01-8292-9f34-64a5-c015de34efdc.png)
:::note
Solve errorの値は低ければより良い解析ができています。理想は0.3以下で、悪くとも1px以下になるまでトラックポイントの追加/削除と解析を繰り返します
:::
- 背景の設定
  1. `Set as Background`、`Setup Tracking Scene`ボタンでで撮影した動画を背景として設定する
![スクリーンショット 2023-11-12 214311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/6704322a-c315-50bc-bf7b-480a29c3e5f7.png)
  1. Blenderの空間上のXY平面を机の平面に合わせる
動画内のトラッキングポイントで地面に設定したい面上の3点を選択(Shift + Click)して`Floor`をクリックします
![スクリーンショット 2023-11-12 162621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/a119cf78-c2fd-0e11-d53d-2e2947548573.png)
それっぽくなってきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/be8ae8ab-272b-4629-9c2d-a4f6e6715363.png)

### メッシュの追加

- メッシュを追加
Shift + AからBlenderにデフォルトで入っているスザンヌを配置します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/d335c440-d9d9-e427-c5d9-8cab4b54db3e.png)
- メッシュの調整
位置、スケール、回転を調整して、動画内の環境に合わせます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/bccf07df-74f6-5f8d-4f0b-2e7daf345a4e.png)
- マテリアルの設定
何も設定なしだと寂しいので色とmetallicを適当に設定します（設定内容は省略）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/1f9c0f5e-631c-4e2e-4458-a49d396a1a69.png)
- アニメーションの設定
せっかくなので少しモデルを動かしたいと思います
今回は動画開始から約2秒で浮いていたスザンヌが机に落ちるという単純なアニメーションにしました(詳細は省略)

### ライティング
poly havenのHDRI素材を使ってライティングをします。今回は室内で夜に撮影した動画なので室内で外の光があまり入っていないものを選びました
使用した素材 => [small_empty_room_2](https://polyhaven.com/a/small_empty_room_2)
※手順の詳細は割愛

一旦、画像レンダリング（F12）してみるとこんな感じになります。影が自然ですね
![untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/55bb1092-b2a8-f5ad-8277-5cdcb337ad70.png)

### レンダリングと出力

最後に動画に書き出します

- レンダリングの設定
  - レンダーエンジンを`Eevee`=>`Cycles`に変更
  - サンプル数を32に変更
  - FilmのTransparentにチェック
![スクリーンショット 2023-11-12 214901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/1bb382dc-352f-045f-2c64-e48f87a9f80f.png)
:::note
この設定で地面に設定した平面が出力時に透明になってくれます
また、平面に投影された影は出力にも反映されます
:::

- 出力設定を変更する
![スクリーンショット 2023-11-12 153336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360735/5e2c2d11-e0a2-b354-3721-97de3247155b.png)

- レンダリングの実行
Ctrl + F12で完成したシーンをレンダリングし、動画として出力します（めっちゃ時間かかりました）

以上です！
思ったよりBlenderが自動でやってくれたところや、逆に思ったより手動でやらないといけないところなど自分でやってみて初めてわかりました。また何かアイデアがわいたら作ってみたいですね