Three.js — Camera Frustum 視錐台の比較

PerspectiveCamera と OrthographicCamera の違いを図で理解する

PerspectiveCamera

遠近感あり
錐台(Truncated Pyramid)形状。
カメラに近いほど小さく、遠いほど大きな視野を持つ台形のクリッピング領域。 これにより、近くの物体は大きく、遠くは小さく見える自然な遠近感が生まれます。

コンストラクタ:
new THREE.PerspectiveCamera(
  fov, aspect, near, far
)

OrthographicCamera

平行投影
直方体(Box)形状。
近くても遠くても視野の幅は一定。平行な投影線により、 距離に関係なくオブジェクトのサイズが変わらない投影が得られます。

コンストラクタ:
new THREE.OrthographicCamera(
  left, right, top, bottom, near, far
)

実際の見え方の違い — 同一シーンを2つのカメラで描画

PerspectiveCamera
OrthographicCamera

// パラメータ比較

項目 PerspectiveCamera OrthographicCamera
視錐台の形状 錐台(四角錘を切った形) 直方体(箱型)
投影方式 透視投影(Perspective) 平行投影(Orthographic)
遠近感 あり(遠くは小さく見える) なし(距離によらず同サイズ)
主なパラメータ fov, aspect, near, far left, right, top, bottom, near, far
用途 3Dゲーム・VR・リアルなシーン 2Dゲーム・UI・設計図・等角図
fov の影響 視野角が広いほど魚眼レンズ的に fov パラメータなし(left/right/top/bottomで制御)
💡 選び方のポイント:
リアルな3Dシーンや没入感が必要なら PerspectiveCamera。 タワーディフェンスや2Dゲーム、建築CAD、UIオーバーレイなど「歪みのない正確な表示」が必要なら OrthographicCamera を選びましょう。

ピクセルパーフェクト描画 — カメラ別セットアップ

Web実装

① 共通:devicePixelRatio(DPR)の扱い

Retinaディスプレイなどでは、CSSピクセルと物理ピクセルが一致しません。 renderer.setPixelRatio() で物理ピクセルに合わせ、 setSize() にはCSSサイズを渡すのが基本です。


② PerspectiveCamera のピクセルパーフェクト

fov・distance・screenHeight の三角関係

PerspectiveCameraでは、オブジェクトのスクリーン上のピクセルサイズはカメラからの距離に依存します。 「ちょうど N px に映したい」場合、次の式で距離を逆算します。

// 高さ h のオブジェクトを screenH px に映す距離 dist = h * rendererH / (2 * Math.tan(fov * Math.PI / 360) * screenH); // リサイズ時は aspect を更新 function onResize() { camera.aspect = W / H; camera.updateProjectionMatrix(); renderer.setSize(W, H); }

⚠️ リサイズで aspect が変わると投影行列が変わるため updateProjectionMatrix() が必須です。


③ OrthographicCamera のピクセルパーフェクト

ワールド単位 ↔ スクリーンピクセルの直接対応

OrthographicCameraは 「1ワールド単位 = 1CSSピクセル」を直接指定できます。 left/right/top/bottom をキャンバスサイズに合わせると座標が1:1対応します。

// 1ワールド単位 = 1CSSピクセル const camera = new THREE.OrthographicCamera( -W/2, W/2, // left, right H/2, -H/2, // top, bottom ← Y軸反転に注意 0.1, 1000 ); // mesh.position.x = 200 → 画面中心から右200px // リサイズ時は left/right/top/bottom を更新 function onResize() { camera.left=-W/2; camera.right=W/2; camera.top=H/2; camera.bottom=-H/2; camera.updateProjectionMatrix(); renderer.setSize(W, H); }

✅ 距離に関係なくサイズが変わらないため UIオーバーレイ・2Dスプライト・ピクセルアート に最適。


④ リサイズ時の更新フロー比較

💡 ピクセルパーフェクト実装チェックリスト:
renderer.setPixelRatio(devicePixelRatio) — Retina対応
setSize(clientWidth, clientHeight) — CSSピクセルで渡す
✅ リサイズ後は必ず camera.updateProjectionMatrix()
Perspectivecamera.aspect を更新
Orthographicleft / right / top / bottom を更新
// 実装ガイド — 注意点・できること・難易度
① できること / できないこと

PerspectiveCamera

🎮
リアルな遠近感の表現遠くのオブジェクトが小さく見える自然な投影
✓ 得意
🌫
被写界深度・フォグ効果距離依存のポストプロセス効果と相性◎
✓ 可能 ✗ 困難
📐
ピクセル単位の正確な配置距離で見た目サイズが変わるため位置計算が複雑
△ 要計算 ✓ 容易
🪟
UIオーバーレイ・HUD3Dシーン上にピクセル固定のUIを乗せる
△ 工夫要 ✓ 得意
🗺
等角図・等尺図(アイソメトリック)サイズ歪みのない建築・CAD表示
✗ 不向き ✓ 得意
🎲
3Dゲーム・FPS視点没入感のある一人称・三人称カメラ
✓ 得意 ✗ 不向き
🔍
raycaster によるオブジェクト選択マウスピッキングの実装
✓ 標準的 ✓ 可能
🖼
シャドウマップの品質far値に依存した深度精度
△ 要調整 ✓ 安定
Persp / Ortho

OrthographicCamera

📏
スケール不変の描画どの距離でもオブジェクトの画面サイズが一定
✗ 不可 ✓ 得意
🎨
2Dスプライト・ピクセルアートドット絵・スプライトシートのガタつきなし描画
△ 困難 ✓ 完璧
🌀
VR・没入型3D体験自然な奥行き知覚が必要な体験
✓ 必須 ✗ 不可
🧩
タイルベースのゲーム(見下ろし)パズル・ストラテジー・タワーディフェンス
△ 可能 ✓ 最適
💡
リアルな光源・反射・シャドウPBR マテリアルによる物理ベースレンダリング
✓ 得意 ✓ 可能
📊
データビジュアライゼーション3Dグラフ・チャートの正確な比較表示
△ 歪みあり ✓ 正確
🎥
カットシーン・シネマティック演出映画的な FOV 演出・ドリーズーム効果
✓ 得意 ✗ 不可
ワールド↔スクリーン座標変換project() / unproject() の扱いやすさ
△ 要計算 ✓ 直感的
② 実装難易度
// 難易度レーティング(5段階)
基本セットアップカメラ生成・シーン接続
Persp
Ortho
★☆☆☆☆
★★☆☆☆
リサイズ対応ウィンドウサイズ変更への追従
Persp
Ortho
★☆☆☆☆
★★☆☆☆
ピクセルパーフェクト配置px単位でオブジェクトを正確に配置
Persp
Ortho
★★★★☆
★★☆☆☆
UIオーバーレイ実装3D上に固定UIを正確に重ねる
Persp
Ortho
★★★★☆
★★☆☆☆
マウスピッキング(Raycaster)クリック位置からオブジェクトを特定
Persp
Ortho
★★☆☆☆
★★☆☆☆
カメラアニメーションスムーズなカメラ移動・ズーム制御
Persp
Ortho
★★☆☆☆
★★★☆☆
シャドウ・ライティング調整near/far に依存した深度バッファ精度
Persp
Ortho
★★★☆☆
★★☆☆☆
③ 実装時の注意点(ハマりポイント)

PerspectiveCamera の注意点

near を 0 や極小値にしない
near = 0 にすると深度バッファの精度が壊滅。nearfar の比率(far/near)を 1000 以内に抑えるのが鉄則。
aspect を手動で更新し忘れる
リサイズ後に camera.aspect を更新せず updateProjectionMatrix() を呼ばないと、映像が縦横に引き伸ばされる。
💡
fov が大きすぎると魚眼レンズ歪み
60〜75° が自然な範囲。90° 超えると端のオブジェクトが大きく歪む。人間の自然な視野は約 60°。
💡
Zファイティング(チラつき)
near/far の比率が大きいほど深度値の精度が低下し、同一平面の2つのオブジェクトがチラつく。polygonOffset で対処。
OrbitControls の zoom は position を動かす
PerspectiveCameraのズームは camera.position の変更で実現。FOVアニメーションと混在させるとバグる原因に。

OrthographicCamera の注意点

リサイズ時に4つのパラメータすべてを更新
left / right / top / bottom を全部更新しないと縦横比が崩れる。aspect 1つで済む Perspective と違い忘れやすい。
OrbitControls の zoom が効かない設定
OrthographicCamera の zoom は camera.zoom プロパティで制御。enableZoom: true でも動作が Perspective と異なるため要確認。
💡
Y軸の向きに注意(top と bottom)
Three.js のY軸は上向きが正だが、top に正値・bottom に負値を渡す必要がある。CSS座標系(Y軸下向き)と逆なので混乱しやすい。
💡
distance が投影結果に影響しない落とし穴
オブジェクトが far 平面の外に出てもクリッピングされるだけで警告なし。意図せずオブジェクトが消えた場合は near / far の範囲を確認。
半ピクセルずれによるボケ(テクスチャ)
ピクセルアートなどの整数座標テクスチャを使う場合、position に 0.5 ずれがあるとバイリニアフィルタでボケる。Math.round() で座標を整数化すること。
④ ユースケース早見表
// どちらのカメラを選ぶか?
PerspectiveCamera OrthographicCamera どちらも可 / 組み合わせ推奨
🎮 FPS / TPSゲーム
没入感のある一人称・三人称視点
🚗 3D製品プレビュー
ECサイト・商品の360°ビューア
🌍 3D地図・地形
Mapbox/Cesiumライクな地球儀表示
🎬 WebGL映像演出
ドリーズーム・FOVアニメーション
🗺 タワーディフェンス
見下ろし型ストラテジーゲーム
🏗 建築・CAD表示
等角図・平面図の正確な表示
🎨 2Dピクセルアート
ドット絵・スプライト描画
📊 3Dグラフ・チャート
データの正確な比較・可視化
🪟 HUD / UIオーバーレイ
別レイヤーでOrthoを重ねる
✨ パーティクル演出
Perspで奥行き感、Orthoで均一配置
🔮 アイソメトリックRPG
Ortho推奨・疑似3D表現も可能
🖱 3Dエディタ・ツール
Perspで確認・Orthoで設計図