真面目そうなタイトルですがそんなに中身はありません。
0803の話です。
これがやりたかっただけシリーズ pic.twitter.com/evyCFIL168
— phi16 (@phi16_) 2021年8月1日
ここでの曲面は、ぱきっと折れ曲がったりしていないものを指します。なめらか。
理想的な「曲面」をどうメッシュ化するかということについては、たくさんの人類が考えてきたことではないかと思います。
そしてそれは数学の上で言語化できるものです。というよりも言語化が数学ですが。
ここで大きく重要なのが曲率で、これは曲面の曲がり具合を示す情報です。
結論から言うと、「主方向にエッジが引かれると綺麗」です。
法線の局所性
もはや誰でも知っている概念である「法線」ですが、意味としてはまぁ「面の向く方向」です。
ただ面の向く方向は「曲面上の一点」から定まるものではありません。一点の周辺のどの方向に面があるかから定まる情報です。
要は原点を通る曲面なんていくらでもあるということです。面の向く方向を決定するにはほんの少しでも周りの情報を拾う必要があるのです。
逆に、ほんの少しで十分であるとき、局所的な性質 (local property) と言えます。
.
で、局所的な性質を拾うための計算機構が微分です。実際、法線は「曲面を表す関数の微分」を用いて定義されます。
要は例えば「ある一点からちょっと動いたときに、面からどれくらい離れるか」を全方向に調べればどっちが法線かわかるということ。
さらに言えば、空間の場合はX,Y,Z軸それぞれにほんの少し動いたときの情報だけで全方向の情報が手に入るということも言えます (線形近似としての微分)。
曲面の定義方法によって状況は変わります。面上を動ける (グラフとしての表示) 場合は2次元で微小差分が取れます。
なんであれ法線はそういう存在です。この文章は法線の説明というよりも局所性の説明のために書かれました。
曲率
曲面の曲がり具合について考えたいわけですが、まぁ、「曲がり具合」というのもまた局所的な性質なのです。
即ち法線の微分によって定義されます。(ここに行間は無いですよ)
二階微分ってことは放物線?みたいなことを思うのはそんなに間違いでもありません。
法線は曲面の各点に定義されているので、その曲面上をほんの少し動いてみて法線がどう変化していくかを見ます。
ゆるやかな曲面ではあまり変化しません。鋭いエッジみたいな部分では法線方向は激しく変化し、その変化の大きさはまさに反射のハイライトの鋭さに近いものになります。
右の方が曲率が大きい感じがするわけです。
さて、ただ、見ての通り、法線の変化というのは「ほんの少し動いてみる向き」に依存します。ハイライトが縦に伸びていることからわかるように、右のモデルはZ軸方向に動いてみても法線方向は変化しません。そうでない向き (場所によって変わるので言い表しにくいですが、Z軸と直交する方向は一意に定まりますね) に移動する際には確かに法線は鋭く変化しています。
つまり曲率というのは0.2とか1とか定まるスカラー量 (0次元量) だけでは表せないということです (テンソルです)。
しかし!基本的に微分で出来ている以上、世界は線形に出来ています。
つまり「どの方向に動くとどれくらい激しく法線が変化するか」というのは、これまた全方向調べる必要がないということなのです。全軸方向で十分なのが線形の世界です。(第二基本形式の話をしています)
ただし、これはこれでまだ使いやすくはありません。
主曲率と主方向
そんな中、実はいい感じの軸のとり方があることが知られています。つまり「曲がっている方向」という概念は実在するのです。
それが主方向というやつで、まぁ、一番それっぽい向きです。これは方向と言えど「面上の座標軸の取り方」を示すものなので、正確には2方向出てきます (直交します)。十字みたいなイメージですね。
それっぽいですよね。
球だとどの向きでもいい感じです。円筒はお分かりの通り、回転軸方向とそれ以外を取ってあげます (主方向は各点に定まるものです)。どんな曲面でも (まともなら) 主方向が取れます。
そして主方向に曲面がどれだけ曲がっているかを表すのが主曲率で、主方向が2個あるので主曲率も2個あります。
円筒の場合は「回転軸方向には曲率 」「回転軸じゃない方向には曲率 」になります。めちゃくちゃ納得しますね。
局所情報をつなぐ
これまでの話で「曲面上の各点には曲がっている方向が存在する」ということがわかりました。
この向きは最も曲面としての特徴を表すものなので、これを軸の1つとしてQuadMesh (四角形グリッドっぽいの) を生成すると「綺麗な曲面」になる気がします。実際なります。
しかし、それを大域的に出来るとは限りません。今まで話していたことは全て局所的な話で、近くの頂点とどう繋げるかについては考えていないのです。
例えばただの平面では主方向はどこでもいいので、それぞれで適当に決め打ちしてしまうとぐちゃぐちゃなメッシュになっちゃいそうです。
端から順番にやっていくというのも手で、平面の場合はそれがうまくいくんですが球面の場合にうまく行かないのは御存知の通りです。
QuadMeshには本質的に任意の曲面を表現する能力がありません。ぺたぺた張り合わせるしかなくて、その境界で狂いを吸収するイメージだと思います。
そのあたりがリトポの大変さだと思うわけですが。まぁ逆に言えばこの辺が指針になるのかなとは思っています。あんまりやったことないけど。
0803
で。
一般の曲面は大変なんですが、ある種の救いがある曲面があります。可展面です。要は伸縮しない布、です。
これは曲率の言葉で言うと「主曲率の片方が0」という意味で、つまり「一方向に関しては真っ直ぐ」ということ。
平面や円筒面はもちろん、円錐面も可展面です。みんなしってますね。
この条件はめちゃくちゃ強くて、みなさんも紙をくるくる曲げてみるとわかりますが、あんまり出来ることがありません。
制約が強いということは、それを生かして出来ることが多いということです。
筋としては単純で、可展面のポリ割りは主曲率が0の方向にエッジを引いてあげればいいのです。必ず伸ばせるので。
その結果がこれというわけ。
これがやりたかっただけシリーズ pic.twitter.com/evyCFIL168
— phi16 (@phi16_) 2021年8月1日
この辺を見てやろうと思ったような覚えがある。
まぁ作り方は逆で、長いリボンみたいな平面をぺたぺた端の方から折っていく感じです。折る角度の指定は2次元あって「折り線の角度」と「傾ける角度」を指定していきます。
なかなかproceduralじゃないとできないポリ割りだと思います。「可展面である」というルールだけで生成されたメッシュなのだけどなんだか存在感がありますよね。
もっと面白い使い方があるんじゃないかなぁと思ってはいたんですが、結局何か思いつくことはなくとりあえずワールドに置いてみたのが0803でした。
まぁ言ったように可展面自体はそんなに表現力を持っていないので、別の何かを持ってこなきゃいけなそうなんですね。そうだね。
それでもなんやかんや気に入ってくれる方がちょこちょこいらしたので良かったです。
ポリ割りだけでもなんだかまだ行けそうな気は結構します。
おわり。