macOSでPython3.9環境にOpen3Dをインストールする

話題の[PLATEAU](https://www.mlit.go.jp/plateau/)をPythonで操作してみたくなり、[plateaupy](https://github.com/AcculusSasao/plateaupy)をインストールしてみました。このインストール自体は何の問題もなくできたのですが、表示のために[Open3D](https://github.com/intel-isl/Open3D)のインストールが推奨されていたのでお気楽に
```pip3 install open3d
```を実行したところ、
```ERROR: No matching distribution found for open3d
```と怒られてしまいました。
「あれ？」と思ってOpen3DのREADME.mdを読むと、以下の記述が。
> Pre-built pip and conda packages support Ubuntu 18.04+, macOS 10.14+ and Windows 10 (64-bit) with Python 3.6, 3.7 and 3.8.

あ、ウチのPython、Homebrewで入れたPython3.9だ。
というわけで、macOSのPython3.9にOpen3Dをソースからインストールしてみます。
ちなみに環境は以下の通りです。
 　- macOS 11.4 (Big Sur)
 　- Python 3.9.5 (Homebrew)
 　- C++ Apple clang version 12.0.5 (clang-1205.0.22.9)
 　- Cmake 3.20.2 (Homebrew)
尚、諸々の事情からcondaもvirtualenvも使用しません。

## ソースの取得
githubから取得します。
```
git clone https://github.com/intel-isl/Open3D.git
cd Open3D
git submodule update --init --recursive
```

## Cmake
取得したREADME.mdからもリンクが辿れますが、[Build from source](http://www.open3d.org/docs/release/compilation.html)にインストールの仕方が説明されています。まずはこれに従い、Open3Dディレクトリで以下のコマンドを実行します。
```
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=<install_directory> ..
```
ここで、`<install_directory>`はOpen3Dをインストールするディレクトリです。私の場合は`/opt/Open3D`と指定しました。
すると、以下のエラーが出力されます。
```
CMake Error at cpp/pybind/CMakeLists.txt:21 (message):
Python 2 is no longer supported.  Please check your your Python version with `python --version`.  To use Python 3, do one of the following: (1) activate a Python 3 virtual environment; (2) specify the Python path explicitly with -DPYTHON_EXECUTABLE=/path/to/python3; (3) add Python 3 to the PATH environment variable.
```
これは、macOS標準のパスにインストールされているPython(`/usr/bin/python`)がPython2.7だからです。エラーメッセージにもある通り、Python3のパスを指定してcmakeを実行します。
```
cmake -DCMAKE_INSTALL_PREFIX=/opt/Open3D -DPYTHON_EXECUTABLE=/usr/local/bin/python3 ..
```
これでcmakeが通れば、Buildに取り掛かれます。

## Build
Buildも、[Build from source](http://www.open3d.org/docs/release/compilation.html)にある通りに`make -j <並列数>`を実行すれば行えます。かなり時間がかかるので、可能であれば並列ビルドを行なった方がいいです。私の場合は２並列で行いました。
```
make -j 2
```

## Install
makeが成功したら、インストールです。
まずは、Open3D C++ libraryのインストールを行います。私の場合は`/opt/Open3D`配下にインストールするので、sudoで実行しました。
```
sudo make install
```

続いてOpen3D Python libraryをインストールします。[Build from source](http://www.open3d.org/docs/release/compilation.html)には、現在のPython環境にpipパッケージとしてインストールする場合以外に、condaやwheelパッケージを作る場合のコマンドも説明されています。
ただし、先に行なったOpen3D C++ libraryのインストールを"sudo"で実行した場合には、Open3D Python libraryのインストールも"sudo"で実行する必要があります。私の場合は、以下のように実行しました。
```
sudo make install-pip-package
```
これで成功すれば、以下のようにopen3dモジュールがインポートできるようになります。
```
python -c "import open3d; print(open3d)"
<module 'open3d' from '/usr/local/lib/python3.9/site-packages/open3d/__init__.py'>
```

## exampleの実行
Open3D/examples配下に、サンプルコードとサンプルデータが置かれています。
ここでは、コマンドラインのPython3から、Tutorialの最初にある[point cloud](http://www.open3d.org/docs/release/tutorial/geometry/pointcloud.html)の表示を行ってみます。
```
cd Open3D/examples/test_data
python3
Python 3.9.5 (default, May  4 2021, 03:36:27)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
＞＞＞ import open3d as o3d
＞＞＞ pcd = o3d.io.read_point_cloud("./fragment.ply")
＞＞＞ o3d.visualization.draw_geometries([pcd], zoom=0.3412, front=[0.4257, -0.2125, -0.8795], lookat=[2.6172, 2.0475, 1.532], up=[-0.0694, -0.9768, 0.2024])
```
以下のようなウインドウが表示されると思います。
![fragment_ply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183092/c7a70843-41ac-8d8e-acb5-0a7e55593957.png)
ターミナルのPython3を終了すると、ウインドウも消えます。

これでようやく、[plateaupy](https://github.com/AcculusSasao/plateaupy)を自分のMacで試せます。

## 参照
[株式会社 Acculus その他技術紹介 3D人流シミュレーション](https://acculus.jp/tech/)