1. はじめに
ナビつき! つくってわかる はじめてゲームプログラミング Advent Calendar 2022 24日目の記事です。
タイトルを見て錐の記事だと思った方は残念。今回は、錐の記事です。
錐(きり)じゃなくて、錐(すい)
注記:錐について元々は他の方がアイデアを投稿したものを、私が一般的なものに昇華したり整理したりしたので、記事にします。
2. 錐の作り方概要
錐の作り方は、大きく 3パターンある。メリデメをまとめると以下の表のようになる。
方式名 | メリット | デメリット |
---|---|---|
モノ発射 | 何角錐でも作成できる 角を多くすれば円錐のように見せることができる |
錐を動かすことができない これだけでは底面を作れない |
物理配置 | 何角錐でも作成できる 角を多くすれば円錐のように見せることができる 角が少ない錐なら消費ノードン数が最小 |
錐を動かすことができない 配置がだるい |
ヒンジ連結 | 錐を動かすことができる | ノードンを消費する 連結上限のため六角錐が最大 |
3. 作り方詳細
3.1. 共通内容
どの形式だとしても、錐の各面のサイズや垂線からの開く角度を計算で求める必要があり、共通のため、この節で取り上げる。
今回は例として六角錐を記載するが、計算方法は何角錐でも変わらない。
最終的に必要になる値は
- 緑の長さ(Lg)と橙の長さ(Lo) :各面の直方体のサイズ
- 水色と緑がなす角度(θ) :ヒンジに与える角度
※ Lg : Length green のように後ろの文字は色を示している。
緑の長さと黄色の長さは決め打ちでも良いが、例えば傘のように開いたり閉じたりする場合、赤の長さ(Lr) が固定になって橙の長さを開き具合で何個か決め打ちで求めることになると思うので、入力として与えられる値は、赤の長さ(Lr) と橙の長さ(Lo) として進める。
まず、Lr, Lo から Lg を求める。
Lg = √(Lr^2 - (Lo/2)^2)
φ = 正N角形の一つの内角の半分 (180*(N-2)/N)/2 (五角錐なら 54°、六角錐なら 60°)
Lp = Lo/2 * tanφ
sinθ = Lp/Lg
θ = arcsin(Lp/Lg)
ちなみにはじプロ内でθを計算するには青の長さ(Lb) を求める必要がある。
Lb = √(Lg^2 - (Lp/2)^2)
で、位置を角度にノードンの縦位置に Lp、横位置に Lb を入力すればよい。
余談だが、各辺の長さがわからず sinθ の値のみわかっている状態から はじプロの機能だけで θ(角度) を求めることも可能である。
単位円と位置を角度にノードンを用いる方法で、本質的には上の θ を求めた方法と同様ではある。
逆三角関数ノードンの解説 https://t.co/X0iq2Cq50j pic.twitter.com/zdZZcL2XQA
— tak.ham (@tak_hama_) August 31, 2022
これで必要な、Lg、Lo、θ がそろった。
また、テクスチャで、以下のような三角形を描画し、サイズを X:Lo, Y:Lg、貼り付ける面を Z中央 にしたものを用意する。
3.2. モノ発射方式
起点に Yヒンジ連結(回転用)、Xヒンジ連結(θ の角度を固定で与える)を連結し、モノ発射ノードンを取り付ける。モノ発射の量は、十角錐以下なら 10、それより多いなら 100 にする。
モノ発射のサイズは X:Lo, Y:Lg, Z:0.1 にする。
Yヒンジを 0~360 で回転させ、N角錐の位置(五角錐なら 0,72,144,216,288、六角錐なら 0,60,120,180,240,300)で、モノを発射すれば側面ができる。
(0,72,144のように書いたが、初期値 0 で発射されまくるのもなんなので、実際には +1 した値で発射させたほうが良いと思う。)
これと同じ方法で、Nの大きな N角錐を作ると、疑似的な円錐に見せることができる。
円錐における最適な N がいくつかは好みとこだわりにもよるが、使用するモノ発射ノードンが一つという条件で行くと、以下の制約を受ける。
- N <= 100 (モノ発射の最大が 100 なので)
- Y軸の回転が 6度以上 (モノ発射の最小間隔が 0.1秒 = 6f なので。まぁ、カウンターへの入力を 1未満にすればいいんだけど)
- 360 の約数
ということで、六十角錐がベターなのかな。と個人的には思っている。2個目の制約を無視すると九十角錐も作れる。
また、モノ発射(100) を 2つ使うことで、百八十角錐にすることも可能ではある。
また、2章のデメリットに書いた「錐を動かせない」というのは、モノ発射で作られた側面はきれいに並んでいるが独立したモノが並んでいるだけということに起因する。
これを解決したのが次の方法である。
※物理配置方法は省略する。
3.3. ヒンジ連結方式
モノ発射方式は起点を中心に回転しながらモノ発射で側面を作成していたが、ヒンジ連結方式は起点を中心にヒンジ連結等で側面を連結する方式である。考え方はどっちも同じで、動的に作るか静的に作るか、の違いか。
Yヒンジには、モノ発射方式の発射タイミングの 0,60,120~ みたいなのを入れる。
(0,90,180,270 については、連結面の設定やXZの扱いでできるので、ヒンジを節約している)
側面を連結で用意するため、連結上限32 の影響を受け、六角錐が最大となる。ただ、それを補って余りあるメリットとして、錐を動かせるというのがある。
これを活用し私が今まで作ったものには、ラミエルと傘がある。
Aパート、だいたい出来た。
— tak.ham (@tak_hama_) April 26, 2022
#はじめてゲームプログラミング #NintendoSwitch pic.twitter.com/YEcgEVpqnx
開いたり閉じたり回ったり。の状態遷移。
— tak.ham (@tak_hama_) December 15, 2022
なんかもうやりきった感w
#はじめてゲームプログラミング #NintendoSwitch pic.twitter.com/HF37BU18bg
これらは、モノ発射方式では実現できない。
また、錐を動かす方法だが、物理的な移動ではなく、ワープ移動となる。これは、側面のふるまいを「動かない」にする必要があるためである。
4. まとめ
これで錐の作り方が分かったので、皆さんも錐を活かしたゲームを作ってみてください。
私自身も、錐を使ったものは映像作品でしかなく、ゲームと呼べるものは作成できていないので、頑張ります。
(錐(きり)のゲームも見てみたいけどw)
最後に、今まで紹介した技術で作った絵を置いて終わりにします。
Happy Christmas!
(モノ発射方式で、円錐と四角錐台を作成)