【3D】2人同時に視野に収めるカメラの作り方

ゲーム開発
広告だよ!!!たくさんクリックしてね

対戦ゲームを作っているとき、いい感じに2人をカメラの視野に収めながらズームしてくれるカメラが必要になったので作りました。

参考:https://qiita.com/OliverNotepad/items/dbfdfe9f73f628ca55fc

ソースコード

解説の前にソースコードを出します

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraWork : MonoBehaviour
{

    //ここにターゲットを突っ込む
    public GameObject Player1;
    public GameObject Player2;

    private Camera camera;
    
    // Start is called before the first frame update
    void Start()
    {
        camera = this.GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update()
    {
        //2点の中心点
        Vector3 center = (Player1.transform.position + Player2.transform.position) / 2f;

        //2点を円で囲ったときの半径
        float r = Vector3.Distance(center, Player1.transform.position);

        //カメラの視野角
        float fov = camera.fieldOfView;

        //カメラが中心点から取るべき距離
        float camDistance = r / Mathf.Sin(fov / 2 * Mathf.Deg2Rad);

        //実際にカメラを移動
        this.transform.position = new Vector3(center.x, transform.position.y, center.z - camDistance); 
        //中心点の方を向く
        this.transform.LookAt(center);

        
    }


}

数学の解説

※ソースコードを傍らに読み進めること

きったない図だけど許してください

2点を収められる距離を測るにはこんな感じの図で考えれば分かりやすいです。

要するに、どちらも映っているときの2点の中心点とカメラとの距離を求められればいいわけです。

この距離は

2点間の距離/2(=片方のオブジェクトから中心点までの距離) ÷ Sin(Fov/2)

(下図r)

で求められます。わかりやすく赤い三角形の向きを変えると

こんな感じになります。三角形のSinを求めるのは

sin = r / camDistance

です。今回は逆にSinとrが分かっているので、camDistanceを求める式は

r / sin(Fov / 2)

となります。

タイトルとURLをコピーしました