ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint的运用,实现一个简单的对三维中物体的拖拽移动效果

发布时间:2019-03-29 13:39:50  访问次数:

  众所周知,我们手机或者手机屏幕上的坐标是一个二维平面的的坐标值,而且这个坐标是一像素为单位的,也就是说这个是会根据你用的设备的不同,你手机或者电脑上的坐标的长宽最大值也就不同。

  之前不太了解标题上三个方法的用法,走了不少弯路,然后下来仔细研究了一下,感觉还是挺有收获的。

  简单说一下,我们在Unity中屏幕坐标是以坐下为原点,向两边延伸,右上为终点,假定现在我们的分辨率是1920x1080的话,那么简单,四个角对应的值大家可能都能猜到,(假定为横屏)坐下(0,0),右下(1920,0),左上(1080,0),右上(1920,1085)。让后这就是我们屏幕的坐标,在unity中鼠标超出的话,会显示为负值,这个可取可以用log语句打印出来看看,前面都是铺垫,接下来重点来了,注意了。。。

  1.如果我们运用第一个方法Camera.main.ScreenToViewportPoint()的话,那么,就可以将我们不容分辨率屏幕上的点都转换为一个想x,y值在(0,1)之间的数值,当然和上面一样如果你传进来的这个鼠标的位置超出屏幕范围对应的视口坐标(暂且这么称呼)也会变为负值,只不过不想分标率那么多情况,这个简单想一下就能明白,下面是这个例子的第一个转换代码:

1
2
//将屏幕坐标转换为视口坐标
        Vector3 pos1 = Camera.main.ScreenToViewportPoint (Input.mousePosition);

  2.将三维中物体的位置转换为视口坐标位置,存放在一个三维向量中,这里了的三维中中物体坐标转换为视口坐标大致是这样的,假如你这个物体在game下能看见的话,那么它的想x,y就在(0,1)之间,若超出我们视野范围则为大于一小于零的值,这是没什么问题的,然后就是z的值,因为物体可能离相机的远近不同,这个值变化比较大,我这里将物体在三维场景中坐标转换为视口坐标的原因主要想获取他离摄像机的距离,也就是z的值,

1
2
//将三维物体的世界坐标转换为视口坐标
    Vector3 pos2=Camera.main.WorldToViewportPoint(target.position);

  3.将1,2中获取的信息组合成一个新的向量,然后作为4中的参数

1
2
//赋值给一个新的变量
Vector3 pos=new Vector3(pos1.x,pos1.y,pos2.z);

  4.将视口坐标转换为三维坐标传递回给物体的position,功能实现完成

1
2
//将合成的视口坐标转换为世界坐标赋值给物体
target.position=Camera.main.ViewportToWorldPoint(pos);

  接下来是演示的一个gif:

  有什么不合理的地方欢迎指正。