Blender×Armoryで投石機を作ってみた

#概要
Blenderを使ってゲームが開発できるゲームエンジン「Armory」を使って投石機を作成してみました。
今回は、ボタンを押したら石を投げて的？に当てる動きです。

開発環境
・Blender2.8
・Armory 2019.10

↓今回の出来上がり
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/d144a226-60bd-38cc-5254-a17df4123e0b.gif">

Armory要素はスペースキー押すと投石機の受け皿が起き上がるって動作です。

##投石機の作成
ということでまずは投石機を作成します。
![stoned parts.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/27993285-4d53-3d0c-b9a8-49b3b5ba3373.png)

と言ってもぶっちゃけ投石機の画像見ながら作るだけなのでここは割愛します。投石機の写真とにらめっこしすればサクッと作れると思います。
しいて言えば、気にする点は回転部分は円柱で作ることと発射角は本体上部に出っ張りを生やして調節することくらいでしょうか。

##外殻の作成
ここからが本番です。
ただ作っただけではそれぞれのパーツは動きませんし、お互いにすり抜けるだけです。
ということで、まずは外殻から付与していきましょう。
<img width="800" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/7b3eb2db-05e0-6f7d-f3c8-fc93e02c9722.png">

１．編集したい物体をクリックして選択状態にしてから、画面左側のタブから「コンテクスト　物理演算」（赤丸で囲んであるところ）を選択します。
２．物理演算を有効の中からリジットボディを選択
３．その下のリジットボディのタイプからパッシブかアクティブを選択
４．アクティブを選択した場合、下に設定が出てくるので、重さを適当に設定してダイナミックにチェックしておいてください。

これで、選択したものに外殻が設定されます。
タイプですが、パッシブは外殻はあるが外力を受けない、アクティブは外力を受けるという設定なので、ぶつかったりしてほしいけど動いてほしくない物はパッシブにしておきましょう。（今回、土台部分はパッシブ、受け皿と球はアクティブにしています。）

設定のダイナミックにチェックを入れないとリジットボディが有効に働きません。また、アニメはアニメーション作成時に使うものなので、今回は使用しません。

コリジョンですが、衝突の際の当たり判定に使用します。画像ではメッシュにしています。
これにより形通りの当たり判定が期待できます。（メッシュにしておかないとトーラス形状の中央の穴がつぶされます。）

組み立てたものがこちら
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/a45db6d8-ab5c-897d-f216-8f1ee1c38eb6.png">


##挙動の作成
外殻が出来たら動かしていきましょう。

「スペースキーを押したら受け皿が起き上がって球が飛んでいく。」
今回は上記の挙動を実装していきます。

下記のようにLogic Node Editorを表示させます。
<img width="800" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/6817d974-78f7-6903-8020-f615f76b7f0f.gif">

ここにノードを作成していきます。詳しくは説明しませんが色々ありますので触ってみてください。
とりあえず、失敗例から出しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/ed9892f8-4b6d-a786-128a-eaad007632b6.png)
上でやりたい動作は
・On KeyBoard　下　space：spaceを押している間
・ベクトル：指定した方向にベクトルを与える
・Rotate Object：対象物の原点を中心に指定されたベクトルの方向に回転させる
ということなので、
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/b19cbda1-d116-bc4a-2e58-46e97613b366.png">
画像の赤矢印の先に原点を指定してやれば、スペースキーを押している間はZ軸にベクトルが＋される動きが期待できます。
（y軸に対して回転させたいのでなんか違う気もしますが・・・微妙に解釈がわかっていません）

で、できたのがこれ（形が違いますが設定は同じです。）
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/b21c7ea3-ec10-a057-e041-03235fb9a715.gif">
・・・は？
すべてを突き抜けていきました。
色々試したんですが、Rotate Objectを使って動かすとなぜかリジットボディを無視します。
ついでにRotate Object関係なしに、球は突き抜けます。

仕方ないので作り直したノードがこれです。
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/7b12a038-285a-f0be-cd78-8e06287d3032.png">
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/77b7f238-6714-a519-4823-8938df849d9e.png">

回転じゃなくて単純に上にベクトルを加えてるんですが、土台で固定されているのでその場で回転運動するって感じです。
力を加えたい場所が変わったので受け皿の原点も球の真下にしています。
ついでに球がついていかない問題が発生したので、それの修正もします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/1f434869-7f9c-369d-98a3-5db34b6ab5f0.png)
球を選択した状態で、コンテクスト 物理演算のリジットボディコンストレイントを有効にします。
タイプは固定。
設定は、有効と破壊可能にチェックを入れてください。コリジョンを無効は今回の場合影響しません。
破壊可能にチェックを入れるとしきい値も設定できるようになります。
これは、しきい値以上の力が加わった場合に固定が外れるかという値です。今回はとりあえず10で。
オブジェクトの最初を受け皿（先行して動くもの）、秒数を球（追従して動かしたいもの）に設定してください。日本語がおかしいのは気にしない。

これで実行して、スペースキーを長押しするとこんな感じになります。
<img width="400" alt="stoned.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497538/9af154d2-0f37-1bfd-343c-38d5384c8fba.gif">
画像内では加減してますが、スペース長押しし続けると受け皿が上に飛んでいきます。
すり抜け問題解決できる気がしません・・・

これに、的を適当に加えたのが冒頭のやつです。

##感想
Armoryの情報少なすぎ！
ノードの部分を解説している動画とか本当に少ないので、これだけの動きでもめっちゃ苦労しました。
Blender単体でアニメーションの作り方とかは結構あるんですけどね・・・

ノードをざっくり見た感じだと、「的にぶつかったときに的が砕けるようにする（コンテキストの追加）とかはスクリプトの力が必要になりそうです。