【Unity】注視対象を持つカメラの座標計算

いわば、極座標系でのカメラの座標計算になるんだけど、式自体は「まぁだいたいこんな感じでやればそれっぽくなるよね」という感じで書いているので、お硬い公式を使った場合と挙動が変わるかもしれないので注意。
また、こういうのは完全に数式に則って実装してしまうとゲームの演出的に微妙になる、というのは往々にしてあることで、今回もそれを考慮して書いてます。
まぁ、誰かと議論するための記事じゃないので、実装例の一つとして見ていただければ。

さて、以下のコードによって自分はカメラの座標計算を行っています。

/// <summary>
/// 注視対象に対する自身の座標を設定する
/// </summary>
private void UpdatePosition()
{
        if (this.lookTarget == null) return;

        Vector3 position = Vector3.zero;

        float radX = Mathf.Deg2Rad * this.rotationX;
        float radY = Mathf.Deg2Rad * this.rotationY;

        float distanceZ = Mathf.Cos(radX) * this.distance;
        position.z = Mathf.Cos(radY) * this.distance;
        position.x = Mathf.Sin(radY) * this.distance;

        float distanceY = Mathf.Sin(radX) * this.distance;
        position.y = distanceY;
            
        position += this.lookTarget.transform.position;

        this.transform.position = position;
}

以上の式になります。
これの計算式を公式っぽく、書いたのが以下

RadianX = DegreeX * Mathf.Deg2Rad
RadianY = DegreeY * Mathf.Deg2Red

DistanceZ = Mathf.Cos(RadianX) * Distance
DistanceY = Mathf.Sin(RadianY) * Distance

PositionX = Mathf.Sin(RadianY) * DistanceZ
PositionZ = Mathf.Cos(RadianY) * DistanceZ
PositionY = DistanceY 

流れを説明すると、
① 注視対象をカメラの正面として、そのZ方向の距離を、X軸回転を考慮しつつ算出する。
② ①で算出した距離を元に、Y軸回転を考慮しつつ、X座標とZ座標をそれぞれ算出する。
③ Y方向の距離はX、Zに依存しないようにX軸回転量を考慮しつつ算出する。
という感じです。

また、カメラの座標の基準は絶対に注視対象を基準とするので、カメラ自身の座標を計算する時には注視対象の情報は特に必要ありません。
なので、座標を計算し終わってから、注視対象の座標を足して最終的な座標としています。

なお、一般的にこういった座標を算出する際は、X軸やZ軸方向の座標を決めるときに、Y軸は上方向を基準として計算するみたいですが、この式ではZ方向を基準としています。
別に特に理由はないのですが、コードの書きやすさとかイメージのしやすさで書いているだけですね。



【Unity】画面のカクつき、それ本当にFPSのせい?

 

最近ではあまり宣伝文句として使われないような気がするけど、Unityの大きな特徴といえば、更新処理がスケーラブルというところ。

1回の描画の間に更新処理が何回走るのかはUnityしか知らない。

地味な初心者殺し。

 

ていうところで、Update()を実装して、その中にオブジェクト(いわば描画される側)の移動や、カメラ(いわば描画する側(※1))の移動を行うと問題が発生することがある。

 

つまり、前回の描画と今回の描画の間に更新処理が100回走ったけど、今回の描画と次回の描画の間には1回しか更新処理が走りませんでした。

なんてことになると、描画するたびにオブジェクトが一瞬で移動したり、逆に全く移動しなかったりする。

 

そんな時、移動量に対してTime.deltaTImeを適切に掛け合わせてあげよう。

Time.deltaTImeは、前回の更新処理と今回の更新処理の間の経過時間を返してくれる。

 

※1・・・厳密にはカメラが描画するわけではないけど、関係性は大体そんなもの。