今天我们要讲解的是unity的ScreenToWorldPoint接口,其实这个接口已经给我们实现了所有的过程为什么我们还要写一篇这样的文章来介绍它呢?那是因为ScreenToWorldPoint这接口的参数是一个Vector3,而不是屏幕坐标Vector2。下面看图:

首先我们摄像机画面中点任意一点E点,然后映射到世界坐标系的地面上C点,ScreenToWorldPoint但是这个接口的Vector3.z=EC,接下来我们算出EC的长度。这里有几个假设,假设地面的高度是0,摄像机是透视摄像机Perspective,摄像机的Far足够远就像上面图所示,这个是X轴的截面图。接下来我们就要看我们有哪些已知条件,如图所示:

我们已知:屏幕点击点坐标screen_pos=Vector2,屏幕宽高,摄像机高度EF=camera.transform.position.y,∠b=camera.transform.euerAngles.x,∠e=fieldOfView/2,这些都是我们已知的。∠e大家有点难理解,其实我也比较难理解后面查资料才得知的。接下来我们就开始我们的核心代码了,不过要先画辅助线,如图所示:

好吧,是不是有点看不懂了,我先说一下思路吧:第一步求出EB的长度∠b就可以算出来,EB是屏幕中心点发出的射线长度,拿到EB就可以得到BG。第二步根据屏幕点击的点相对于屏幕中心点算出比率,乘以BG得到BH。第三步算出h1,EC||E’C’得出h1=h2,就可以顺利得到i1,i1=i2。第四步算出EC,大功告成,附上代码:

function get_world_pos_by_screen_position(self, screen_pos)local b = math.rad(camera.transform.eulerAngles.x)local EB =  EF / math.sin(b)local BG = EB * math.tan(e)local ratio = (screen_pos.y - Screen.height / 2) / (Screen.height / 2)local BH = BG * ratiolocal h1 = math.atan(BH / EB)local i1 = b - h2local EC = EF / math.sin(i2)local click_world_pos = camera:ScreenToWorldPoint(Vector3(screen_pos.x, screen_pos.y, EC))return click_world_pos
end

click_world_pos就是我们得到的精确的C点的世界坐标,若有问题,欢迎支出,谢谢指教。

Unity用lua实现透视摄像机的屏幕坐标换算到世界坐标的解决方案相关推荐

  1. 【转】UNITY之LUA加密

    [转]UNITY之LUA加密 来自:Lua加密 两种方式:一种用luac,一种用luajit luac加密: 1.lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,去官网下 ...

  2. tolua#是Unity静态绑定lua的一个解决方案

    tolua#是Unity静态绑定lua的一个解决方案 参考文章: (1)tolua#是Unity静态绑定lua的一个解决方案 (2)https://www.cnblogs.com/Leo_wl/p/6 ...

  3. unity vr是加一个摄像机就行吗_Unity实时光线追踪功能演示项目创作过程

    今年3月,Unity宣布提供针对NVIDIA RTX实时光线追踪技术的支持,实时光线追踪技术为Unity的高清晰渲染管线HDRP加入了逼真的光照质量,给Unity的视觉功能赋予新的潜力. Unity中 ...

  4. Unity 之 Lua使用Vector3遇到的问题

    Unity 之 Lua使用Vector3遇到的问题 1.正常使用 2.遇到问题 3.原来如此 4.ToLua中的V3实现表 1.正常使用 在Lua使用的形式和C#中大致相同,只是Lua使用表的形式来模 ...

  5. unity3d 摄像机跟随角色时被物体遮挡解决方案

    unity3d 摄像机跟随角色时被物体遮挡解决方案 未被遮挡时 为了解决这个问题,在这里我们需要用到 Physics.RaycastAll:使用方法详见圣典 首先 ,我们引入命名空间 System.C ...

  6. 基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案

    基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 参考文章: (1)基于EasyNVR二次开发实现自己的摄像机IPC/NVR无插件化直播解决方案 (2)https://ww ...

  7. unity片元着色器中获取屏幕坐标_Unity踩坑笔记(持续更新)

    1.error CS0104: 'MinAttribute' is an ambiguous reference between 'UnityEngine.Rendering.PostProcessi ...

  8. (转 )Unity对Lua的编辑器拓展

    转 http://blog.csdn.net/ZhangDi2017/article/details/61203505 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀 ...

  9. unity摄影机depth模式_Unity3d摄像机详解

    一 概述 Unity的相机用来将游戏世界呈现给玩家.你始终至少有一个相机在场景中,你也可以有多个.多相机可以给你一个双人分屏效果或创建高级的自定义效果.你可以让相机动起来,或用物理(组件)控制它们.几 ...

最新文章

  1. linux+swig+python,linux下使用swig让python调用C++(复杂版:包括多文件调用和链接库)...
  2. openmp 互斥锁 mysql_openMP 函数总结(并行程序设计导论)
  3. (5) ebj学习:ejb用jpa操作数据库1
  4. QT_CONFIG宏用法及支持的参数
  5. shell 面试题 (一) 待续
  6. 嵌入式Linux结课报告,嵌入式课程报告.doc
  7. 自动驾驶竟然排名倒数第一?苹果甩PDF否认
  8. 使用浏览器测试Webservers服务时出现提示“The test form is only available for requests from the local machine.”的解决办法
  9. java练习异常函数InputMismatchException
  10. Idea 插件:快速JSON转对象
  11. 按键精灵手机助手旋转验证码上传插件
  12. iconv 判断字符编码_iconv函数文字编码格式转换
  13. 即将截止?四川省2022年工业领域大企业大集团跨越发展激励项目申报条件、材料、要求及流程
  14. Android studio 之 Kotlin Not Configured
  15. WEB 安全之 SQL注入一 盲注
  16. 《拆掉思维里的墙》读书笔记
  17. 【BZOJ4316】小C的独立集
  18. 鼠标滑轮滚动事件(记录下以后用到好找)
  19. error: C2679
  20. flipboard的翻页效果的实现

热门文章

  1. 研究生毕业一年有感 —— 写于2021年5月29号
  2. Neighbor2Neighbor:从单个噪声图像进行自监督去噪
  3. NtripShare 地铁监测系统系列软件终端即将面世
  4. android 8不能清理内存,安卓手机内存机制揭秘 清理释放RAM对提速无效
  5. IntelliJ IDEA 2022.2 正式发布:已完全支持 Spring 6 和 Spring Boot 3!
  6. ElasticJob源码分析--定时任务执行JobScheduler类分析
  7. SSM之Mybatis Plus day01
  8. 贝加莱使用教程1-创建X20工程和点亮LED灯
  9. 394. 字符串解码
  10. rbac权限管理表mysql_RBAC权限管理数据库表小解