Unityで3Dオブジェクトを滑らかに回転させたい時、クォータニオンを直接補間すると、回転速度が一定にならないことがあります。
Lerp(線形補間)を使うと、距離が短い場合でも、回転の見た目が不自然になってしまうんです。
Slerp(Spherical Linear Interpolation:球面線形補間)を使えば、回転速度を一定に保ちながら、滑らかな回転補間が実現できます。
なぜSlerpが必要なのか、Lerpとどう違うのか、この記事で整理しましょう。
Slerpとは何か(ゲーム開発目線)

Slerpは、「Spherical Linear Interpolation」の略で、日本語では球面線形補間と呼ばれます。
クォータニオンを補間する際、球面上を最短経路で滑らかに移動させる技術です。
なぜ「球面」なのか。
これは、クォータニオンが4次元の単位球面上の点として表現されるためです。
クォータニオンの4つの値(x, y, z, w)は、x² + y² + z² + w² = 1という制約を持っています。
この単位球面上で、2つのクォータニオンを補間する際、直線的に補間すると球面から外れてしまう可能性があります。
Slerpは、球面上を保ちながら、最短経路で補間する方法なんです。
Unityでは、Quaternion.Slerpという関数が用意されています。
この関数を使えば、回転速度が一定の、滑らかな回転補間が簡単に実装できます。
LerpとSlerpの違い
Lerp(線形補間)とSlerpの違いを理解することが、使い分けのポイントです。
Lerpは、2つの値を直線的に補間します。
クォータニオンにLerpを使うと、補間の途中で単位ベクトルから外れることがあります。
その結果、回転速度が一定にならず、見た目が不自然になります。
一方、Slerpは、球面上を最短経路で補間するため、回転速度が一定になります。
具体的な例を見てみましょう。
プレイヤーキャラクターが、正面から真横(90度回転)に向きを変える時、Lerpを使うと、回転の最初と最後で速度が遅くなり、中間で速くなります。
Slerpを使えば、最初から最後まで、同じ速度で回転し続けます。
この違いは、回転角度が大きいほど顕著になりますね。
30度程度の小さい回転では、LerpとSlerpの違いはほとんど分かりません。
しかし、90度や180度の大きい回転では、Slerpの方が自然に見えますね。
Slerpがゲームで使われる場面

Slerpがゲーム開発でどう使われているか、具体的なシーンを確認してみましょう。
キャラクターの向き変更
プレイヤーキャラクターがマウスの方向を向く時、Slerpを使うと滑らかに回転します。
例えば、TPS(サードパーソンシューティング)ゲームで、カメラの方向にキャラクターを向ける場合です。
マウスを大きく動かすと、キャラクターは180度近く回転することがあります。
この時、Lerpを使うと、回転の途中で速度が速くなったり遅くなったりして、不自然に見えます。
Slerpを使えば、一定の速度で滑らかに回転するため、プレイヤーにとって違和感の少ない操作感になりますよ。
カメラの回転補間
カメラが視点を切り替える時も、Slerpが有効です。
例えば、ボス戦の開始時に、カメラがプレイヤーからボスに向けて回転するシーンです。
この時、カメラの回転にSlerpを使うことで、一定速度で滑らかに移動します。
Lerpを使うと、カメラの動きが加速したり減速したりして、見た目が不自然になります。
カメラの回転には、Slerpがほぼ必須と言えるでしょう。
オブジェクトの回転アニメーション
ドアや宝箱が開く時の回転アニメーションにも、Slerpが使われます。
例えば、宝箱の蓋が0度から90度まで回転する時、Slerpを使えば、一定速度で開くため、見た目が自然です。
Lerpを使うと、開き始めと閉じ終わりで速度が遅くなり、中間で速くなるため、不自然に見えます。
特に、回転角度が大きい(90度以上)場合、この差は顕著になりますよ。
武器の向き調整
FPSゲームで、武器が敵を向く時にも、Slerpが役立ちます。
武器の向きを、プレイヤーの視線方向に滑らかに合わせる際、Slerpを使えば、一定速度で回転します。
Lerpを使うと、武器の動きが不規則になり、狙いが取りづらくなります。
Slerpを使うべき場面
- 回転角度が大きい場合(90度以上)
- 回転速度を一定に保ちたい場合
- カメラの回転補間
- キャラクターの向き変更
- 滑らかな回転アニメーション
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
Slerpの仕組みを図解イメージで説明

Slerpの仕組みを理解するには、「球面上の最短経路」という考え方が重要です。
クォータニオンは、4次元の単位球面上の点として表現されます。
2つのクォータニオンq₁とq₂を補間する時、Slerpは以下の手順で計算します。
1. 球面上の角度を計算
まず、2つのクォータニオン間の角度θを計算します。
この角度は、2つのクォータニオンの内積から求められます。
cos(θ) = q₁ · q₂
この式から、θ(シータ)を求めます。
2. 球面上を等速で移動
角度θが分かると、球面上を等速で移動する補間が可能になりますよ。
Slerpの計算式は、以下のようになりますよ。
Slerp(q₁, q₂, t) = (sin((1-t)θ) / sin(θ)) × q₁ + (sin(tθ) / sin(θ)) × q₂
tは、0から1の値を取る補間パラメータです。
t = 0の時はq₁、t = 1の時はq₂になりますよ。
この式のポイントは、sin関数を使うことで、球面上を等速で移動できることです。
3. 回転速度が一定になる理由
Lerpは、直線的に補間するため、球面上を移動する距離が一定ではありません。
しかし、Slerpは、球面上を移動する距離(角度)が一定になるように補間します。
そのため、回転速度が一定になります。
具体例で説明しましょう。
0度から180度まで回転する時、Lerpを使うと、0度→45度→90度→135度→180度の各ステップで、移動距離が異なります。
一方、Slerpを使うと、各ステップで移動する角度が一定になるため、回転速度が一定になりますよ。
⚠️ 重要なポイント
- Slerpは計算コストが高い(sin関数を使うため)
- 回転角度が小さい(30度以下)場合は、Lerpでも十分な場合が多い
- Slerpを使う場合は、パフォーマンスに注意する
UnityでSlerpを実装する方法

UnityでSlerpを実装する方法を、具体的なコード例とともに説明します。
Quaternion.Slerpの基本的な使い方
Unityでは、Quaternion.Slerpという関数が用意されています。
この関数を使えば、簡単にSlerpを実装できます。
|
1 2 3 4 5 6 7 8 |
// 現在の回転と目標の回転 Quaternion currentRotation = transform.rotation; Quaternion targetRotation = Quaternion.LookRotation(targetPosition - transform.position); // Slerpで補間(tは0から1の値) float t = Time.deltaTime * rotationSpeed; transform.rotation = Quaternion.Slerp(currentRotation, targetRotation, t); |
このコードでは、現在の回転から目標の回転まで、一定速度で補間します。
rotationSpeedは、回転の速さを制御するパラメータです。
キャラクターの向き変更の実装例
キャラクターがマウスの方向を向く例を見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void Update() { // マウスの位置を取得 Vector3 mousePosition = Input.mousePosition; mousePosition.z = 10f; // カメラからの距離 // マウス位置をワールド座標に変換 Vector3 worldPosition = Camera.main.ScreenToWorldPoint(mousePosition); // キャラクターからマウス位置への方向 Vector3 direction = (worldPosition - transform.position).normalized; // 目標の回転 Quaternion targetRotation = Quaternion.LookRotation(direction); // Slerpで滑らかに回転 float rotationSpeed = 5f; transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } |
このコードでは、キャラクターがマウスの位置を向くように、滑らかに回転します。
rotationSpeedを調整すれば、回転の速さを変更できます。
カメラの回転補間の実装例
カメラが特定の方向を向く時の実装例です。
|
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 CameraRotation : MonoBehaviour { [SerializeField] private Transform target; [SerializeField] private float rotationSpeed = 2f; void Update() { if (target == null) return; // カメラからターゲットへの方向 Vector3 direction = (target.position - transform.position).normalized; // 目標の回転 Quaternion targetRotation = Quaternion.LookRotation(direction); // Slerpで滑らかに回転 transform.rotation = Quaternion.Slerp( transform.rotation, targetRotation, Time.deltaTime * rotationSpeed ); } } |
このコードでは、カメラがターゲットの方向を向くように、滑らかに回転します。
Slerpを使うことで、カメラの動きが自然になりますよ。
LerpとSlerpの使い分け
LerpとSlerpをどう使い分けるか、判断基準を整理しましょう。
Slerpを使うべき場面:
– 回転角度が大きい場合(90度以上)
– 回転速度を一定に保ちたい場合
– カメラの回転
– 滑らかな回転が重要な場面
Lerpでも問題ない場面:
– 回転角度が小さい場合(30度以下)
– パフォーマンスが重要で、見た目が多少犠牲になっても良い場合
– 計算コストを抑えたい場合
実装時は、まずSlerpで試してみて、パフォーマンスに問題がなければSlerpを使い、問題があればLerpに変更するという方法も有効です。
Slerpを使う際の注意点とベストプラクティス

Slerpを実装する際に気をつけるべきポイントを見ていきましょう。
パフォーマンスへの配慮
Slerpは、sin関数を使うため、計算コストが高いです。
毎フレーム、多数のオブジェクトでSlerpを使うと、パフォーマンスに影響が出る可能性があります。
対策として、以下の方法があります。
必要な時だけSlerpを使う:
回転角度が大きい時だけSlerpを使い、小さい時はLerpを使うという方法です。
回転角度を計算し、一定の角度以上の場合のみSlerpを使うことで、パフォーマンスを最適化できます。
補間の終了判定を追加する:
目標の回転に近づいたら、Slerpの計算を停止する方法です。
回転角度が一定以下になったら、直接目標の回転を設定すれば、不要な計算を避けられます。
短い経路を選ぶ
クォータニオンの補間では、2つの回転間の最短経路を選ぶことが重要です。
2つのクォータニオンq₁とq₂がある時、q₂の代わりに-q₂を使うと、逆方向の回転になりますよ。
Slerpは、通常、内積が正の方を選ぶため、自動的に短い経路を選びます。
しかし、明示的に短い経路を選ぶコードを書くことで、確実に短い経路で補間できますね。
|
1 2 3 4 5 6 7 8 |
// 内積が負の場合、短い経路を選ぶ float dot = Quaternion.Dot(from, to); if (dot < 0f) { to = new Quaternion(-to.x, -to.y, -to.z, -to.w); } transform.rotation = Quaternion.Slerp(from, to, t); |
補間パラメータtの扱い
Slerpの補間パラメータtは、0から1の値である必要があります。
しかし、Time.deltaTimeを直接使うと、tが1を超えることがあります。
その場合、補間が目標を飛び越えてしまうため、tをclampする必要があります。
|
1 2 3 |
float t = Mathf.Clamp01(Time.deltaTime * rotationSpeed); transform.rotation = Quaternion.Slerp(currentRotation, targetRotation, t); |
このように、Mathf.Clamp01を使うことで、tを0から1の範囲に制限できます。

まとめ

この記事では、Slerpとは何か、ゲーム開発でどう使われるかを見てきました。
重要なポイントをおさらいします。
重要なポイント:
- Slerp(球面線形補間)は、クォータニオンを球面上で等速補間する技術で、回転速度が一定になる
- Lerpと違い、回転角度が大きい場合でも、滑らかで自然な回転補間が可能
- キャラクターの向き変更、カメラの回転、オブジェクトの回転アニメーションなどで活用できる
- UnityではQuaternion.Slerp関数を使えば、簡単に実装できる
- Slerpは計算コストが高いため、必要に応じてLerpと使い分けることが重要
Slerpは、3Dゲームで滑らかな回転を実現するために、重要な技術です。
特に、回転角度が大きい場面では、LerpとSlerpの違いが明確に現れます。
まずは、Quaternion.Slerpを使って、実際の動作を確認してみましょう。
実際に試してみることで、Slerpの効果を実感できるはずです。
数学的な理論だけでなく、実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、ゲーム開発で使う数学を、実装しながら体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
Lerpとは何か|ゲームで滑らかな移動・補間ができる理由





コメント