Unity相機范圍適應物體大小


Unity相機范圍適應物體大小

情形

相機是游戲向玩家展示的主要手段。大部分時候,相機的位置和范圍可以提前設定,在游戲中不會做變化。但有些時候,我們希望相機在游戲當中能夠調整位置和范圍,以顯示某一物體。

具體一點,說一下我遇到的情況。我希望顯示的物體是一個由玩家自定義自己制造的飛船。這個飛船可大可小,在玩家把它做出來之前,游戲是無法確定它的大小的。自然地,用來跟隨飛船的攝像機也無法確定位置和范圍。我希望在玩家制作完畢飛船之后,能夠使相機適應飛船的尺寸,在屏幕中合適的顯示出飛船的全部。

方法

下面提供我的解決方法。我的解決方法假設相機正對需要適應顯示的物體的中心。如果不是這樣,需要對代碼做一些小改動,但總體做法是適用的。

public class CameraManager:MonoBehaviour
{
    // 對攝像機的引用,可以在面板中設置,也可以在初始化時獲取。
    public Camera cam;
    // 需要顯示的物體的中心位置。
    public Transform root;
    // 物體的半徑。即物體里中心最遠的地方到中心的距離。
    public float radius;
    // 一些參數,在面板中調試。
    // 兩個參數增大都會使屏幕中物體變小。
    // 半徑和相機范圍的關系參數
    public float radiusToSizeFactor=2;
    // 半徑和相機距離的關系參數
    public float radiusToDistanceFactor=2;
    
    // 傳入物體的中心位置和物體半徑。
    public void PrepareCamera(Transform center, float r)
    {
         // 根據參數設置相機到物體的距離。
        cam.transform.localPosition = new Vector3(0, 0, -radiusToDistanceFactor * radius);
        // 如果需要顯示的物體不是正對相機中心,修改這個向量的初值。
        Vector3 worldPos = new Vector3(0, radius, 0);
        // 把向量轉換到世界坐標系,因為相機的接口只接受世界坐標
        worldPos = root.TransformPoint(worldPos);
        // 獲得點在相機屏幕中的相對位置,如正好在屏幕左下角的點返回(0, 0, z),正好在右上角的點返回(1, 1, z)。z為物體離相機的深度距離,在這里沒有用處。
        Vector3 viewPos = cam.WorldToViewportPoint(worldPos);
        // 根據參數調整相機范圍。這里我用的是正交相機,如果使用透視相機,這里應該修改fieldOfView。
        // 如果參數為2,則物體最多占到屏幕的1/2高度。
        cam.orthographicSize *= radiusToSizeFactor * viewPos.y;
    }
}

結語

Unity並沒有給出他所用的Camera.orthograpicSizeCamera.fieldOfView是如何計算的,具有什么意義。所以沒辦法直接計算出合適的值,只能通過相對關系做放大和縮小。還是有那么一點不直觀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM