Imaginantia

思ったことを書きます

表現のための数学 #5

続き

3Dモデルのお話。

見えるものの表現

まず目的を「見えるものを表現する」ことである、としよう。ここでの「もの」は、現実世界にある3次元物体である (人体とか)。 表現するというのは、ある意味で「式で表す」ということであるし、「書き下す」ということでもある。

色を無視して「ものの形状」という気持ちになれば、次の扱いを思いつく。

ものとは、A\colon\mathbb{R}^3 \to \mathbf{2} のことである。

ここで \mathbf{2} とは 01 のどちらかしかない空間のことである。丁度2通りなので \mathbf{2}。 これはものを \mathbb{R}^3 に埋め込んだと考えたときに「在る」部分を表すことになる。A(p)=1 のとき、p には「在る」。

例えばこれは球を簡単に表現できる。

$$A(p) = \begin{cases}1&(\lVert p\rVert \le 1)\\0&(\mathrm{otherwise})\end{cases}$$

さて、とはいえこのままでは「不自然な物体」を作れてしまう。至る所で「あるとない」が混ざっているものとか。そんなのは「もの」ではない。だからこの表現はおかしい。

これは感情論である。とはいえ (いくらかの性質を満たさない、という意味で)「扱いにくい物体」が存在するのは確かだが。

1つの方向性として、「空間のつながりを重視する」というものがある。今回は \mathbf{2} という最初から「離れた」(離散的, Discrete) な空間だったが、対象を \mathbb{R} などの「つながった」空間にするのである。

空間 \mathbf{2} は離散的である。何故なら 0 から「だんだんと」1 に近づく方法が存在しないから。空間にひもを引けないから。

考えられるものの定義は次である。

ものとは、A\colon\mathbb{R}^3 \to \mathbb{R} のことである。ものの在る領域は \{p\colon\mathbb{R}^3 \mid A(p)\le 0\}である。

ここで A連続写像である。また正負の向きは本質的ではない。同相だから。

この表現では「不自然な物体」は最初ほど多くは無い。そして球などの図形をこの表現にするのも難しくはない。 だが、視点という気持ちを考えるとこの表現は些か厄介である。 見えるか見えないか、がわからないのである。

3次元上の点としては良く振る舞うが、視界という2次元の形式に変換するのがなかなか自明ではない。

視点 0、視線 v としたとき、「ある a\in(0,\infty] が存在して A(av) \le 0」なら「v 方向に見える」。a の範囲だけ存在を調べなきゃいけない。

特にコンピュータで扱おうとしたとき、「無限に点を調べなきゃいけない」のは致命的である。そしてそれ以上にコンピュータは「連続」を扱いづらい。だから実用的な表現のためにはまた別のことを考えなければならない。


そこで「近似」という考え方を使う。例えば曲線を「つながった線分たち」として扱う。直観的には「全ての曲線はある程度小さな線分たちで十分近似できる」ことがわかる。

近似というのは、「何らかの目的を達成することができる程度に情報を落とすこと/落としたもの」である。だから目的が無いと近似に意味はない。今回の目的は視認である。だから「直観的に十分」というのは論理的な言明である。

f:id:phi16_ind:20181010232516p:plain

その類似として、ものを「つながった単体たち」として扱うことにする。ここで単体 (Simplex) というのは、n次元の空間を占める最も単純な図形のことである。点、線分、三角形、三角錐

ここで最も単純というのは先程の A\colon\mathbb{R}^n\to\mathbb{R} の形式で表現したときに A が線形結合の \max で表現できること。つまり半平面たちの共通部分であること。単純っぽい。

「まともにつながった単体たち」のことを単体複体 (Simplical complex) と呼ぶ。で、まともな物体は単体複体として十分表現できる ことが知られている。

ここで前者の『まともなつながり』はくっついている単体の境界がまた単体であること。後者の『まとも』はなめらかであること。『十分表現できる』は空間構造を壊さずに近似を構成できること。

というわけで、私達はものを3次元の単体複体による近似で表現することにする。0次元の単体が頂点 (Vertex)、1次元の単体が (Edge)、2次元の単体が (Face) を表現する。 3次元単体はあって損はないが、結局「見えるもの」は3次元単体の表面だけである。だから視点を考慮したとき、データとして必要であるわけではない。

これを3Dモデルと呼ぶ。

「モデル」という語は、何らかの現象に対して「それを十分良く表現している物質的概念」に使われる。多分「3Dモデル」という語は本質がちょっと抜けていて、「3次元ものモデル」のことだと思う。

表面上の座標系

ものを単体複体として表現したのは良いが、これには表面の概念が抜けている。つながった面たちはそれ相応につながっていたはずなのである。

元来、ものの表面は局所的に2次元であった。そして物体表面に描かれた「絵」は、その局所的2次元平面の上に描かれていると考えることができる。

局所的 (Locally) っていうのはある点の周りだけを見れば、という意味。

f:id:phi16_ind:20181011000356p:plain

だから物体上の絵を考えるときは表面における局所2次元平面の概念がほしい。そこで使えるのが多様体論の概念である。 物体表面のある一部 U\mathbb{R}^2 の一部と同相であるとき、その同相写像局所座標系 (Local coordinate) と呼ぶ。このような同相が物体表面の全点に対して存在するようにできるとき、この物体表面は多様体 (Manifold) と呼ばれる。

つまり3Dモデルの表面を成す面たちに対して、\mathbb{R}^2 の一部との同相を与えればいい。となりあった面たちを同時に写す同相を与えれば、そのつながった面たちをまとめて1つの局所2次元平面として扱うことができるようになる。 そして十分細かい単体を使うことを想定すれば、その同相は区分線形 (Piecewise linear) で十分である。面上の線形な関数を表現するには頂点についての値がわかれば十分。よってこの意味で近似された局所座標系はある面に属す頂点に対して \mathbb{R}^2 の点を付与することに他ならない。

これをUV座標と呼ぶ。

本来の多様体においては、「一部」というのは開集合である必要がある。これはつまり境界が無いということであり、それを使って物体表面を覆うには必ず座標系が交わる必要が出てくる。複数の座標系に乗っかる点が存在しなくてはならない。 だから3Dモデルを多様体として扱うにはUV座標系は1つでは足りない。恐らく2つでも足りない。でも現実では境界の扱いを人間が気をつけることでまかなっている。多くの場合実用上問題ないからこれで良いのだろう。

UV座標に対して色を与える写像テクスチャと呼ぶ。

表面の向き

面がどこを向いているか、というのは様々な目的において重要である。光を当てたときのその影響度は面の向きで決まるし、空間上の点が「近くの面の向き」を知ることができればその面に向かって進んでいくこともできる (最急降下法)。

面の向きを法線 (Normal) と呼ぶ。ちゃんと言うと、物体表面上のある点に対し、その点が「局所移動できる方向」と常に直交する向きのことを法線と呼ぶ。

f:id:phi16_ind:20181011004452p:plain

法線には2通りの任意性がある。「中身のあるもの」なら空間全体に対して矛盾なく1つの法線方向を定義できる (向き付き, Oriented) が、そうでない場合は誰かが教えてあげるしかない。

さて、法線は受け継ぐべきである。何故なら単体にしたところで本来の面の向きは単体の向きではなく理想的な曲面上の法線であるはずだからである。だから実際の3Dモデルでは頂点には法線の情報が載っている。面上の法線はまた同様に線形近似することとなっている。

Normalという語は「長さ1」という意味でもあった。実際法線の長さは1であれば十分である。しかし「長さ1の点と長さ1の点を結んだ線分上の点が長さ1である」保証は無いし、ほとんど確実に(数学用語)それは偽である。だから法線を1に正規化 (Normalize) するわけだが、これによる法線補間を用いた (3Dモデルの) ライティングがPhong Shadingと呼ばれるものになる。

ところで、人間にとっては「物体形状よりもその表面形状のほうが重要」である。物体が多少荒くとも、「見えるのは面」だから面上の色が正しければそれらしく見える。そのためには面上の各点における法線を正しく持つ必要がでてくる。 そのために考え出されたのが、「UV座標から本来の法線方向を与える写像\mathbb{R}^2\to S^2 を与えることである。面上にはUV座標が割り当てられているので、それに対応して S^2 の点を与えることは本来の法線を与えることに一致する。 そしてもう一つ、法線方向を直接与えるのではなく相対方向によって与えることにする。例えばモデルがアニメーションするケースでは法線方向は変化してしまうから、相対的法線方向を与えるのが望ましい。(0,0,1) が「通常の面の向き」を表現するように S^2 を解釈しなおすのである。

だが、実はこれだけでは不十分である。何故ならX軸とY軸には S^1 分の自由度があるため、面法線とこの S^2 だけから一意的に本来の法線を計算することはできない。そこで接線方向 (Tangent vector) をまた頂点に付与することで、正しく復元できるようにする。

これによって相対的法線を与えればうまくいくようになったわけだが、この値は S^2 の点である。テクスチャとして保持することを考えると色の空間に変換しなければならない。幸い S^2 は3次元で、一般的に使われる色空間RGBも3次元なので、簡単に埋め込みが構成できる。

$$S^2 \longrightarrow [-1,1]^3 \longrightarrow [0,1]^3$$

  • \mathbb{R}^3 の部分 [-1,1]^3 に埋め込んで
  • いつもの区間間の同型を各次元に使って渡す

結果として \mathbb{R}^2 \to [0,1]^3 ができる。UV座標は有限なので (頂点数が有限だから)、\mathbb{R}^2 の代わりに [0,1]^2 で十分である (各次元の最小/最大を0/1に写す)。この [0,1]^2 \to [0,1]^3 を画像として記録したものが、法線マップ となる。