獲取相機視口內物體在視線範圍內某點的方法

  咱們在作HUD時常常使用物體的位置做爲世界座標點, 這在小物體的狀況下沒有問題, 可是在對於大型物體就有點麻煩, 由於咱們的視角不必定能看到該點, html

好比大樓, 大橋甚至公路等, 但願能在物體進入視線範圍內時獲取一個當前視線範圍內該物體離屏幕中心最近的一個點, 做爲HUD的世界座標點來顯示.ide

  1. 首先須要測試物體是否在可視範圍內, 通常使用 OnBecameVisible() 生命週期便可.測試

  2. 獲取可視範圍內離屏幕中心最近的點, 這個能夠是多邊形面上某點, 不必定是多邊形的點.rest

  3. 由於視角是個三角形, 因此非規則物體常常是離相機最近的點不在相機視角以內.orm

  4. 不能作的太複雜htm

 

  因而咱們從生命週期開始作, 在進入相機視角時添加到某個列表中, 由於依賴於Collider的API 而且需求該Collider爲凸多邊形, 因此對MeshCollider進行判斷blog

    private void OnBecameVisible()
    {
        var collider = GetComponent<Collider>();
        if(collider)
        {
            var mc = collider as MeshCollider;
            if(mc && mc.convex == false)
            {
                return;
            }
            visibleColliders.Add(collider);
        }
    }

  而後由於相機是移動的, 計算位置也須要Update生命週期

    public static IEnumerator Run()
    {
        while(true)
        {
            if(visibleColliders.Count > 0)
            {
                foreach(var visibleCollider in visibleColliders)
                {
                    var nearestPoint = visibleCollider.ClosestPoint(GetCameraViewPoint(visibleCollider));
                    onVisible.Invoke(visibleCollider, nearestPoint);
                }
            }
            yield return null;
        }
    }

  關鍵就是計算離屏幕中心最近的位置了, 由於屏幕中心能夠作一條射線出去, 這就是屏幕中心的線段, 按照理論 : 不必定有一個頂點必定會在屏幕視線範圍內.get

這個比較好理解吧, 一個面通過相機視線, 但是全部點都不在相機視線範圍內, 因此簡單數學方法獲取離線段最近的點沒有意義.數學

  這裏就用Collider自帶的API來計算一個大概的值便可:

    private static Vector3 GetCameraViewPoint(Collider target)
    {
        var dis = (Camera.main.transform.position - target.bounds.center).magnitude;
        var pos = Camera.main.transform.position + Camera.main.transform.forward * dis;
        return pos;
    }

  這裏使用相機到物體的中心位置的距離做爲參考, 從相機發射的射線在這個距離的點進行計算, 而後計算該點到物體的最近位置, 所獲得的位置就做爲HUD世界座標, 

在大部分狀況下是符合邏輯的...

 視屏沒法設置, 傳土豆去了

https://v.youku.com/v_show/id_XNDE4Mzc5MTU5Mg==.html?spm=a2h3j.8428770.3416059.1

相關文章
相關標籤/搜索