Unity透视相机下屏幕坐标转世界坐标

打印 上一主题 下一主题

主题 961|帖子 961|积分 2883

效果:将输入的鼠标坐标点击的物体位置转换为世界坐标
代码如下:
  1. Vector3 transpos = ScreenToWorldPlanePos(Input.mousePosition);
  2. public Vector3 ScreenToWorldPlanePos(Vector3 screenPosition)
  3.     {
  4.         Debug.Log("pos"+Camera.main.ScreenToWorldPoint(screenPosition));
  5.         Vector3 targetScreenPos=Camera.main.WorldToScreenPoint(CurrentObject.transform.position);
  6. //currentObject就是被鼠标射线点击到的物体,怎么获取到的这就不赘述了
  7.         float depth=targetScreenPos.z;
  8.         screenPosition.z=depth;
  9.         Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
  10.    
  11.         return worldPosition;
  12.     }
复制代码
 应该会有人疑问为什么不就用Camera.main.ScreenToWorldPoint(screenPosition)这个函数吧?因为我之前很疑问
因为这里有个很大的坑是,用这个方法转出来的屏幕坐标的深度值(也就是z值)是相机近平面的值!!!


所以,要想得到准确的z值,必要获取被点击物体在屏幕空间本来的z值,也就是将被点击物体的世界坐标转换为屏幕坐标,再将转换得到的屏幕坐标的z值赋给鼠标传入的屏幕空间坐标
PS.屏幕坐标本身不是二维坐标的意思哦,不要被它的名字骗了,它仍旧是三维坐标,只是是屏幕空间的坐标系,必要转换为世界空间下的坐标系

又有人要问了,为什么不能直接把鼠标坐标转换成世界坐标后把当前物体的z值赋给它,就像这样
  1. Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);
  2. worldPosition.z = CurrentObject.transform.position.z;
复制代码
因为世界空间下的z值寄义和屏幕空间下的z值(摄像机到目的点的深度)寄义不一样,并不能让我们达成使鼠标点击点与被击物体处于相机视角同一深度的目的

   左手系:z轴朝前,y轴向上
  右手系:-z轴朝前,y轴向上
  用手比一下就知道啦
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表