透視投影とカメラ視点の準備
前回は、2Dキャンバスに3Dを表現するための基本――座標系や透視投影の原理を学びました。
今回は、Desmosグラフ計算機を使って「3Dらしさ」を描画する第一歩として、空間の投影準備とカメラ視点の考え方を扱います。
この記事は、第105話 【グラフ計算機/Desmos】 をテキスト化したものです。
🎯 目次
- 描画用の座標系を定めなおす
- カメラの視点と目線の定義
- 視点からの透視投影
- 次回に向けて
1. 描画用の座標系を定めなおす
右手系は右手系の中でも、次のように軸の向きを設定します。
x軸
:左右方向(従来通り)
z軸
:上下方向(数学的に縦軸として自然)
y軸
:奥行き方向(ZではなくYが奥に向かう)

これは、xz平面
を基礎平面として扱うための工夫です。zが上、xが横、yが奥行きになります。
カメラが y軸方向(奥)に初めは向いていると仮定し、(x,y,z) を 2Dに投影する数式は以下の通りです:
(x′,y′)=(yx,yz)
(x,y,z)は3D空間上の点、(x′,y′) はDesmosグラフ計算機上での投影位置です。遠く(yが大きい)にあるほど、小さく描かれます。
2. カメラの視点と目線の定義
3D空間を見渡すためには、人間の目に相当する視点(カメラ位置)が必要です。カメラには以下の2つの情報が重要です。
- 位置ベクトル:カメラの位置 Pos=(Px,Py,Pz)
- 回転(方向):カメラの向いている方向(オイラー角) Rot=(Rx,Ry,Rz)
オイラー角では、x,y,z 軸を中心とした回転です。
- Rx:ピッチ(上下回転)
- Ry:ヨー(左右回転)
- Rz:ロール(傾き)
3. 視点からの透視投影
カメラの位置を原点として3D空間を眺めるのが楽である。
Step1: カメラの位置とオブジェクト
そのため、「カメラを動かすこと」と「オブジェクトを動かすこと」の見かけの位置を下記のデモで観察すると、カメラを動かした方向と逆方向に動かせば見かけは同じである。
そのため、オブジェクトの位置を obj=(x,y,z) とするならば、見かけの位置は obj−Cam といえる。
Step2: カメラの向きとオブジェクト
同様に、カメラの回転(向き)も少しトリッキーではあるが、カメラの向いた方向と逆方向に、カメラを中心に逆方向に動かせば見かけは同じである。
計算は大変であるが、x,y,z軸の3軸すべてに回転を行う。
回転前の空間上の点 p=(px,py,pz) を、原点 (0,0,0) 中心に回転 r=(rx,ry,rz) させる関数 rot を定義する。
回転後の点 p′=(x2,y2,z2) は次のように導ける。
(x1,y1)(z1,x2)(y2,z2)p′=(pxcosrz+pysinrz,−pxsinrz+pycosrz)=(pzcosry+x1sinry,−pzsinry+x1cosry)=(y1cosrx+z1sinrx,−y1sinrx+z1cosrx)=(x2,y2,z2)=rot(p,r)
以下は一つの関数としてまとめたものです。コピペして活用してください。
r_{ot}\left(p,r\right)=\left(\left(p.y\sin\left(r.z\right)+p.x\cos\left(r.z\right)\right)\cos\left(r.y\right)-p.z\sin\left(r.y\right),\left(\left(p.y\sin\left(r.z\right)+p.x\cos\left(r.z\right)\right)\sin\left(r.y\right)+p.z\cos\left(r.y\right)\right)\sin\left(r.x\right)+\left(p.y\cos\left(r.z\right)-p.x\sin\left(r.z\right)\right)\cos\left(r.x\right),\left(\left(p.y\sin\left(r.z\right)+p.x\cos\left(r.z\right)\right)\sin\left(r.y\right)+p.z\cos\left(r.y\right)\right)\cos\left(r.x\right)-\left(p.y\cos\left(r.z\right)-p.x\sin\left(r.z\right)\right)\sin\left(r.x\right)\right)
Step3: カメラ視点での透視図法
カメラの位置と向きをそれぞれ数式に落とし込むことができました。これらを合わせて、カメラの視点から見る3D空間上の点 p をグラフ計算機上の点を返す関数 View は、
View(p)map(p)parse(y)=map(rot(p−Pos,Rot))=(p.x,p.z)⋅f⋅parse(p.y)=y1(y>0)
と表すことができる。3D to 2Dの描画は透視投影を用いています。
parse 関数の (y>0) については、カメラ視点の裏側を描画しないために、制限をかけています。
4. 実践:グリッドを表示する
View 関数を用い、xy 平面にグリッドを表示します。
View((t,5[−5…5],0)) (−1≤t≤1)View((5[−5…5],t,0))(−1≤t≤1)
カメラの移動はまだ実装していない(今後の記事に登場する)ので、雑に操作ができるデモを下に用意しました。
おわりに
今回は、カメラ(視点)と透視投影の原理を導入し、Desmos上で立体的に見える表現の土台を整えました。カメラの位置や向きを数式で操作することで、2D平面上でも3D空間を見渡すような描画が可能になります。
次回はこの仕組みを使って、木枠のようなワイヤーフレームの四角形(直方体)を3D空間に設置する方法を扱います。線と点を使って空間上に構造を組み立てることで、より実在感のある視覚表現に一歩近づきます。