いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

(新)ベジェ曲線とは何か

 空間の中を戦闘機を動かしましょう。普通に数学でやるように空間内の曲線の式を使ってもよいですが、式では表しにくい曲線もあります。

f:id:Inuosann:20210307233600p:plain

 図を見てください。線分p0p1を8:2に内分する点、線分p1p2を8:2に内分する点、線分p2p3を8:2に内分する点をそれぞれp4p5p6とします。見やすく図でも赤にしました。

  線分p4p5を8:2に内分する点、線分p5p6を8:2に内分する点をそれぞれp7p8とします。緑色の点です。

 そして線分p7p8を8:2に内分する点をp9とします。 

 もとの点p0、p1、p2、p3からこうしてp9を得ました。これは各線分を8:2に内分して得たわけですが、この比を最初は0:1、次に0.003:0.997、次に0.008:0.992、……とジワジワ変化させることにより点p9はジワジワ動くことが分かるでしょう。こうして点p9は空間内を、点p0の位置からスタートして最後にp3にたどり着くのです。このとき点p9が描く空間内の曲線が(3次の)ベジェ曲線です。最初に与える4点はこのベジェ曲線の制御点と言います。また、制御点の個数は4次なら5点、5次なら6点です。

 実はベジェ曲線についてはすでに書いています。

www.omoshiro-suugaku.com

しかしややゴチャゴチャした感じなので、分かりやすく書き直してみました。

 Unityのプログラムでは例えば次のように点p9を求められます。

Vector3 p4 = Vector3.Lerp(p0, p1, 0.8);
Vector3 p5 = Vector3.Lerp(p1, p2, 0.8);
Vector3 p6 = Vector3.Lerp(p2, p3, 0.8);

Vector3 p7 = Vector3.Lerp(p4, p5, 0.8);

Vector3 p8 = Vector3.Lerp(p5, p6, 0.8);

Vector3 p9 = Vector3.Lerp(p7, p8, 0.8);

関数 Vector3.Lerp(p, q, t) は線分pqを t : 1-t に分ける点を返します。自分で実装するのも楽でしょうが、せっかくこういう関数があるので今回、敵機の移動にこれを使ってみました。なかなかの感じです。いいことばかりではなく、p0をスタートしてp3で終わる軌道を描かせることはできますが、途中、どの辺を通るかはパッとは分かりません。でもこんな手軽に曲線が得られるのはありがたいです。

 いろいろ勉強になります。