カメラを制御したいけど、どういう数学を使えばいいのか分からない。
プレイヤーを追従させたい、滑らかに移動させたい、回転させたい。
でも、計算方法が複雑で理解できない。
そんな悩みを抱えていませんか。
カメラ制御には、ベクトル・行列・座標変換などの数学が欠かせません。
これらの数学を理解すれば、様々なタイプのカメラ制御を実装できます。
この記事では、カメラ制御に必要な数学を、Unity実装例とともに解説します。
カメラ制御で使う数学とは何か(ゲーム制作目線)

カメラ制御で使う数学には、主に3つの要素があります。
ベクトルは、方向と距離を表す数学的な表現です。
カメラの位置、移動方向、向きなどを表現するために使われます。
行列は、座標変換や回転を表現するために使われます。
カメラのビュー行列やプロジェクション行列は、3D空間を画面に描画するために必要です。
座標変換は、ワールド座標、ローカル座標、スクリーン座標などを相互に変換する処理です。
カメラ制御では、これらの座標系を適切に変換することが重要です。
Unityでは、TransformクラスやVector3、Quaternionなどのクラスが用意されており、これらの数学的な処理を簡単に実行できます。
カメラ制御の基本要素
カメラ制御に必要な要素には、位置、回転、補間があります。
位置の計算では、ベクトルの加算や減算が使われます。
回転の計算では、クォータニオンやオイラー角が使われます。
補間では、LerpやSlerpなどの補間関数が使われます。
ゲームでの具体的な使い道

カメラ制御で使う数学が、ゲームでどう活用されているかを確認してみましょう。
FPSカメラの回転
FPSゲームで、マウス入力に応じてカメラを回転させる時、クォータニオンやオイラー角を使います。
マウスの移動量を角度に変換し、それをクォータニオンで回転として適用します。
この場面では、回転の計算と座標変換が重要です。
TPSカメラの追従
TPSゲームで、カメラがプレイヤーを追従する時、ベクトル計算が使われます。
プレイヤーの位置から、カメラの目標位置を計算し、ベクトルの補間で滑らかに移動させます。
この場面では、位置の計算と補間が重要です。
カメラの視点切り替え
イベントシーンで、カメラが特定の位置へ移動し、特定の方向を向く時、位置と回転の補間が使われます。
目標位置と目標回転を設定し、LerpやSlerpで滑らかに補間します。
この場面では、補間と座標変換が重要です。
カメラの衝突回避
カメラが壁や障害物にめり込まないようにする時、レイキャストや当たり判定が使われます。
カメラからプレイヤーへの方向にレイを飛ばし、衝突を検出して位置を調整します。
この場面では、ベクトル計算と当たり判定が重要です。
- ベクトル(位置、方向、距離の計算)
- クォータニオン(回転の計算)
- 補間(Lerp、Slerp)
- 座標変換(ワールド座標、ローカル座標、スクリーン座標)
- 当たり判定(レイキャスト、コライダー)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

カメラ制御の数学は、「位置・回転・補間の計算」という考え方で理解できますね。
位置の計算
カメラの位置を計算する時、ベクトルの加算や減算が使われます。
例えば、プレイヤーの位置から、カメラの目標位置を計算する時、プレイヤーの位置にオフセット(相対的な位置)を足します。
カメラの位置 = プレイヤーの位置 + オフセット
回転の計算
カメラの回転を計算する時、方向ベクトルからクォータニオンを生成します。
カメラからターゲットへの方向ベクトルを計算し、それをQuaternion.LookRotationで回転に変換します。
カメラの回転 = Quaternion.LookRotation(方向ベクトル)
補間の計算
カメラを滑らかに移動させる時、位置と回転を補間します。
現在の位置から目標の位置へ、現在の回転から目標の回転へ、LerpやSlerpで補間します。
位置の補間にはLerp、回転の補間にはSlerpが使われることが多いです。
座標変換
カメラ制御では、様々な座標系を変換する必要があります。
スクリーン座標からワールド座標への変換、ワールド座標からスクリーン座標への変換などです。
Unityでは、Camera.ScreenToWorldPointやCamera.WorldToScreenPointなどの関数が用意されています。
- カメラ制御には、ベクトル、行列、座標変換などの数学が必要
- 位置の計算にはベクトルの加算・減算、回転の計算にはクォータニオンが使われる
- 補間にはLerp(位置)やSlerp(回転)が使われる
- 座標変換を理解すれば、様々なカメラ制御が可能になる
Unityで実装する際の注意点(代表例)

Unityでカメラ制御を実装する場合の注意点を見ていきましょう。
基本的な追従カメラ
プレイヤーを追従する基本的なカメラの実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public class FollowCamera : MonoBehaviour { public Transform target; public Vector3 offset = new Vector3(0, 5, -10); public float followSpeed = 2f; void Update() { if (target == null) return; // 目標の位置を計算(ベクトルの加算) Vector3 targetPosition = target.position + offset; // 位置を補間(Lerp) transform.position = Vector3.Lerp( transform.position, targetPosition, Time.deltaTime * followSpeed ); // ターゲットの方向を向く(クォータニオン) Vector3 direction = (target.position - transform.position).normalized; Quaternion targetRotation = Quaternion.LookRotation(direction); // 回転を補間(Slerp) transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * followSpeed ); } } |
このコードでは、ベクトル計算、補間、クォータニオンを使った基本的な追従カメラを実装しています。
FPSカメラの回転
FPSカメラの回転を実装する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class FPSCamera : MonoBehaviour { public float mouseSensitivity = 2.0f; public float verticalRotationLimit = 80f; float verticalRotation = 0f; float horizontalRotation = 0f; void Update() { // マウスの移動量を取得 float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity; // 回転角度を更新(角度の計算) verticalRotation -= mouseY; verticalRotation = Mathf.Clamp(verticalRotation, -verticalRotationLimit, verticalRotationLimit); horizontalRotation += mouseX; // クォータニオンで回転を適用 transform.rotation = Quaternion.Euler(verticalRotation, horizontalRotation, 0); } } |
このコードでは、マウスの移動量から回転角度を計算し、クォータニオンで回転を適用しています。
座標変換の例
スクリーン座標とワールド座標を相互に変換する例です。
|
1 2 3 4 5 6 7 8 9 |
// スクリーン座標からワールド座標へ変換 Vector3 screenPosition = Input.mousePosition; screenPosition.z = 10f; // カメラからの距離 Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition); // ワールド座標からスクリーン座標へ変換 Vector3 worldPos = transform.position; Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos); |
このコードでは、座標変換を実行しています。
カメラの衝突回避
カメラが壁にめり込まないようにする実装です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class CameraCollision : MonoBehaviour { public Transform target; public float minDistance = 2f; public float maxDistance = 10f; public LayerMask obstacleLayer; void Update() { if (target == null) return; // カメラからターゲットへの方向ベクトル Vector3 direction = (target.position - transform.position).normalized; float distance = Vector3.Distance(target.position, transform.position); // レイキャストで衝突を検出 RaycastHit hit; if (Physics.Raycast(target.position, -direction, out hit, maxDistance, obstacleLayer)) { // 衝突点から少し手前にカメラを配置 transform.position = hit.point + direction * minDistance; } else { // 通常の位置 transform.position = target.position - direction * maxDistance; } } } |
このコードでは、レイキャストを使ってカメラの衝突を回避しています。

まとめ

この記事では、カメラ制御に必要な数学について見てきました。
重要なポイントをおさらいします。
- カメラ制御には、ベクトル、行列、座標変換などの数学が必要
- 位置の計算にはベクトルの加算・減算、回転の計算にはクォータニオンが使われる
- 補間にはLerp(位置)やSlerp(回転)が使われ、滑らかな動きを実現する
- 座標変換を理解すれば、スクリーン座標とワールド座標を相互に変換できる
- UnityのTransform、Vector3、Quaternionなどのクラスを使えば、簡単に実装できる
カメラ制御は、ゲーム開発で重要な要素です。
ベクトル、行列、座標変換などの数学を理解すれば、様々なタイプのカメラ制御を実装できます。
まずは、基本的な追従カメラから始めて、徐々に複雑な機能を追加していきましょう。
実際に試してみることで、カメラ制御の数学を実感できるはずです。
数学的な理論だけでなく、実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、ベクトルと行列を実装とセットで学べるUnity入門の森・永久会員講座への導線を用意しています。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント