Jupyter NotebookからPythonのAPIでBlenderを操作する


## はじめに
オープンソースの3DCGソフトBlenderにはPythonのAPIが用意されていて、オブジェクトを作成したりアニメーションのキーフレームを打ったりすることができます。

ガッツリ開発する場合、VSCodeで編集するのが主流のようですが、はじめましてのAPIとはJupyter Notebookがないと仲良くなれない体になってしまったので、どうにかJupyter NotebookからBlenderのAPIを触れないものかと調べてみることにしました。

![2022-05-28-11-25-04_6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2694201/45e1f6b5-2257-dd95-63a2-2aaa97f72abe.gif)

結果、Jupyter Notebook上でBlenderのAPIをいじくることができる、**blender_notebook**なるものを見つけたので実装までの流れを紹介します。
操作によって動作がもっさりすることがありますが、開発前や練習時など、ちょっと試してみる場合には便利です。

https://github.com/cheng-chi/blender_notebook

何度かAvastがざわざわしましたが無視しました。

## 1. BlenderのPythonバージョンの確認

今回一番重要な点は、**Jupyter Notebook**を実行する環境のPythonバージョンとインストールされているBlenderのPythonバージョンが一致している必要があることです。

### インストールされているBlenderのPythonバージョンの確認

Blenderをインストールしていない場合はインストールしてください。

1. Blenderを起動します。
2. Scriptingタブをクリックします。
![blenote01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2694201/5a62d92a-e9dd-7677-cb2d-85d2b1554683.jpeg)
3. 右下に表示されるこの部分を確認します。
![blenote02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2694201/c4e9aff7-721c-669f-5eda-49c186c2181b.jpeg)

Blender3.1.2のpythonバージョンは3.10.2でした。
※Blender2.82のpythonバージョンは3.7.4でした。

## 2. Anacondaで仮想環境を作成
Anacondaで仮想環境を作成しました。

Anacondaをインストールしていない場合はAnacondaをインストールしてください。
https://www.anaconda.com/products/distribution

Anacondaをインストール済みでも、古いバージョンの場合、新しいPythonに対応していない場合があるのでアップデートしてください。エラーが出てからでも大丈夫だと思います。

早速仮想環境を作成します。
```
conda create -n 好きな名前 python=上記で確認したBlenderのPythonバージョン
```
自分の環境の場合、BlenderのPythonバージョンは3.10.2だったので、Pythonバージョン3.10のblenderという名前の仮想環境を作成します。
```:コマンドプロンプト
conda create -n blender python=3.10
```
※BlenderのPythonバージョンが3.7.4だった場合、こうなります。
```:例）BlenderのPythonバージョンが3.7.4だった場合
conda create -n blender python=3.7
```
途中で下記のような表示が出たらyを入力してエンターを押してください。
```
Proceed ([y]/n)?
```
## 3. blender_notebookをインストール
### 作成した仮想環境をアクティベート

まず、作成した仮想環境をアクティベートします。
```
activate 仮想環境の名前
```
今回は、blenderという名前の仮想環境を作成したので、

```:コマンドプロンプト
activate blender
```

と入力します。
下記のように文頭に作成した仮想環境の名前（今回の場合blender）が表示されれば成功です。

```:例）自分の環境の場合
(blender) C:\Users\Owner>
```
### blender_notebookを仮想環境にインストール
```:コマンドプロンプト
pip install blender_notebook
```
```:例）自分の環境の場合
(blender) C:\Users\Owner>pip install blender_notebook
```
Successfully installed なんちゃらとお馴染みの表示が出たらインストール完了です。

### BlenderのKernelを作成
Jupyter Notebook用のカーネルを作成します。
```
blender_notebook install --blender-exec="Blenderインストール先の起動ファイルのパス"
```
自分の環境の場合、WindowsでBlenderのバージョンが3.1（※BlenderのPythonのバージョンではなくBlenderのバージョン）なので、
```:コマンドプロンプト
blender_notebook install --blender-exec="C:\Program Files\Blender Foundation\Blender 3.1\blender.exe"
```
```:例）自分の環境の場合
(blender) C:\Users\Owner>blender_notebook install --blender-exec="C:\Program Files\Blender Foundation\Blender 3.1\blender.exe"
```
となります。

Blenderのバージョンが異なる場合や、インストール先を変更している場合は変更が必要です。
※Blenderのバージョンが2.82だった場合、こうなります。

```:例）Blenderのバージョンが2.82の場合
blender_notebook install --blender-exec="C:\Program Files\Blender Foundation\Blender 2.82\blender.exe"
```
```
Current python interpreter version is not 3.7!
blender_notebook will link pip packages installed in this interpreter to the
blender embedded python interpreter. Mismatch in python version might cause
problem launching the jupyter kernel. Are you sure to continue?
 [y/N]:
```
何か聞かれますがPythonのバージョンは確認済みなので、yを入力してエンターで大丈夫です。
下記のような表示が出たら成功です。
```
done
♯
♯ To activate this environment, use
♯
♯     $ conda activate blender
♯
♯ To deactivate an active environment, use
♯
♯     $ conda deactivate
```
Macでは試していませんが、
```
/Applications/Blender.app/Contents/MacOS/Blender
```
らしいので、

```:未確認のため参考までに
blender_notebook install --blender-exec="/Applications/Blender.app/Contents/MacOS/Blender"
```
だと思います。
間違っていたらごめんなさい。
### Kernelが作成されたか確認
念のためKernelが追加されているか確認します。
```:コマンドプロンプト
jupyter kernelspec list
```
```:例）自分の環境の場合
(blender) C:\Users\Owner>jupyter kernelspec list
```
と入力すると、blenderが追加されているのがわかります。
```
Available kernels:
  blender    C:\Users\Owner\AppData\Roaming\jupyter\kernels\blender
  python3    C:\Users\Owner\anaconda3\envs\blender\share\jupyter\kernels\python3
```
## 4. 起動!!
jupyter notebookと入力してJupyter Notebookを起動します。

```:コマンドプロンプト
jupyter notebook
```
```:例）自分の環境の場合
(blender) C:\Users\Owner>jupyter notebook
```

右上のNEWからblenderを選択すると新規ノートブックが作成されてBlenderが起動します。
![blenote03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2694201/d25d02f0-8534-682e-ce91-5c3242bde99f.jpeg)


折角なので何か実行してみます。
~~Suzanneはあまり好きではないので、~~ 試しに球体を生成してみます。

Jupyter Notebookのセルに

```Python:球体の生成
import bpy
bpy.ops.mesh.primitive_ico_sphere_add(location=(0, 0, 0), radius=5, subdivisions=10)
```
と入力してJupyter Notebookの▶Runをクリックします。

**追記：** 球体の生成は若干時間がかかるので、立方体を生成したほうが感動出来るかもしれません。
```Python:立方体の生成
import bpy
bpy.ops.mesh.primitive_cube_add(size=10, location=(0, 0, 0))
```

![blenote04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2694201/7e464232-f708-9b3a-3cb4-b50478b2250f.jpeg)


**でけた!!**

### 余談
BlenderのUndo（元に戻す）とRedo（やり直す）を実行するコードを、ノートブックのセルに置いておくと存分に遊べます。
**追記：** このコードで元に戻すとJupyter Notebookで操作し始めたところまで戻ってしまうので、別の方法を探す必要がありそうです。

```Python:Undo（元に戻す）
bpy.ops.ed.undo()
```
```Python:Redo（やり直す）
bpy.ops.ed.redo()
```
これでBlenderのAPIと仲良くなれそうですね。
ただ、冒頭での述べましたが操作により動作がもっさりすることがあるので、やはりVSCodeを使用したほうがいいのかもしれません。

おしまい。


## うまくいかない場合
Jupyter Notebookの右上にkernel errorと表示されたり、Blenderが起動してもJupyter Notebookのロードが永遠に続いて、コマンドプロンプトに

```
ImportError: cannot import name '_device' from 'zmq.backend.cython'
```
のような表示が出た場合は失敗です。
**仮想環境のPythonバージョンとBlenderのPythonバージョンが一致していない可能性が高い**です。

失敗してうまくいかなかった場合は
```:コマンドプロンプト
blender_notebook remove
```
と入力して
```
Are you sure to delete C:\Users\Owner\AppData\Roaming\jupyter\kernels\blender ? [y/N]:
```
yを入力してからエンターでカーネルを削除してやり直しましょう。

それでもダメな場合は仮想環境も削除して最初からやり直してみましょう。
仮想環境を削除するには、
```:コマンドプロンプト
conda deactivate
```
と入力して文頭のblenderの表示が消えたことを確認。
```:コマンドプロンプト
conda remove -n blender --all
```
と入力して削除します。


## 参考
https://github.com/cheng-chi/blender_notebook