見出し画像

Unityで3次元の太い線を描く(描きたい)

こんにちは、カキレモンです。今週末は天気がイマイチでテンション低め。

さて、今日はUnityで体積のある線を描く方法を考えます。例えば円柱とかドーナツみたいなイメージです。

正直Unityの標準機能とかシェーダーでなんとかなるんじゃないかと踏んでたんですが、結局うまい方法が見つからなかったので地道に頂点を計算してメッシュを生成する方向になります。もっと頭のいい方法があったら誰か教えて下さい。
今回は時間の都合上実際にメッシュ生成するところまではいかなかったのできっと後日続きを書きます。

2次元で考えよう

メッシュを生成するためには、とにもかくにも頂点の座標が必要です。
要は「元」になる曲線を適当な解像度で折れ線とみなして、その各節に対して垂直な平面を求めたいわけですね。

……あたまいたくなりそう。
こういうときは「次元を下げて考えればいい」ってばっちゃが言ってた

ということで、これです。

大体イメージできましたかね。

頂点を3次元的に広げよう

こっちが本題です。

上のリンクと同様に、折れ線の各頂点に対してその地点での「断面」となるような平面を求めます。1つの頂点を挟む2辺を取り出して考えましょう。

こういうことがしたいです。(さっそくリンク先と違うことをやっていますね、ご容赦ください。)

画像1

なぜ「上から」と「横から」の2つの図があるかというと、平面を構成するに2つのベクトル(すなわち、基底ベクトル)が必要だからです。

上から」で見えている基底ベクトルはすなわち角の二等分線に相当するので、頂点を挟む2つの辺のベクトルを足して割ればいいです。

画像2

横から」見る、というのはつまり2つの辺が乗っている平面を横から見ているので、その平面の法線ベクトルを求めます。ベクトルの外積を使うと一発です。

画像3

このようにして得られた基底ベクトル(画像のp,q)を使って実際の頂点を計算します。ここで、得られる2つのベクトルは直交基底じゃないとか2辺が1直線上にあるときは別処理とか細かいことは色々ありますが詳しい説明が苦手なので割愛します。

Unityで表示する(仮)

以上、Unityでやりました(手順省略)。スクリプトでメッシュを生成するのはめちゃくちゃ面倒くさいので後回しにして、Gizmoを使って手っ取り早く表示することにしました。

余談ですが、画像の部分を押すとGame ViewにもGizmoを表示することができてちょっと便利です(ボタンが隠れていることもあるので、Game Viewの枠を横に伸ばして表示させる)。ご存知でしたか?

スクリーンショット 2021-03-22 000446

試しにドーナツっぽいものを表示させてみます。断面が緑の線で、輪郭が青の線で描画されています。これはこれで、サイバー感がありますね。

スクリーンショット 2021-03-22 001357

余興

偶然面白そうなものを見つけたので、先程作ったやつにぶち込みます。

というわけでできたものがこちら。

これ↓はα=2 β=-3とかだった気がする。

こっち↓はパラメータの設定忘れた。でも上のリンク先とだいたい同じ形。

おわりに

Gizmoだと表示順が変になっている部分があるので(奥から手前の順ではなく単にプログラムで呼んだ順っぽい?)、さっさとメッシュを貼りたいです。次回、乞うご期待。その時までにコード整理して公開します。

数学とか5億年ぶりにしたので、なぜか単位ベクトル同士の外積が単位ベクトルになると思いこんでいました(バカ)。

ノロノロ書いているうちにもうこんな時間(0:50)です。書き続けていればいずれはもう少し速く書けるようになるでしょうか?もう遅いので今日はこの辺りで筆を置きます。

それでは、(願わくば、)また。

追記:2021/04/09

次回です。


この記事が気に入ったらサポートをしてみませんか?