技術 約7分で読めます

円を斜めから見た楕円と作図用の楕円は同じではない

いけさん目次

Xで「円はどの透視図から見ても同じ楕円に見える」みたいな話を見かけた。
火元は追えていないし、たぶん作画文脈で何かが省略されている。
ただ、数学の話として見ると、ここには少なくとも3つの別問題が混ざっている。

  • 空間上の円をカメラで見ると、画像上では何になるか
  • 紙の上に直接描いた楕円と、円の透視投影として出る楕円は同じか
  • 楕円の長軸・短軸・中心は、元の円の中心や直径とどう対応するか

カメラアングルをAI画像生成で試した記事でも、アングル指定はかなり雑に効く。
今回の話は画像生成ではなく、もっと手前の幾何だ。
「斜めから見た円は楕円になる」はだいたい合っているが、「だから楕円として普通に扱えばいい」までは飛びすぎている。

平行投影だと話はかなり単純

遠近感をいったん捨てる。
カメラが無限遠にあって、平行な光線で物体を紙に落とすと考える。
これは 平行投影、または斜め方向を含む アフィン変換 の話になる。

この場合、円は楕円に写る。
しかも中心は中心に写る。
直径の中点は、投影後も中点のままだ。

平行投影では円の中心が楕円の中心へ写る 左に円、右に横長の楕円。どちらも中心を通る線分の中点が中心にある 楕円
平行投影では、中心・平行線・中点が保たれる。円の見え方を「つぶれた楕円」として扱いやすい。

行列で書くと、2次元上の円

x2+y2=r2x^2 + y^2 = r^2

に対して、平面上の線形変換

u=Ax\mathbf{u} = A\mathbf{x}

をかけているだけだ。
AA が縦方向を縮めるなら、円は楕円になる。
この範囲なら「円を斜めから見ると楕円」はかなり素直な説明になる。

作画の「楕円を箱の中に入れる」「円柱の断面を楕円で描く」という説明の多くは、この平行投影に近い直感で動いている。
アイソメや弱い遠近感の図なら、これでかなり足りる。

透視投影では中心と中点が保たれない

問題は透視投影だ。
カメラのピンホールモデルや一点・二点透視では、手前のものが大きく、奥のものが小さくなる。
これはアフィン変換ではなく 射影変換 だ。

射影変換でも、円は基本的に楕円・放物線・双曲線のどれかに写る。
普通のカメラで有限の円盤を見ている範囲では、画像上の輪郭はだいたい楕円になる。
ただし、射影変換は中点を保たない。
長さも角度も保たない。
「元の円の中心をカメラで写した点」と「画像上の楕円の中心」は、一般には一致しない。

ここが作画上の違和感の火種になる。

透視投影では円の中心の像と楕円の中心がずれる 右に正方形と内接円、左にその透視投影。対角線の交点と楕円の中心がずれている 円の中心の像 楕円の中心 投影像 透視投影 中心 元の円
右の正方形と内接円を透視投影すると左の台形と楕円になる。対角線の交点=円の中心の像(赤)と、楕円の幾何中心(青)は一致しない。

なぜずれるか。
透視投影では、奥側の半分が手前側より縮む。
元の円では中心から手前端までと奥端までの距離が同じでも、画像上では同じ長さに見えない。
だから、円の中心の像は「見えている楕円のちょうど真ん中」に来ない。

ここを無視して、画像上の楕円の長軸に何かを置くと、空間上の円盤の中心に置いたつもりなのにズレて見える。
ユーザーの「実際このラインにものを置いて斜めに見ると真ん中に見えない」という違和感は、まさにこの話だと思う。

楕円の長軸は画像上の最長線でしかない

楕円を2次元図形として見るなら、長軸は明確だ。
楕円の中心を通る弦のうち一番長いものが長軸。
これは横長の楕円なら横方向になる。

ただし、それは「画像上の楕円という2D図形」の話だ。
元の円盤のどの直径がそこへ写ったのか、元の円の中心がその線上のどこに来るのか、という3D側の意味とは別である。

透視投影では、次の性質だけが強く残る。

保たれるもの保たれないもの
点が点に写る距離
直線が直線に写る角度
線上にある関係中点
交点円の中心

「円の直径」は、投影後も何らかの直線にはなる。
でも、その線分の真ん中が画像上の楕円中心になるとは限らない。
逆に、画像上の楕円の長軸を逆投影すると、元の円盤上では中心を通らない弦になることもある。

このへんが「楕円の一番長いラインはどこかと言えば横軸じゃん」と「そこに置くと真ん中に見えないんだよね」が同時に成り立つ理由だ。
前者は2D楕円の測度の話。
後者は3D円盤の中心を透視投影した話。
同じ「真ん中」という言葉で、別の中心を指している。

円の透視図としての楕円と、ただの楕円

紙の上に適当に楕円を描けば、それはもちろん楕円だ。
でも「ある円を、あるカメラ位置から見た像」としての楕円には、追加の制約がある。

たとえば円柱の口を一点透視で描くなら、楕円単体ではなく、円が乗っている平面、消失点、接する四角形、奥行き方向がセットになる。
楕円だけを切り出して「長軸はここ」と言っても、元の円盤の中心や円柱の軸方向は復元できない。

作画でよくやる「透視図の四角形の中に円を入れる」手順は、このためにある。
円だけを楕円として描くのではなく、まず円を含む正方形を透視投影する。
その四角形の辺への接点や対角線から、円の空間的な位置関係を運ぶ。

ただし、ここでも注意が要る。
透視投影された正方形の対角線交点は、元の正方形の中心の像になる。
一方で、そこは画像上の楕円の中心とは限らない。
作画で中心線を引くとき、「円盤の中心の像」を取っているのか、「楕円という2D図形の中心」を取っているのかを混ぜるとおかしくなる。

式で見ると分母が犯人

透視投影を一番単純化して書くと、3Dの点 (X,Y,Z)(X, Y, Z) が画像上の点 (x,y)(x, y) に写る式はこうなる。

x=fXZ,y=fYZx = f \frac{X}{Z}, \quad y = f \frac{Y}{Z}

ff は焦点距離、ZZ はカメラからの奥行き。
平行投影なら x=Xx = X, y=Yy = Y みたいに分母がない。
透視投影では ZZ で割るので、同じ長さでも奥にあるほど小さくなる。

円盤がカメラに対して傾いていると、円周上の点ごとに ZZ が少しずつ違う。
手前側は小さい ZZ で割られ、奥側は大きい ZZ で割られる。
この分母の違いが、中点のズレを作る。

射影幾何の言葉では、透視投影は同次座標の線形変換として書ける。

[xyw]=H[XY1],x=xw,y=yw\begin{bmatrix} x' \\ y' \\ w' \end{bmatrix} = H \begin{bmatrix} X \\ Y \\ 1 \end{bmatrix}, \quad x = \frac{x'}{w'}, \quad y = \frac{y'}{w'}

最後に ww' で割る。
この割り算があるせいで、中点や長さが保存されない。
逆に、直線や交点は保存されるので、透視図法では消失点・補助線・接線が強い道具になる。

微分の記事で等高線と勾配を図にしたときもそうだったが、図形の話は「何が保存されるか」を見ると混乱が減る。
透視投影では、ユークリッド幾何の長さ・角度・中心より、射影幾何の直線・交点・接線のほうが根っこにある。

広角と望遠で投影の「癖」が変わる

ここまではピンホールカメラの話だった。
実際の撮影では焦点距離が変わると、同じ円盤でも見え方が違ってくる。

広角レンズは画角が広く、被写体に近づいて撮ることが多い。
近いぶん、円盤の手前と奥で ZZ の差が相対的に大きくなる。
fX/Zf \cdot X / Z の分母が点ごとにばらつくので、楕円の中心と円の中心像のズレが目立つ。
集合写真の端で顔が引き延ばされるのは、この射影歪みそのものだ。

望遠レンズは逆で、遠くから切り取る。
被写体の各点で ZZ がほぼ揃うので、分母はほぼ定数だ。
平行投影に近い挙動で、中心のズレもほとんど出ない。
望遠で奥行きが潰れて見える圧縮効果の正体がこれだ。

作画の話に戻すと、「楕円で描いた円の中心がズレて見える」問題は画角が広いほど顕著で、望遠的な視点ではほとんど気にならない。

レンズ歪みとスマホのAI補正

もうひとつ、実際のレンズには光学的な歪みがある。
理想的な透視投影では直線は直線に写るが、実物のレンズだと画面端で直線が曲がる。

広角レンズに多いのが樽型歪み(barrel distortion)で、画面端が外に膨らむ。
望遠寄りで出やすいのが糸巻き型歪み(pincushion distortion)で、端が内側に引っ張られる。
この歪みがあると、空間上の円は画像上で楕円にすらならない。
射影変換の上にさらに非線形な歪みが乗って、輪郭がわずかに卵形になったりする。

カメラやRAW現像ソフトのレンズプロファイル補正は、この光学歪みを逆算して理想的な透視投影に戻す処理だ。
補正後は直線が直線に戻り、円の像も射影幾何の予測通りの楕円になる。
レンズ補正は射影変換を壊すのではなく、射影変換に近づけている。

最近のスマホはさらに踏み込む。
広角インカメラで自撮りすると顔の端が引き延ばされるが、あれは透視投影として正しい結果だ。
「顔が歪んで見える」のは光学エラーではなく、広角+近距離の数学的帰結にすぎない。
にもかかわらず、iPhoneやPixelのカメラアプリは顔領域を検出して射影歪みを補正する。
透視投影を部分的に平行投影方向へ戻しているようなもので、幾何的には正しい射影を「見た目の自然さ」のために崩している。

参照