Rhinoceros + Grasshopper + Pythonではじめる3Dモデリング

# はじめにfa9923af-bf1d-426d-9cc1-a40d43c831e1
最近、3DモデリングツールであるRhinocerosを使って遊んでいます。自分は**デザイン全くわからないマン**なのですが、サンプルを引っ張ってくるとそれなりに綺麗なものができるので、楽しいです。

![Screenshot 2021-01-24 17.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/53ffae74-22cb-ad49-71df-cf70d56e6c7e.png)
※Rhinoceros公式より拝借

今回の記事は、3DモデリングツールであるRhinocerosと、そのプラグインGrasshopper、そしてPythonを使って、3Dモデリングのチュートリアル的な内容を書きました。

お断りなのですが、**自分自身は全くのデザイン初心者かつ、今回紹介するツールの熟達者ではありません**。ですが、ツールを全く触ったことのない方でも比較的簡単な入門の記事として書いたので、読んでいただけると幸いです。

この記事を読んで3Dモデリングの世界に一歩踏み込んでいただけたらなと思います。
## 想定読者
- pythonを触ったことがある人

- 3DCad初心者
## Rhinocerosとは
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/7b55b538-576f-8d9e-e26b-1d1150e5aa35.png" width=25%>

Robert McNeel & Associatesが開発している、デザイン性の高い3次元モデルデータを作成できる**3Dモデリングソフトウェア**。機械設計、金型設計、試作、製造、建築、宝飾、マルチメディア、FEM・CFD等解析などマルチに使われているそうです。

[公式ページ](https://www.rhino3d.com/jp/gallery/)にギャラリーがあります。とにかくいろいろできる。

![Screenshot 2021-01-24 16.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/32358de8-8344-ca75-0135-8a142ec5aa69.png)

> ※[建築レンダリングモデルサンプル](https://www.applicraft.com/archi_rendering_sample/) より

ガッチガチに建築レンダリングもできます。すごい。
## Grasshopperとは
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/985c0d1c-c413-0681-9848-4bb4b78048e0.png" width=25%>

**Rhinoceros上で動作するプラグインのモデリング支援ツール。**電池みたいなコンポーネントをガッションガッション組み合わせることで、幾何学模様などを表現できます。

質量・速度・摩擦・風などの力学的な法則もシュミレートでき、屋内の日当たり分析や室温・風環境を解析したりもできるそう。友人はこれで卒業制作で作った建造物の日光シュミレートをしていて、隣から見てすげー、となっていました。

## Rhinoceros / GrasshopperでPython?
二つのツールを使うことで、モデリングが可能です。が、本業はエンジニアなので、ぽちぽちコンポーネントを組み合わせるのではなく、コーディングである程度デザインができると嬉しい。

なんと、**RhinocerosやGrasshopperではプログラミング言語によるコーディングがサポートされています。**既存コンポーネントではデザインが難しい場合、プログラムを自分で書くことでコンポーネントを自作でき、より自由度の高いデザインが可能になります。

全て把握できませんでしたが、調べた限りでは`C#`や`Visual Basic`、`Python`が正式サポートされているみたいです。

この記事では、使用人口が多い`Python`を扱おうと思います。

### 補足:pythonの実行環境について
ここで、Rhinoceros / GrasshopperでPythonを使う方法は大きく分けて二通りあります。

1. Rhinocerosの`EditPythonScript`にPythonコードを書き、**Rhinocerosでスクリプトを直接走らせる**
2. GrassHopperのプラグイン`Gh_CPython`を通して、**Grasshopper上でPythonを実行させる**

**1**はPython2系のため、普段、python3.xxを使っている方はとっつきにくいかもしれません。
(Rhinoの実行環境は .NET Frameworkで、相性がいいironPythonが走る。ironPythonはまだPython3.xxをサポートしていない)

Rhinoceros 6からGrasshopperが標準搭載されたこともあり、**現在は2.のGH_CPythonがスタンダードかも?**今回の記事も、**2**.の方法でPythonを実行していきます。

参考：[RhinocerosとGrasshopperでPythonを使う方法](https://qiita.com/o-kei/items/cfa3980d88e982eed3f5)
# チュートリアル
用語の説明が終わったところで、今回の記事では
**Rhinoceros + Grasshopper + Pythonではじめる3Dモデリングことはじめ**として、

- Rhinocerosのインストール

- Grasshopper上でPythonの実行

- Rhinocerosに簡単な図形を描画するスクリプトを書く

ことを行います。
## つくるもの
![Screenshot 2021-01-24 17.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/d71a62c2-5de0-32e6-ce28-fc52c39d74ca.png)

## 環境
<img src="https://img.shields.io/badge/Rhinoceros-7.2(評価版)-801010.svg?logo=Rhinoceros&style=flat"> <img src="https://img.shields.io/badge/MacOS Catalina-10.15.7-999999.svg?logo=apple&style=plastic">

## Rhinoceros
### インストール
Rhinocerosは製品版、教育版、評価版の3つの入手法があります。仕事等で長く使う場合は製品版を購入することをお勧めしますが、価格は**144,000円**と、もちろんプロ仕様です（当たり前ですが、お高い..）。教育版もやや高めですが、社会人価格だと本当に手が出しづらい価格帯になってくるので、ゴリゴリ触りたい学生は多少無理しても買った方がいいと思います！~~学生が羨ましい！~~

今回は軽く使いたいので、**Rhinoceros 7の評価版をダウンロードします**。評価版はダウンロードから90日間であれば、製品版の全ての機能を無料で試すことができます。

> **※注意：M1 macは今(2021/01/24)のところ動作しないみたいです。** サポートを待つしかない。

---

評価版のダウンロード方法ですが、

1. まずRhinocerosを販売している[AppliCraftのページ](https://www.applicraft.com/download_rhinoceros7/)に行き、メールアドレスなどを入力して登録します。

2. ライセンスコード・ダウンロードリンクが記載されたメールが届きます。ダウンロードリンクから公式ダウンロードページにアクセスし、Rhino 7評価版をダウンロードします。

3. インストールし、ライセンスコードを入力すると、使えるようになります。


Rhinocerosを開いて、図のようになっていると使える状態になっています。
今回はGrasshopperで書いたPythonスクリプトを動かすチュートリアルのため、Rhinocerosの詳しい使い方は他に譲ります。

![Screenshot 2021-01-24 17.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/1b5c5c71-4783-bbe6-6e07-7eaf5fabcafc.png)


公式ページにwindows/macのチュートリアルがあるので、まずはここで雰囲気を掴むのがGoodかも。

https://www.rhino3d.com/tutorials/

## Grasshopper
続いて、Grasshopperです。Rhinoceros7ではGrasshopperプラグインは標準搭載されています。

上部のツールバーから、[ツール]→[Grasshopper]と選択すると、Grasshopperプラグインが起動し、作業スペースが作られます。これでGrasshopperの起動は完了です。
![Screenshot 2021-01-24 17.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/ef1cebd7-992f-4a86-b53d-ebc0a63d2421.png)

Grasshopper単体のチュートリアルはこれまた公式ページにwindows/macのチュートリアルがあるので、ここで雰囲気を掴むのがGood。

## Grasshopper + Python
ここからが本記事の主題です。

Grasshopper上でPythonスクリプトを実行するには、Pythonコンポーネントを用います。

Python コンポーネントは、[math]タブ→[script]からドラッグ&ドロップするか、何もないところでダブルクリックして検索窓を表示し、"Python"と入力すると呼び出すことができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/2bee7bee-72c3-6a89-fd90-403e095f8ef5.png" width=50%>

基本的には、左側が入力（引数みたいな感じ）、右側が出力になっています。
左側の入力、右側の出力は好きな数増やすことができます。初期状態では、右側にある[a]は出力、[out]にはエラーメッセージが出力されます。
### Hello,world
では、hello,worldと出力するスクリプトを書いてみます。スクリプトを書くにはpythonコンポーネントをダブルクリックすると、コードを書くことができるeditorが表示されます。ここに、コードをガリガリ書いていくことになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/9d3b2e5f-82a7-3e12-3ff8-732592e2ecce.png" width=50%>

```python:sample-script1

a = "hello, world"
```
コードを書いたら、Grasshopperに戻ります。コードでは"a"に"hello world"を出力するように書いたので、それを表示させます。
[Params]タブから[input]→[Panel]（螺旋のアイコン）をドラッグ＆ドロップ or 検索窓で"Panel"を入力すると、表示用のコンポーネントが呼び出せます。

呼び出せたら、Pythonコンポーネントと、表示用のコンポーネントを接続します。
pythonコンポーネントをダブルクリックすると、スクリプトが実行され、"hello, world"が表示されます。

### 簡単な入出力
続いて2つ入力をとり、掛け算した値を出力するサンプルです。
今回は入力側の数値は、スライダーで変えてみたいと思います。

再度editorを開き、以下のように書き換えます。

```python:sample-script2
a = x * y
```

コードを書いたら、[params]タブから[input]→[Slider]をドラッグ&ドロップ or 検索窓で"Slider"を入力し、スライダーコンポーネントを2つ呼び出します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/e2076392-b76a-dd1f-bbb7-c32a6a43f189.png" width=50%>

それぞれのスライダーをpythonコンポーネントと接続すると、二つのスライダーで指定した値の乗算値が出力されます。
コンポーネントは様々にあるので、入力値を増やしたり、スライダー以外のものに変えてみたり、上限値を変えたり、いろいろ遊んでみてください。
### Rhinocerosのコンポーネントを使う
続いては、Rhinoceros側に出力するコードを書きます。三次元空間に各辺100の空間に点を打ち、正方形を描画します。

#### 入力値を変える
まずは、Pythonコンポーネントの入力の数を減らします。入力値を増やす/減らすためにはコンポーネントの`+ -`を弄るとできます。また、入力の名前も`range`に変えておいてください(コンポーネントの入力部分を左クリックで変えられます)。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/03545b5f-2813-333d-3996-a4c2ebe162ff.png" width=25%>

#### 入力用のコンポーネントを作る
特定の範囲の値を生成してくれる`range`コンポーネントがあるので、それを使ってみます。
検索窓で"range"と入力して、rangeコンポーネントを呼び出し、pythonコンポーネントと接続します。
> このときにPythonコンポーネントを左クリックし、[List Access]を選択しておいてください（Item Accessだとruntime errorが起こる）。

続いて、範囲を指定するコンポーネントをrangeコンポーネントに接続します。検索窓で"100"と入力すると、上限値が100のsliderコンポーネントを呼び出すことができます。呼び出せたら、rangeコンポーネントと接続します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/180306ab-c222-d13d-e7cd-c03b6238c734.png" width=50%>

このような形になっていればOKです。
#### スクリプトを書く
コードを以下のように書き換えます。

Rhinocerosのコンポーネントを使うために`rhinoscriptsyntax`ライブラリを、描画用に`Rhiro.Geometory`をimportしています。

```python:sample-script3
import rhinoscriptsyntax as rs
import Rhino.Geometry as rg

points = []

for x in range:
    for y in range:
        for z in range:
            point = rg.Point3d(x, y, z)
            points.append(point)
a = points
```

ざっくりな説明ですが

rangeをforで回し、生成した座標を配列の中に突っ込み、その配列を出力しています。
![Screenshot 2021-01-24 17.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0da2ddf3-0374-ea03-c76e-44e377408231.png)



Rhinoceros側のPerpectiveに描画されました。マウスでグリグリ回したり、ズームなどして確認してみてください。rangeを変えたりすると、大きさを変えたりいろいろ遊べます。

# おわりに
今回の記事では、**Rhinoceros + Grasshopper + Pythonではじめる3Dモデリングことはじめ**ということで、基本中の基本のチュートリアルを行いました。自分自身も触り始めなので凝ったデザインはまだできませんが、他の人が作ったモデルなどをみていると、その可能性に非常にワクワクします。

ここから先はGrasshopper×Pythonのサンプルコードで遊んだりしながら、次の段階へステップアップができると思います。日本語情報はまだ少ないですが、

- 書籍やサンプルコードを読む

- ちょっとコードやコンポーネントを変えてみる

- 作ったモデルをforumに投稿する

みたいな流れで勉強していくと、自由にモデリングができるようになっていけるのではないかと思います(自分は他の方が書いたものをなぞる段階ですが..)。

最近では、Rhinoceros×Grasshopper(×programming language)のスキルへの需要も高いそうです。この機会に、3Dモデリングで遊んでみるのもいかがでしょうか？

---

最後に、自分のメモ用として、書籍やサイトの情報を残しておきます。

- 書籍
  - [Parametric Design with Grasshopper 増補改訂版 建築/プロダクトのための、Grasshopperクックブック](https://www.amazon.co.jp/Parametric-Design-Grasshopper-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%80%81Grasshopper%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF/dp/4802511213/ref=asc_df_4802511213/?tag=jpgo-22&linkCode=df0&hvadid=295706574430&hvpos=&hvnetw=g&hvrand=17826121187233507594&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-541693719535&psc=1&th=1&psc=1)
  - [コンピュテーショナル・モデリング 入門から応用 Grasshopper × スクリプトで極めるアルゴリズミック・デザイン](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%BB%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0-%E5%85%A5%E9%96%80%E3%81%8B%E3%82%89%E5%BF%9C%E7%94%A8-Grasshopper-%C3%97-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E6%A5%B5%E3%82%81%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%9F%E3%83%83%E3%82%AF%E3%83%BB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3/dp/4899774923/ref=asc_df_4899774923/?tag=jpgo-22&linkCode=df0&hvadid=342647643803&hvpos=&hvnetw=g&hvrand=17826121187233507594&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-817938938303&psc=1&th=1&psc=1)
- サイト
  - Rhino公式
  - Grasshopper公式
- Youtube
  - [Rhino Grasshopper](https://www.youtube.com/channel/UCjLDKM9EzNdASaNdjBhTqug?pbjreload=102)

# 参考資料
- [RhinocerosとGrasshopperでPythonを使う方法](https://qiita.com/o-kei/items/cfa3980d88e982eed3f5)
- [Rhinoceros公式](https://www.rhino3d.co.jp/)
- [GrasshopperでのPythonの基本的な扱いの紹介](http://m0rya-blog.xyz/all/106/)