背景描述:
在安卓上開發AR應用(結合高通)。camera是的projection是orthographic模式,size按照大小1920*1080計算是5.4(不知道這些資訊有沒有用,我一并寫出來)
我debug的資訊是這樣的:
DebugConsole.Log("0(0.0f, 0.0f, 0.0f):" + ca.ScreenToWorldPoint(new Vector3(0.0f, 0.0f, 0.0f)));
DebugConsole.Log("1(10.0f, 0.0f, 0.0f):" + ca.ScreenToWorldPoint(new Vector3(10.0f, 0.0f, 0.0f)));
DebugConsole.Log("2(0.0f, 10.0f, 0.0f):" + ca.ScreenToWorldPoint(new Vector3(0.0f, 10.0f, 0.0f)));
DebugConsole.Log("3(0.0f, 0.0f, 10.0f):" + ca.ScreenToWorldPoint(new Vector3(0.0f, 0.0f, 10.0f)));
輸出結果:
0(0.0f, 0.0f, 0.0f):(18.8,223.4,28.0)
1(10.0f, 0.0f, 0.0f):(18.8,223.4,28.0)
2(0.0f, 10.0f, 0.0f):(18.8,223.4,28.0)
3(0.0f, 0.0f, 10.0f):(13.9,214.2,21.9)
可以看到0,1,2,3都是不同的像素點(沒有掛載物體),但是點1,2,3經過ScreenToWorldPoint后輸出的結果卻是一樣的。這是為什么呢?
雖然接觸unity有一陣子了,但是還是有很多都不知道的,被這個問題困擾了好久。
懇請大家幫忙看看有什么問題,無比感謝!!!!
uj5u.com熱心網友回復:
自己先頂一下,希望更多的人能看到
uj5u.com熱心網友回復:
你換個相機試一下,uj5u.com熱心網友回復:
他這個是跟camera的位置有關系的,意思是把螢屏中的坐標轉換為世界坐標,你如何螢屏是1920*1080你可以設定一個vector3 pos=new Vector3 (960,540,Z=“隨意,就是物體到攝像機的距離”)
然后 新建一個cube,
運行時執行
cube.transform.position = ca.ScreenToWorldPoint(pos);
就可以看到你的cube在螢屏中心位置!
uj5u.com熱心網友回復:
至于你的 0,1,2,3都是不同的像素點(沒有掛載物體),但是點1,2,3經過ScreenToWorldPoint后輸出的結果卻是一樣的。應該是轉換后精度問題,可以看到轉換后只有一位小數點,系統給做了精度處理,相差太小的兩個像素點 在三維空間內的位置基本相同
uj5u.com熱心網友回復:
同4樓,我也試過有可能是精度問題,還有可能你測驗的時候攝像機的projection不是orthographic模式,我剛用你的代碼在空場景中測驗,如果不是orthographic模式 ,前三個像素點坐標就是一樣的,如果轉換成orthographic模式,像素點就有零點幾的偏差.uj5u.com熱心網友回復:
跟camera的位置有關系的,你需要用代碼實作坐標轉換uj5u.com熱心網友回復:
轉換程序影響因素包括:1、真正影響的是Z值的設定,不同的Z值代表在觀察坐標系下不同的投影平面,觀察坐標系的又是一個錐體,所以計算的時候還和file of view 的角度有關聯。
2、Screen 取值時和canvas設定的寬高比還有perference pixels per unit有關系(即解析度,不過這里的單位是 pixel/m(unity中的單位)),
可以觀察到UGUI直接拿Position的時候其實是3D坐標系下的位置,可以把Canvas上的物體當作是Z坐標為0的3D物體處理;
要計算UI上的位置,就要考慮1和2兩個因素了。
uj5u.com熱心網友回復:
RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.GetComponent<RectTransform>(), transform.position, null, out vector2);Debug.Log(transform.position);
Debug.Log(Camera.main.WorldToScreenPoint(transform.position));
Debug.Log(vector2);
Card.anchoredPosition = vector2;
我是這么用的,用于得到子UI的Screen位置,得到的vector2的坐標是以Canvas的中心點為(0,0)的,具體設定再根據transform的錨點進行設定吧;
uj5u.com熱心網友回復:
前三個輸出的都是攝像機的位置。當攝像機為Perspective模式(這里默認攝像機正對Z軸),在距離攝像機為0的距離上,截出的平面是個點,也就是攝像機的位置。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/44081.html
標籤:Unity3D
上一篇:3D數學題,求助
