unity关于屏幕坐标的原理和转化

先了解一下其他坐标系:A.transform.localPosition是局部(本地)坐标:相对于父物体的坐标,若无父物体则就是世界的子物体,表现为世界坐标.
A.transform.position是世界坐标
由于画布采用的是世界坐标:画布无限大,左下角为世界坐标的原点(0,0,0).

Input .mousePosition 为鼠标点击时的屏幕坐标
Input.gettouch().positoin获得的是手机触屏时的屏幕坐标

首先有一个C1相机,C1相机有一个视口,我们在屏幕上可以看到的视野就是这个视口大小,Game面板上的1280*720那里就是设置视口大小的地方,这里宽为1280,高为720。
这个视口在相机上表现为下图
就是这个白色方框,在这个视口之内的东西我们就能在屏幕上看到,之外的就不能看到。
则屏幕坐标就是以这个视口左下角为原点的坐标系,
那么屏幕坐标怎么计算?
[(看到图中有一个黑色的圆没,称他为A)
A的屏幕坐标=A的世界坐标-C1相机视口左下角的世界坐标
(相机视口左下角的世界坐标=相机的世界坐标-(屏幕宽/2,屏幕高/2,相机的世界Z轴坐标))
(屏幕宽和高在上面已经说了,也可以通过Screen.width或Screen.height获得)]

unity中有世界坐标转化为屏幕坐标的方式就是这个原理:
A的屏幕坐标=A的世界坐标-C1相机视口左下角的世界坐标
如:Camera .main.WorldToScreenPoint(A的世界坐标);
就是:A的屏幕坐标=A的世界坐标-main相机视口左下角的世界坐标(这个main相机就是tag为Maincamera的那个相机(主相机))

那么在有两个相机的时候,如:主相机只看地图,看不到UI,UI相机只看UI,不能看到地图(设置相机的Culling Mask)
左下角的那个就是主相机,上面那个就是UI相机,注意,这里虽然两个相机的视野不是一样大,但是他们还是以1270*720的宽高比例投射到屏幕上的,在屏幕上是一样大的,

还是这个圆A,那么我们要计算A的屏幕坐标,且A为UI:
A的屏幕坐标=A的世界坐标-相机视口左下角的世界坐标

而这里有两个相机,则就有两个屏幕坐标:
A的屏幕坐标=A的世界坐标-主相机视口左下角的世界坐标
A的屏幕坐标=A的世界坐标-UI相机视口左下角的世界坐标
由于设置了我们的UI只能被UI相机看到,在主相机上是不可见的,即A的屏幕坐标以UI相机左下角为原点。
则依据我们的要求,A的屏幕坐标应该为:
A的屏幕坐标=A的世界坐标-UI相机视口左下角的世界坐标
而在使用unity自带的世界坐标转屏幕坐标的时候,我们不能使用:
Camera .main.WorldToScreenPoint(A的世界坐标);
因为这个是以主相机左下角为屏幕原点来计算的。
我们应该先获取UI相机

然后将UI相机挂到脚本上,注意不要使用
public GameObject UICamera来挂相机;
因为GameObject类型的变量是没有WorldToScreenPoint方法的
UICamera.WorldToScreenPoint(A的世界坐标)
当然获得屏幕坐标后转化为世界或其他坐标时,也要注意这个问题:A的世界坐标=A的屏幕坐标+C1相机视口左下角的世界坐标
C1.ScreenToWorldPoint(A的世界坐标)

本文地址:https://blog.csdn.net/xcj1409385086/article/details/107320674

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐