unity中轉換屏幕坐標到世界坐標


Vector3 UIToWorldMapDistance(UIObject ui)//UI元件的3維坐標,z表示此元件在屏幕上的位置到世界地圖上的距離
        {
            float cameraHeight = Camera.main.transform.position.y;//攝像機到世界地圖的距離
            Vector3 screenPos = (ui的屏幕坐標);
       bool highThanCenter = screenPos.y>Screen.height*0.5f; float ratio = Mathf.Abs((screenPos.y - Screen.height * 0.5f) / (Screen.height * 0.5f));//算出ui在屏幕上的比例關系 float centerLineLength = cameraHeight / Mathf.Cos(Mathf.Deg2Rad * (90 - Camera.main.transform.eulerAngles.x)); float bottomLength = centerLineLength * Mathf.Tan(Mathf.Deg2Rad * Camera.main.fieldOfView * 0.5f); float acturalLength = bottomLength * ratio; float requireAngle = Mathf.Atan(acturalLength / centerLineLength); float bevelLength = cameraHeight / Mathf.Cos(Mathf.Deg2Rad * (90 - Camera.main.transform.eulerAngles.x) + (highThanCenter? requireAngle:-requireAngle)); float finalLength = bevelLength * Mathf.Cos(requireAngle);//表示此元件在屏幕上的位置到世界地圖上的距離

       screenPos.z=finalLength;
return screenPos; }

然后用Camera.main.ScreenToWorldPoint(ui的screenPos)進行 轉換即可。

原理就是根據ui在屏幕上的位置,算出比例,然后利用投影中的相似三角形原理算出准確的距離,三維的原理圖比較難畫,就不畫了,大家可以按照這個思路自己研究一下。

上述代碼中的攝像機是經過Y軸和X軸旋轉的,如果攝像機的位置和旋轉變化沒有很多,計算應該會更加方便。


免責聲明!

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



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