Unityで3次元の太い線(トーラス)を生成する
こんにちは、カキレモンです。あっという間に4月になってしまいました。
前に書いた記事の続きです。前回はGizmoを使ってそれっぽいものを描画するだけにとどまりましたが、今回はちゃんとメッシュを生成して立体表現をしていきたいと思います。
最後の方にGithubのリンクが載っています。
メッシュとは
大まかに言えば、3Dモデルを表示するための情報を保持しているものです。例えば、「頂点の座標」「面を構成しているのはどの頂点か」などといった情報を持っています。
逆に言えば、これらの情報を与えてやることでオリジナルのメッシュを作ることができます。
実際にメッシュを動的に生成するにあたっては、この辺りを参考にしました。
ねじれを解消する
前回は、基底を求めることで線の周りに円形に広がる頂点の座標を計算する方法を考えました。これらをうまくつないで面にすればメッシュを生成できそうな気がします。
しかし、適当に基底をとるとこのように辺がねじれてしまうことがあります。
ねじれを避けるためには、隣り合った節の基底ベクトルはなるべく「近い」角度にしなければなりません。
そこで、隣の節の基底の正射影をとってそれを基準に次の節の基底を決めることにします。
正射影を求める方法はこのサイトを参考にしました。
また、この方法だと最後の節に曲線全体としてのねじれが集中してしまうので、その角度を計算して全体に分散させることにします。
できたもの
というわけで、それっぽくできました。
曲線の式は前回と同様にこちらで紹介されているものですが、少し手を加えて曲線が時間変化するようにしました。生成したメッシュをプログラムからさらに動的にいじれるのもUnityのいいところですね。
コード
余談
ところで、2Dのメッシュの動的生成は以前のunity1weekで作ったこのゲームでもやっていたりします。形状が柔らかく変化する物体を表現するため、メッシュの頂点がぷよぷよ動くようにしました。
おわりに
最後に色々調べて気づいたのですが、今回作ったのは一周するものに限られるので「曲線」というよりは「トーラス」と呼んだほうがよかった気がします。あと今回作った形は「トーラス結び目」と呼ばれるものらしいですね。
曲線の太さを途中で変えたり、断面を円以外の形にしたりしても面白そうですね。特にやってみる予定はないです。
ということで今回は以上です。
それでは、(願わくば、)また。
この記事が気に入ったらサポートをしてみませんか?