Unity世界座標區域性座標轉換

2021-10-04 16:45:44 字數 1757 閱讀 3464

世界座標轉ui區域性座標比較常用,也比較簡單。

vector3 worldposition = _3dtransform.position;

vector3 screenposition = _3dcamera.

worldtoscreenpoint

(worldposition)

;vector2 localpostion;

if(recttransformutility.

screenpointtolocalpointinrectangle

((recttransform)_canvas.transform, screenposition, _canvas.worldcamera,

out localpostion)

)

如果知道ui物件,直接通過transform.position獲得。

如果只知道ui父節點以及乙個相對于父節點的區域性座標,可以通過:

worldpos = parenttransform.

transformpoint

(localpos)

;

如果只知道乙個ui座標,需要先轉到螢幕座標系,再轉到世界座標系:

首先主要考慮的是ui適配,通常canvas scale會設定成scale with screen size,canvas大小就不一定是螢幕解析度的大小。

假設原本的標準解析度是720x1280,在ipad的解析度1536x2048上顯示時:

假如是以高度為適配,那麼canvas 實際高度為1280,寬度為1536 / 2048 * 1280 = 960,拉伸比例為2048 / 1280 = 1.6;

假如是以寬度為適配,那麼canvas實際寬度為720,高度為2048 / 1536 * 720 = 960,拉伸比例為1536 / 720 = 2.13;

那麼螢幕座標 = canvas下的ui區域性座標 * 拉伸比例 + 螢幕寬高 / 2;

因為canvas ui區域性座標系的原點在中間,而螢幕座標系的原點在左下角。

接著再通過screentoworldpoint(screenpos)轉為世界座標。

**如下:

var standardsize =

newvector2

(720f

,1280f);

var scale = canvasscaler.matchwidthorheight ==

0? screen.width / standardsize.x

: screen.height / standardsize.y;

var screenpos = localpos * scale +

0.5f

*new

vector2

(screen.width, screen.height)

;var worldpos =

newvector3()

; recttransformutility.

screenpointtoworldpointinrectangle

((recttransform) canvas.transform, screenpos, uicamera,

out worldpos)

;

如果只是為了獲得偏移,可以簡單地通過比例來獲得:

worldoffsety / uicamera.orthographicsize * 2 = uioffsety / screen.height

Unity世界座標和區域性座標的轉換

unity世界座標和區域性座標的轉換 核心 為這兩句 an highlighted block public vector3 transformpoint vector3 position public vector3 inversetransformpoint vector3 position 其...

關於Unity中的世界座標和區域性座標

1.物體的區域性座標的方向 物體自身的方向 transform.forward transform.right transform.up 2.物體的世界座標的方向 vector3.forward vector3.right vector3.up 例子 子彈沿自身座標軸的z軸方向運動 vector3 ...

OpenCV區域性座標系和世界座標系轉換

本文實現區域性座標系和世界座標系的轉換。假設機器在p1處在世界座標系下的位姿為 x,y,z,1,1,0,0 p1 和p2之間的轉換 區域性座標系 為t12表示為 1,1,0,45 求p2處世界座標系下的位姿 x,y,z,結果為 2,2,0,45 程式如下 include includeusing n...