Unity - 計算 horizontal fov(水平方向上的 field of view)


Unity版本

Unity 2017.4.2

Unity fov

1. 通過Camera組件獲取fov(這是vertical fov):

    void Start()
    {
        Camera mainCamera = Camera.main;
        float fov = mainCamera.fieldOfView;
        Debug.Log("fov:" + fov);
    }

2. 計算horizontal fov

    void Start()
    {
        Camera mainCamera = Camera.main;
        float fov = mainCamera.fieldOfView;
        Debug.Log("fov:" + fov);

        float fovInRads = fov * Mathf.Deg2Rad;
        float horizontalFovInRads = 2 * Mathf.Atan(Mathf.Tan(fovInRads / 2) * mainCamera.aspect);
        float horizontalFov = horizontalFovInRads * Mathf.Rad2Deg;
        Debug.Log("horizontal fov:" + horizontalFov);
    }

horizontal fov應用舉例

1. 用一張圖像作為背景,效果如下:

在Main Camera下創建BackgroundQuad,localPosition=(0, 0, 100),localScale=(100, 100, 1)

2. 我們希望背景圖像在水平方向上填滿,同時保持原圖寬高比,效果如下

Sample Code:

public class bg : MonoBehaviour
{

    public Texture bgTexture;
    public Transform backgroundQuad;

    float CalcHorizontalFov()
    {
        float fovInRads = Camera.main.fieldOfView * Mathf.Deg2Rad;
        float horizontalFovInRads = 2 * Mathf.Atan(Mathf.Tan(fovInRads / 2) * Camera.main.aspect);
        return horizontalFovInRads * Mathf.Rad2Deg;
    }

    // Use this for initialization
    void Start()
    {
        float d = 100; // distance form camera to background quad
        float horizontalFov = CalcHorizontalFov();
        float scaleX = Mathf.Tan(horizontalFov * Mathf.Deg2Rad / 2) * d * 2;
        float scaleY = scaleX * bgTexture.height / bgTexture.width;

        backgroundQuad.localPosition = new Vector3(0, 0, d);
        backgroundQuad.localScale = new Vector3(scaleX, scaleY, 1);
    }
}

 


免責聲明!

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



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