物理法則を無視したビーダマンのワンシーンをHoudiniで作ってみた

この記事はHoudini Apprentice 2023年12月21日の記事です。
かなり未熟な点もあるかと思いますが、もしよかったら読んでってください。

ビーダマンと言われてもピンとくる人は非常に少ないと思いますので簡単にご紹介しつつ解説しようと思います。



### ビーダマンとは？

私が子供の頃に夢中で遊んでいた玩具にビーダマンというものがあり、その魅力の一つとなっていたのが当時月刊コロコロコミックで連載されていた今賀俊先生の「爆球連発!!スーパービーダマン」という漫画でした。
漫画自体がタイアップとなって新ビーダマンの宣伝となる効率的なものでした。
そもそもビーダマンというのは手のひらサイズの玩具で、見た目は〇ンバーマン。お腹にビー玉を詰めて背中のトリガーでそれを押し出すというものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/c2c4fb94-6cfc-0a09-bf7d-d5625e5d2fbc.png)
https://www.amazon.co.jp/gp/product/B00SUMNZ3E

<br>
その漫画ですが、子供ながらにもやりすぎに思える誇張表現が豊富にあるわけです。
作りものとはいえ壁を破壊したり、1発のパワーショットが10発ものショットを全て弾き飛ばしたりと、紹介すればキリがありません。
<br>
ただまぁ、これはロマンなのでいいのです。
<br>
今回はそれらのシーンの中の一つ、主人公　戸坂玉悟の愛機ファイティングフェニックスが爆誕した際のスーパーショットをシミュレーションしてみましたので、いくつかのパラメータを記録してこうと思います。

こちらが作ったシーンと、参考にしたシーンです。

![mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/ff65ef82-c1a7-f582-1486-b12fbabc7e31.gif)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/0d0c5c2e-4472-da67-d533-d5a0b519aa3a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/e6f793a7-3a9e-22a3-c5fe-95200a781694.png)
爆球連発!!スーパービーダマン3巻｜今賀俊

これはビーダマンの全国大会の一戦です。
中央にあるターゲットを打ち合い、時間切れの瞬間に相手陣地にターゲットを押し込んでいた方が勝利というシンプルなものです。時間切れ時には画像のように爆発します。
相手チームに地道に押し込まれたターゲットを、遅れて登場した主人公の一発で大逆転するものでした。
当時新商品として登場したファイティングフェニックスの作中初登場シーンでしたので、なかなか派手です。

<br>
で、これらのシーンを構成するノードがこちらです。

### ターゲットのモデリング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/18f0ee47-b8f5-5af9-0fe0-f289cce8bcdb.png)

これらネットワークの大部分は、ターゲット(黒いタイマー付きの半球体)の作成にあてています。
ローポリの半球体に対して各面を別々のプリミティブに分離して厚みをつけた程度です。

これら押し出したオブジェクトをGlueで接着させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/9584eb0a-4351-ba32-3004-d0c00b13eb00.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/eb47a39a-910b-863d-2dd2-8e8bbb7a61f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/15971b1d-070e-44aa-d638-8f548ff0f648.png)



その他ステージ台、飛び交うビー玉も別のGeometryとして作成してありますが…
円柱を押し出したりしただけなので、割愛します。



### 打ち合いのシミュレーション
敵チームのビー玉と主人公の一発、ターゲットはDOPで制御してます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/f180bcc5-335d-4a88-9051-a7b68b46a180.png)



### 相手のビー玉
軽い球を少しランダムに間隔を開けつつ連射したかったので、それらのセットアップです。
50Fまでの間、ランダムに球を撃ち続けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/5d98e1d3-1ef7-f91e-10e5-03ce68caee8e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/4eb4a1f8-4215-61aa-8082-700e861cb4d4.png)
Densityは3000に設定しています。
CreationFrameのHScriptをこのようにしています。
```
($F + round(rand($F))) * ($FF < 50)
```
これはランダムなフレームでビー玉を発生させたかっただけなのですが、パラメータがCreationFrameということで文字通り発生させるフレームを指定してあげる必要がありました。
ということでビー玉を発生させるフレームを、$F(今)に対して
```
round(rand($F))
```
つまりランダムで0か1を足してあげることによって、今発生させるのか、しないのかを決めています。
```
 * ($FF < 50)
```
の部分ですが、ターゲットの爆発が60Fなのでその手前の50Fまでは発射させています。

ちなみにInitialStateのVelocityにはこのように設定していますので、少しバラつきのある速度の球が発射されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/2ae12756-661c-bf48-412b-6c292b74b3fd.png)


### 主人公のビー玉
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/4b4fd3cf-b311-e5f0-391e-864f3fca4790.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/b7d66290-7c7b-6f94-a37a-97b9086681e9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/d822ebcc-f568-9850-f491-109172ff93eb.png)


基本的には相手のビー玉と同じなのですが、重さ(というよりDensityなので密度)が全く違います。
Densityだと150000…先ほどの相手チームのビー玉が3000でしたので、50倍になります。
なんと作中のパワーはスピードや回転ではなくビー玉そのものの密度が正体だったようです。
まるで鉛玉です。

### ターゲットの爆発
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/22d931f6-277e-d95f-2318-ab304ea450bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/395ea6bb-a710-89d5-2ab9-422642a6935f.png)

ターゲットの制御ですが、基本的には先ほど上のネットワークで作成した黒いブロックをGlueでくっつけています。
そのGlueのActivationを、DOP内でFalseにすることで爆発したように見せている、ということになります。
Glueが働いている間はただの塊として機能するので、DensityとFrictionを適当に設定してそれっぽいバランスに調整しました。

そして肝心の爆発ですが、ここで設定しているのがRBD Stateの "Angular Velocity"です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/bfbbd167-7060-af4c-1bf7-701227521362.png)



ここの数値で爆発の大きさを決めてます。
こちらにドキュメントがあります。正直理解しきってないのですが、Angular Velocityの調整が最も見た目いい感じになったので、採用としました。
https://www.sidefx.com/ja/docs/houdini/nodes/dop/rbdstate.html#state
Angular Velocity 0, 0, 0
![AngularVelocity0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/457727c2-f4d4-cd84-affc-49ff08f659b2.gif)

Angular Velocity 500, 500, 500
![AngularVelocity555.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/25911c8b-240e-b5ed-cd52-3530fbff6d08.gif)

Angular Velocity 1000, 0, 0
![AngularVelocity1000.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324499/6f53a822-8866-60d5-7f8e-779b0fed5976.gif)

### さいごに
以上、Houdiniでビーダマンのワンシーンを再現した記事でした。
ビーダマンの漫画にはこのような派手なミラクルショットのシーンが非常に多いので、再現するためにどのような設定が必要かなどを探ってみると面白いと思います。というかこれ、シリーズ化できそうな気もします。
<br>
興味を持った方は是非、ビーダマン読んでみてください。
もういいぜ！