シューティングゲームで、敵のキャラクタを式に従って動かします。空間の曲線なら、例えば
だったらtが増えるとz軸の正の向きにグルグルとらせんを描きながら進みます。話題は少しそれますが、この式だって易しいけれど数学。「プログラミングに数学は不要」とか言う人はどこを見て言ってるんでしょうか……。元に戻して……こうして、戦闘機の動きをコントロールするのです。このとき、ルートの途中から別の式を使いたいことがあります。こんなケースです。
Aの部分では曲線、Bの部分は直線になっています。しかし、このままのルートを辿らせるわけにいきません。継ぎ目の部分で「カクン!」と移動の向きが変わり、いかにも不自然だからです! 3Dのゲームではよく機体の向きを進行方向に合わせて表示します。すると継ぎ目では「パッ」と向きが変わり、これが不自然さに輪をかけます。あえてそのままにして、そういう効果を出したいこともあるでしょうが、こればかりでは困ります。
解決するには、継ぎ目をそのまま通るようにするのではなく、滑らかな曲線に沿ってうまく動かせばよいのです。ベジェ曲線を使えます。
しかし、やり方がまずいのだと思うんですが、これがなかなかうまくいきません。ベジェ曲線には制御点というのがあり、実際のゲームではこれの取り方が難しい。ずいぶん前にもうまくいかなかった記憶があります。
何か他の方法は……と考えて、……ありました!! ラグランジュ補間です。これについても前、ブログの記事にしました。
下の図を見てください。
曲線ABCDに、点Bで曲線BEFKをつなげたいとします。しかしそのままつなげると、最初に書いた問題が起こります。点Bで不自然にカクッと曲がるのです。そこで、赤い曲線BCFGを考えるのです。ABHCIFJGKと動かします。図ではABHC……と移動したときやはり点Bで「カクッ」となっていますが、まあ大丈夫。プログラムではCをBのごく近く(1/50秒程度でキャラクタが移動する距離)に取りました。BHCはほとんどBCに一致します。もともとはBEFGを通したかったのですから、点Gからは曲線BEFG上を移動するようにします。ここでもF、Gはごく近い位置に取ります。やはりFJGはFGにほぼ一致し、言わば「点Gで滑らかに着地」するのです。つまり4点を通る赤い曲線BCFGの式が求まれば解決です。
曲線を、好きな4点を通す方法がラグランジュの補間法です(もちろん5点でも6点でも通すことができます)。ブログではxy平面の何点かを通る曲線の式をもとめていますが、空間でも大丈夫。各時刻(B、C、F、Gでの時刻)とそれぞれのときのx座標から式を求め、同様にy座標を計算する式を求め、z座標を……とやるだけです。完璧……ではないですが、まあ滑らかに動いています。結局、敵戦闘機はABHCIFJGKと移動します。
効果を動画でお見せしたいですが、そういう機能がはてなブログにはないようですね。JIFのアニメーションにでもしてもよいのかと思ったんですが、これもよく分からずとりあえず諦めました。できるようになったらお見せします……というよりゲーム完成が早いかも。
追記 2021年3月19日(金)
控え目に「簡単な式だけれどこれも数学」くらいに書きましたが、ベジェ曲線だってラグランジュの補間法だって数学です。ライブラリとかあるのかも知れませんが、柔軟に扱うには結局自分で全部理解していないとダメでしょう。ライブラリがあるときは使うべし、まあ正しいと思いますが使う人の頭には数学不在、みたいになったらうまくないのでは……?
話としては「数学不要!」の方が面白いのでしょうが、それ、本当に面白いのか落ち着いて考えましょう……。