【第1版】階段のプロシージャルモデリング : Stairs Procedural Modeling

この記事では、Houdiniを用いて階段のプロシージャルな作り方を簡単に解説します。
わずか10種類のノードを使うだけで、↓このような事ができるようになります。一番下にhipファイルもあります。
![](https://f.easyuploader.app/eu-prd/upload/20191220024602_3463636951.gif)
解説用とは別に、ビジュアライズ用にパラメータを一つのコントローラに連動させたネットワークも作成しました。
コントローラには

- 段数
- 踊り場の数
- 蹴上
- 幅
- 踏面
- 踊り場の奥行き
- 螺旋階段の内径

計7つのパラメータを設定してあり、3種類のサンプルを同時に制御出来るようになっています。


# はじめに
ドイツで建築学生をやっているTaroです。
ここ2年間ほどHoudiniにどっぷりハマり、挙げ句に昔の夢？をこじらせてゲーム業界への就職活動中の32歳(1児の父)です。
アドカレ執筆に当たり、簡単かつ実用的で僕の建築のバックグラウンドを生かせる内容を考えた結果、階段をテーマにすることにしました。

### 免責事項
この記事ではプロシージャルモデリングをする際、目的に対してどう考えていくべきなのかに焦点を当てて説明していきます。
細かな操作や設定については、hipファイルを参考にして下さい。
わからない所は、直接Twitterで質問して下されば、出来る限りお答えします。

### 考え方について
基本的に考え方はいつも一緒で、0-2を繰り返してやりたいことを潰していく感じです。


**0. やりたいことがある**
↓
**1. とりあえず手作業でやってみる**
↓
**2. 手作業をロジックに変換する**
↓
**3. できた！**
↓
**4. 次のやりたいことに取り掛かる** 0.へ戻る

それぞれのステップをhipファイルに保存してあるので、プロシージャルモデリングの足がかりにしてみて下さい。

### この記事のターゲット
- **プロシージャルな考え方が知りたい方**
- **プロシージャルモデリングの資料を探している方**
- **階段が大好きな方**

### 記事の内容
- 同じ形を並べてつくる
    - 直進(鉄砲)階段
    - 折返し階段
    - らせん階段

以下↓ 随時更新予定

- カーブからつくる
    - ラウリン階段
    - 水平方向にもラウリンさせる
    - 本当のラウリン階段
- 自由なサーフェスからつくる
- 平面図からキッチリつくる
- まとめ
- hipへのリンク


# 同じ形を並べてつくる
ここでは、同じ形を並べることで階段をプロシージャルにモデリングすることに挑戦します。

## 直進(鉄砲)階段
真っ直ぐで折返しのない階段のことです。毛利小五郎の事務所の階段がコレだった気がします。
最終目標はコレ↓になります。
![](https://f.easyuploader.app/eu-prd/upload/20191220075538_3049437456.gif)
### まっすぐ規則的に並べたい
同じ形を規則的に並べたい場合、[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードを使うと簡単です。
AbobeやCADで言うところの配列複製です。…がもっと色々(移動,回転,スケール,シアー変形)できます。
適当な大きさに設定したBOXを[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードにつないで、色々なパラメーターいじって遊んでみて下さい。
![](https://f.easyuploader.app/eu-prd/upload/20191220080926_4f544f6649.gif)

### 段をピッタリ揃えたい
隙間が開いてたり、重なちゃったりするのをピシっと揃えたいと思います。
[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードのパラメーターを、BOXのリンクさせます。
動かす方向に対応したパラメーターはどこか、頭で考えながらやると段々スピードが上がります。
やり方は[この辺](http://houdini.indyzone.jp/blog/houdini%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93%E3%83%AC%E3%82%B7%E3%83%94-8-%EF%BD%9E-reference-copy%EF%BC%88%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E5%8F%82%E7%85%A7%EF%BC%89-%EF%BD%9E/)を参照。
すると、
![](https://f.easyuploader.app/eu-prd/upload/20191220084422_48374f4c39.gif)
移動距離に段の大きさが追随するようになります。

### 踊り場を設けたい
先のノードだけでも結構楽しいんですが、等差数列的なことしかできません。
つまり、ずーっと同じ規則でしか複製されません。
何メートルも登って踊り場がない、というのはバリアフリーのうるさいこのご時世リアリティに欠けます。
そこで踊り場を設けたいと思います。

#### まずは手動で
パッと思いつかない場合は、頭で考えるより手を動かすことをおすすめします。
[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードを使って、踊り場にしたい一番上のBOXのポリゴンを一枚選んで、Z軸方向に動かします。
さらに[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードをもう一つ追加して、移動させます。
スナップについては[この辺](https://qiita.com/pokoponmaru/items/2b996e6fb1e6c29f5f55)を参照。
ピボットを動かすためのハンドル切り替えは "Insert" キーで行います。ドラッグはMMBで。詳しくは[こちら](http://houdini.indyzone.jp/blog/houdini%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93%E3%83%AC%E3%82%B7%E3%83%94-7-%EF%BD%9E-handle%E6%93%8D%E4%BD%9C-%EF%BD%9E/)を参照。
![](https://f.easyuploader.app/eu-prd/upload/20191220091252_325a46386b.gif)

#### プロシージャル化
ただ、これだと当然蹴上や踏面を変更した時にうまく行きません。
そこで移動距離を計算式で表す事を考えます。

```C:移動距離
Y軸方向: 蹴上 * 段数                 //1つ目の[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のパラメーターからコピー
Z軸方向: 踏面 * 段数 + 踊り場の奥行き //1つ目の[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html),BOX,[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html)のパラメーターからコピー
```
これらの計算式を2つ目の[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のノードに記入します。

すると、
![](https://f.easyuploader.app/eu-prd/upload/20191220092423_514f42316b.gif)
一見、完璧になったかのように見えますが…踊り場までの段数を変えると、
![](https://f.easyuploader.app/eu-prd/upload/20191220093825_5461346c48.gif)
この様に破綻してしまいます。

原因は[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html)で動かすポリゴンを手動で選択しているからです。
こういった手動の選択を、様々なロジックで再構成するのがプロシージャルモデリング一つのの醍醐味になります。
今回はノードをできるだけ少なく、かつ、コードを書かない方法を考えてみます。

動かしたいポリゴンは**Z座標が最大**で**垂直**なので、Z軸上で原点近くに動かした後、XY方向に広くZ方向に薄い直方体で選択します。
まず、labツールの[AxisAlign](https://www.sidefx.com/tutorials/align-axis/)を使って、踊り場のZ座標が0になるように移動します。
ポリゴンの選択には[Group](https://www.sidefx.com/ja/docs/houdini/nodes/sop/groupcreate.html)ノードを使用します。
パラメーターのカテゴリの中で"Keep in Bounding Regions" を有効にして、踊り場を選択できる適切な大きさのBoundingBoxを設定します。
Group名を設定し、[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html)ノードに入力します。

![](https://f.easyuploader.app/eu-prd/upload/20191220094735_7235573544.gif)

これでようやく鉄砲階段のプロシージャル化が完了しました。
![](https://f.easyuploader.app/eu-prd/upload/20191220075538_3049437456.gif)

### さらなる挑戦
蹴込を作りたいが、下の段とピッタリ合わせるには？
階段の下の面を斜めにするには？
その時、踊り場との取り合い部をどう処理する？
手すり付けるとき、出入り口部分をどうやって切り取る？
※特に正解は用意してません。よかったら一緒に考えましょう。

### めんどくさい？
たかが真っ直ぐな階段一つに、こんなに手間をかけて馬鹿らしいですか？
もちろんそのとおりだと思います。
でもこの作業、毎回やる必要ないんです。一回ネットワークを組んでしまったら、リンクのさせ方や計算式,ポリゴンの選択方法、全て忘れていいんです。
沢山真っ直ぐな階段を配置しなきゃ行けないシチュエーションに出くわしたら、このネットワークをコピペするだけで今回の頑張りが活かされるわけです。
ただし、色々とエラー回避するのはこんな簡単なものでも結構めんどくさいので、手作業でいい部分とそうでない部分を天秤にかけながら作業できると効率が上がります。(自戒を込めて)

---


## 折返し階段
まっすぐ降りて、踊り場があって、反対向きに降りて、を繰り返す階段です。
最終目標はコレ↓になります。
![20191220103446_6f46643842.gif (769×1080)](https://f.easyuploader.app/eu-prd/upload/20191220103446_6f46643842.gif)


### 折り返したい
今回は、折返しを踊り場までの塊を180度回転することで表現したいと思います。
#### まずは手動で
先の直進階段のネットワークをコピーしてきます。
[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html)内で手動でポリゴンを選択し、踊り場をX軸方向にも広げます。広げる寸法はBOXの大きさにリンクさせます。
2つ目の[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のY軸回りの回転を180度に設定します。
![](https://f.easyuploader.app/eu-prd/upload/20191220104657_614e426642.gif)
大体できました。あとは先と同じく、手動選択をロジックに置き換えていきます。

#### プロシージャル化
直進階段のときと同じく、選択しやすい位置に移動してグループを作成します。
[AxisAlign](https://www.sidefx.com/tutorials/align-axis/)で移動した後、[Group](https://www.sidefx.com/ja/docs/houdini/nodes/sop/groupcreate.html)ノードのBoundingBoxのパラメーターに踏面寸法を用いてX軸方向に動かすポリゴンを選択します。
![](https://f.easyuploader.app/eu-prd/upload/20191220110520_66357a6a68.gif)

これで終わりです。あっさりと出来たのは、先のネットワークという資産があったからです。
こういった資産のことを**"アセット"**と呼んだりします。自分だけの資産を積み重ねるのも、プロシージャルモデリングの醍醐味です。
また、アセット≒ネットワーク化されたノード群、を一つのノードの様に扱うことも出来ます。
詳しくは[この辺り](https://support.borndigital.co.jp/hc/ja/articles/360005246353-%E3%83%8E%E3%83%BC%E3%83%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86HDA%E3%81%AB%E3%81%99%E3%82%8B)を参照。

### さらなる挑戦
踊り場に一段階段がかかってるのをやめたい？
各階ごとにどうやって手すりを切る？
真ん中を吹き抜けにしたい？
1階と2階で階高が違ったらどうする？
※特に正解は用意してません。よかったら一緒に考えましょう。

## らせん階段

### まずはBOXで
#### まずはノード2つで
Z軸方向に配列複製していたのを、Y軸回りの回転に替えます。
![](https://f.easyuploader.app/eu-prd/upload/20191220114943_5934756277.gif)

#### 重ねたくない
重なってる部分をどうにかするために、BOXを[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html)を用いて台形にします。
![](https://f.easyuploader.app/eu-prd/upload/20191220115053_4c684a3371.gif)

#### 丸みがほしい
BOXの分割数を挙げて、手動で扇形にしてみます。
![](https://f.easyuploader.app/eu-prd/upload/20191220115326_767a4d7636.gif)
大きさや幅を調整するのは、難しい。
### 扇形で
#### まずはノード2つで
circleノードを使用します。Angleに[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のパラメーターをリンクさせます。
![20191220115834_6f674a3661.gif (600×553)](https://f.easyuploader.app/eu-prd/upload/20191220115834_6f674a3661.gif)

#### 厚みをつけたい
PolyExtrudeを使用します。Distanceに[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のパラメーターをリンクさせます。
![](https://f.easyuploader.app/eu-prd/upload/20191220120005_594e547156.gif)


#### 内径がほしい
![](https://f.easyuploader.app/eu-prd/upload/20191220120212_344c4f5155.gif)

#### 内側がシャッターみたいなのどうにかしたい
![](https://f.easyuploader.app/eu-prd/upload/20191220120353_3030756651.gif)

```C:弧の開始角度と終了角度
開始角度: -(一段の回転角度 /2)
開始角度:   一段の回転角度 /2
```

#### 丸みが真ん中にもほしい
labのDiscGeneratorを使います。

![](https://f.easyuploader.app/eu-prd/upload/20191220122748_445532576c.gif)

### 踊り場をつくりたい
#### 基本は同じ
踊り場までの塊を一つとして、[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)させます。
#### まずは手動で
厚みをつけて、踊り場を作るためのポリゴンを回転させます。
![](https://f.easyuploader.app/eu-prd/upload/20191220122958_6a4e707338.gif)

弧が伸びてうまく行きません。今回は単純に複製で表現します。
とりあえず、段3つで1つの踊り場とします。
[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)のY軸方向移動と回転をひとまず手動で設定します。
![20191220123341_3470767561.gif (600×553)](https://f.easyuploader.app/eu-prd/upload/20191220123341_3470767561.gif)

#### プロシージャル化

以下のように回転角度と移動距離を設定します。

```C:回転角度
Y軸周り: 一段の回転角度 × ( 段数 + 3(仮) ) //踊り場のための[Copy and Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/copy[Transform](https://www.sidefx.com/ja/docs/houdini/nodes/sop/xform.html).html)ノードからパラメーターをリンク
```

```C:移動距離
Y軸方向: 蹴上 * ( 段数+1 )                //+1は踊り場の分
```

![](https://f.easyuploader.app/eu-prd/upload/20191220123548_4a706f5031.gif)


プロシージャルならせん階段が出来ました。


### さらなる挑戦
踊り場の構成する数を、奥行きの寸法から導くには？
四角、楕円平面の階段はどうする？
Q,U字型の動線のらせん階段をどうする？
二重らせんにするにはどうする？



# Coming Soon…？
### カーブからつくる
![](https://f.easyuploader.app/eu-prd/upload/20191220125628_62504b6f48.gif)
### 自由なサーフェスからつくる
### 平面図からキッチリつくる

# まとめ
ここまでスクロールしてくださってありがとうございました。
何度か更新する予定なので、また見に来て下さると嬉しいです。
モチベーションに繋がるので、Twitterなり他のSNSなりでリアクション頂けると嬉しいです。

# hipのリンク
Google Driveよりダウンロードして下さい。
[**HIP 01**](https://drive.google.com/file/d/1RIaMrcIc-Xh6og9uKDUQpeWuq2AWNy47/view?usp=sharing)
[**Matcap**](https://drive.google.com/file/d/1jqDXy1ByjPdqvpQMait6c-jd8vOVrypW/view?usp=sharing)