【Unity】Camera.WorldToViewportPoint 计算原理及实现

Unity世界坐标转换屏幕坐标(测试) 下面展示一下上一篇说的两种实现方式打包文件在不同分辨率下的效果 1.WorldToScreenPoint 1920 * 1080 800 * 600 2.WorldToViewportPoint 1920 * 1080 800 * 600 总结 可以看到四种情况全部都显示正确,我们再看一下原来的代码 public Vector3 GetScreenPosition(GameObject target) { Vector3 viewp 阅读详情

(133条消息) 【Unity】Camera.WorldToViewportPoint 计算原理及实现_cyf649669121的博客-优快云博客

具体原理我是参考的这篇文章:

详解MVP矩阵之ProjectionMatrix-腾讯游戏学堂

本地具体实现实现方法(不调用Camera的API)如下:

1、获取相机的VP矩阵:
        模型顶点坐标转换成屏幕坐标是用MVP矩阵,但是因为我们这边本来就使用的世界坐标进行转换,所以只需要VP矩阵即可。获取VP矩阵的方法如下:        

    private Matrix4x4 Matix_VP_LastFrame;
 
    private void LateUpdate()
    {
        Matix_VP_LastFrame= mainCamera.projectionMatrix * mainCamera.worldToCameraMatrix;
    }
        之所以放在LateUpdate是因为这个方法消耗挺大的,缓存起来每帧只计算一次即可。

        Camera中还有个属性是:Camera.previousViewProjectionMatrix ,看起来就是算好的值。但是我测试时取出来的值是算出来是不对的,所以就没有使用这个属性。

2、计算世界坐标的屏幕位置:
        计算原理在上述的文章连接中提到了,这里就提供代码即可。

        简单地说就是直接用VP矩阵乘世界坐标就可以了,不过这个乘出来的值并不直接是viewPos,还需要进一步转换:

 
    /// <summary>
    /// 传入世界坐标,获取屏幕坐标:
    /// </summary>
    private Vector3 WorldToViewportPoint(Vector3 wolrdPos)
    {
        Vector4 pos = new Vector4(wolrdPos.x, wolrdPos.y, wolrdPos.z, 1);
        Vector4 clipPos = Matix_VP_LastFrame * pos;
 
        float x = 0.5f + 0.5f * clipPos.x / clipPos.w;
        float y = 0.5f + 0.5f * clipPos.y / clipPos.w;
 
        Vector3 screenPos = new Vector3(x, y, clipPos.w);
        return screenPos;
    }
        这里返回的结果中,x、y就是在屏幕中的比例,左下角为(0,0),右上角为(1,1);z轴代表深度(正数在相机前面,负数在相机后面)。

        这个计算出来和Unity自己的API会有细微的误差(都在小数点后面好几位),但是不影响使用。

PS:

        虽然实现了算法,但是建议大家尽可能使用Unity原生的API。因为这个算法的性能消耗是大于Camera.WorldToViewportPoint 的(具体瓶颈在矩阵乘法那里,从Profile上看到了大量的String.memcpy,占用了大量的CPU消耗)。
————————————————
版权声明:本文为优快云博主「魔术师Dix」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/cyf649669121/article/details/120134738

Unity世界坐标转换屏幕坐标(详解) 我们先通过简单的操作实现一下基础的UI跟随物体移动的功能,首先我们在场景中建立一个Canvas并且添加一个图片作为按钮,之后我们添加一个3d物体作为跟随目标,效果如下图所示 我们配置一下UICanvas的属性,书写对应的自定义类并添加至UI物体 接下来我们书写对应的代码 using UnityEngine; public class ClickItem : MonoBehaviour { ... 阅读详情

相关推荐

Unity坐标系避坑指南:为什么你的WorldToViewportPoint总是不准确?附调试技巧

本文深入解析Unity中WorldToViewportPoint坐标转换不准确的常见原因,包括摄像机参数影响、深度值陷阱及多分辨率适配问题。通过剖析视口坐标系原理,提供实用的调试技巧与优化方案,帮助开发者精准实现3D物体到UI的坐标相互转换,提升开发效率。

weixin_29015051的博客 327

ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint

转至:http://www.cnblogs.com/springword/p/6683549.html ScreenToViewportPoint,WorldToViewportPoint,ViewportToWorldPoint的运用,实现一个简单的对三维中物体的拖拽移动效果   众所周知,我们手机或者手机屏幕上的坐标是一个二维平面的的坐标值,而且这个坐标是一像素为单位的

暗黑者的博客 2291

Unity坐标转换:WorldToViewportPoint不准确的原因与解决方案

在计算机图形学与游戏开发中,坐标系转换是连接3D世界与2D屏幕的核心基础。其原理是通过视图矩阵和投影矩阵,将三维空间中的顶点坐标,经过模型变换、视图变换、投影变换及透视除法,最终映射到二维的屏幕或视口空间。这项技术的价值在于实现了虚拟世界的可视化与交互,是UI对位、特效定位、小地图等功能的基石。在Unity引擎的实践中,开发者常遇到使用WorldToViewportPoint进行坐标转换时结果不准确的问题,这通常并非API缺陷,而是源于对摄像机参数、Canvas渲染模式、投影矩阵以及帧时序等底层上下文理解不

weixin_31556767的博客 277

Unity坐标转换性能优化:从Camera.main陷阱到高效矩阵运算

坐标转换是游戏开发、数字孪生和AR/VR应用中的基础技术,它涉及将三维空间中的点在不同坐标系(如世界坐标、屏幕坐标、视口坐标)之间进行映射。其核心原理是通过矩阵运算实现几何变换,包括模型变换、视图变换和投影变换。掌握高效的坐标转换技术对于提升应用性能至关重要,尤其是在移动端和XR设备上,能显著减少CPU开销,避免帧率下降和发热问题。在Unity引擎中,常见的性能陷阱包括高频调用Camera.main导致的查找开销、不当的Transform组件访问以及混淆不同坐标空间的转换时机。通过缓存引用、按需转换、合并矩

weixin_34238633的博客 397

Unity世界坐标转换屏幕坐标在自适应分辨率下的应用

项目中,经常会用到将3D场景中的物体坐标转换到屏幕坐标,然后设置UI在转换后的位置上。 一、Camera.WorldToScreenPoint 官方的描述是:Transforms position from world space into screen space. Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The

Gao_sun的博客 2821

Unity RenderTexture深度解析:原理、应用与性能优化实战

在实时图形渲染中,渲染到纹理是一项基础且关键的技术,它允许将GPU渲染的中间或最终结果存储为纹理,供后续渲染通道复用。其核心原理在于创建独立的帧缓冲对象,实现离屏渲染与纹理采样的无缝切换,从而打通渲染管线中的数据流。这项技术的核心价值在于实现了动态内容的实时生成与高效复用,极大地扩展了实时渲染的可能性。在工程实践中,它成为实现屏幕空间特效、动态反射、投影等高级视觉效果以及小地图、UI特效等功能的基石。通过合理应用RenderTexture,开发者可以在GPU渲染管线内构建灵活的多通道渲染方案,但同时也需警惕

chubaisheng8627的博客 352

Unity 3D物体屏幕指引线实现:坐标转换、UI绘制与性能优化

在3D应用开发中,坐标转换是连接虚拟世界与屏幕显示的核心技术,其原理在于将三维空间中的点通过视图和投影矩阵映射到二维屏幕坐标系。这项技术是实现任何3D交互与信息叠加的基础,具有极高的技术价值,广泛应用于游戏UI、工业仿真、虚拟培训等需要将3D物体信息清晰传达给用户的场景。本文聚焦于利用Unity引擎,解决为复杂3D模型子物体动态生成屏幕指引线的工程挑战,深入探讨了基于UI Canvas的混合渲染方案、高效的坐标转换方法以及应对多物体管理的对象池等性能优化策略,为开发者实现流畅、清晰的3D空间标注功能提供了完

weixin_30292843的博客 394

Unity小地图自制指南:UGUI+RenderTexture解决图标闪烁与遮挡

在游戏开发中,小地图是提升玩家空间感知与导航体验的核心UI组件,其实现原理涉及坐标系转换、渲染管线与UI系统的深度整合。通过摄像机将3D场景渲染到Render Texture,再结合UGUI的动态图标管理,开发者可以构建高性能、可定制的小地图系统。这一方案的技术价值在于实现了渲染与逻辑的彻底解耦,使图标状态控制、交互响应变得直观高效。在RPG、MOBA、开放世界等游戏类型中,稳定的小地图能显著增强游戏沉浸感与操作流畅度。本文聚焦于使用UGUI与Render Texture方案,深入剖析图标闪烁与遮挡问题的成

475

Unity小功能实现: 检测物体是否在屏幕范围内

  方法:把坐标转换为视窗坐标,左下角为(0,0),右上角为(1,1) Camera.main.WorldToViewportPoint(); // 该函数是用来世界坐标转换为视窗坐标   //把世界坐标转换为视窗坐标,左下(0,0),右上(1,1) Vector3 p = Camera.main.WorldToViewportPoint(需要转换的坐标--vector3); if (...

qq_38937254的博客 3695

Unity动画性能优化:AnimatorLOD Pro插件原理与实战配置指南

在游戏开发中,动画系统是CPU性能消耗的主要来源之一,尤其是在处理大量角色时,Animator.Update的开销会显著影响帧率。其核心原理在于通过动态调整动画的更新频率和计算精度来平衡性能与视觉质量,这借鉴了图形学中经典的LOD(细节层次)思想。这项技术的核心价值在于能够在不影响核心游戏体验的前提下,大幅降低动画系统的CPU占用,从而释放资源用于其他游戏逻辑或提升整体帧率。它广泛应用于需要同屏显示大量角色的游戏场景,例如MMO、RTS、开放世界以及移动平台游戏。本文聚焦的AnimatorLOD Pro插件

weixin_33816821的博客 468

低供电电压CMOS偏置电路分析(有些类似于三支路电流源)

1、偏置电路原理图以及仿真结果 电路电流分析:Ip=Ip1=Ip2=Ip3,那么 Ip=12μnCoxWL(IpR−VTH)2 I_p=\frac{1}{2} μ_nC_{ox}\frac{W}{L} (I_{p}R-V_{TH})^2 Ip​=21​μn​Cox​LW​(Ip​R−VTH​)2 解出方程式即可得到参考电流及参考电压 2、电路电源抑制比PSRR分析 这里为了方便,小信号前都不加△ 首先做一个近似,由于gmRo>>1,直接将VDD变化导致的P3管漏级电压变化与VDD变化量做相等

qq_46579389的博客 2907

《Unity_API解析》 第二章(下) Camera类实例方法

《Unity_API解析》 第二章(下) Camera类实例方法 RenderToCubemap方法:生成Cubemap静态贴图(专业版有) 1.public bool RenderToCubemap(Cubemap cubemap); 参数为Cubemap静态贴图 2.public bool RenderToCubemap(Render...

weixin_30551947的博客 200

从UE4到Unity:双叶高光技术在角色皮肤渲染中的移植全流程

本文详细解析了将UE4中的双叶高光技术移植到Unity引擎的全流程。该技术通过模拟皮肤油脂层和真皮层的不同反射特性,能显著提升角色皮肤渲染的真实感。文章从核心原理、贴图资产处理、Shader代码重构到参数调校,提供了完整的跨引擎移植实战指南,帮助开发者实现高质量的皮肤质感还原。

alice7model的博客 477

Unity坐标转换:WorldToScreenPoint与ScreenToWorldPoint原理、应用与实战避坑

在Unity游戏开发中,坐标转换是连接2D UI与3D场景交互的核心基础。其原理根植于计算机图形学的坐标系变换,涉及世界坐标系、视图坐标系和屏幕坐标系之间的矩阵运算。摄像机作为转换枢纽,通过视图矩阵和投影矩阵完成空间映射。掌握这一技术对于实现精准的UI跟随、物体选取及交互反馈具有关键价值,能有效提升游戏的用户体验与操作手感。在诸如MOBA、RPG等需要复杂UI与场景交互的应用场景中,坐标转换的准确运用是解决UI错位、点击失灵等常见问题的基石。本文以Unity中的WorldToScreenPoint和Scre

weixin_30279671的博客 425

利用LDA进行主题建模,用困惑度和一致性曲线选取最优主题数

如果困惑度和一致性曲线效果图较好,确定了主题数量后,再单独跑一下2里面的程序。2中topic为5是我主观设置的,不一定为最优。

m0_56327159的博客 4223

MATLAB打开.m文件乱码解决办法

Matlab打开.m文件出现中文乱码问题,是因为Matlab存在两种编码格式:GBK和UTF-8,而不同版本的Matlab编码格式可能不统一,因此在不同版本的Matlab打开文件,由于编码格式的改变,会导致注释乱码。 1.查看你的Matlab的文件编码方式,在Matlab的命令行窗口输入feature('locale') ,如下图,可以看到默认编码为GBK,那问题就变成了将Matlab的文件编码方式GBK修改成UTF-8; 2.找到你的Matlab安装目录bin文件夹下的lcdata_utf.

zhugby的博客 4万+

Unity坐标系详解:从基础概念到实战应用

在计算机图形学和游戏开发中,坐标系是描述物体位置、方向和空间关系的数学基础。其核心原理是通过定义原点、轴向和单位长度,构建一个参考系来精确表示三维空间中的点与向量。理解坐标系对于实现物体的移动、旋转、缩放以及交互逻辑至关重要,它直接影响到渲染、物理模拟和用户输入处理的正确性。在游戏引擎如Unity中,多重坐标系并存且需相互转换,开发者必须掌握世界坐标系、局部坐标系、屏幕坐标系和视口坐标系的区别与联系。这些知识在角色控制、UI交互、摄像机管理和碰撞检测等应用场景中不可或缺。本文聚焦于Unity坐标系系统,深入

chiman6219的博客 299

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3224

Unity坐标系全解析:从核心概念到AR/UI/Shader五大实战应用

在计算机图形学与游戏开发中,坐标系是描述物体位置、方向和空间关系的基础数学框架。其核心原理是通过定义原点、#轴方向和单位长度,ాలు构建一个ాలు参考系ాలు,从而将抽象的几何概念量化为可计算的数据。掌握坐标系及其转换对于实现#精准的空间定位#、#物体交互#和内容#渲染#至关重要QUESTION_MARK它直接决定了虚拟世界中元素的#位置#、#运动#和#视觉表现#是否准确。在Unity引擎中,开发者需要频繁处理世界坐标系、局部坐标系、屏幕坐标系和视口坐标系之间的转换,以实现诸如AR导航中的虚实对齐、UI元素

weixin_34242331的博客 426

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1844

适航规章、标准,书籍资料下载汇总(增加DO-160G中英文版)

很多读者之前问我有没有DO-160G的资源,现在终于找到啦!如果大家有其他想要的资源,可以在留言区告诉我,有空我会帮大家找找看~文末有下载链接:更新日志:2024-9-28:初版。2024-10-21:增加DO-330英文版PDF下载。2024-10-30:增加DO-160G中文版(非机翻)和英文版PDF下载。以下是一些收集到的适航相关的资料,分享给大家。(如果没有你想要的资料,请留言,等找到会及时更新!

qq_41854911的博客 2756

Unity 判断物体在不在相机视野

private bool IsInView(Transform tran) { Transform camTransform = GameCamMgr.S.gameplayCamera.transform; Vector2 viewPos = GameCamMgr.S.gameplayCamera.WorldToViewport...

秋城迟暮的博客 1562

高数15种常见特殊曲线:星形线、心形线、摆线、对数螺线、双曲螺线、阿基米德螺线、伯努利双纽线、三叶玫瑰线、四叶玫瑰线、六叶玫瑰线、三次抛物线、半立方抛物线、箕舌线、蔓叶线、笛卡儿叶形线、概率曲线

4.1 对数螺线(等角螺线、生长螺线)三叶玫瑰线、四叶玫瑰线、六叶玫瑰线。​7.2 半立方抛物线(尼尔曲线)10.笛卡儿叶形线(茉莉花瓣曲线)常考选择题、填空题,大题也涉及。​4.2 双曲螺线(倒数螺线)11.阿基米德螺线(等速螺线)3.摆线(圆滚线、旋轮线)5.双纽线(伯努利双纽线)1.星形线(四尖瓣线)2.心形线(心脏线)..................

刘鑫磊 1万+

Unity坐标系转换实战:从理论到应用的完整指南

本文深入解析Unity开发中的四大核心坐标系(世界、局部、屏幕、视口),并提供从理论到实战的完整转换指南。通过详细的代码示例,手把手教你掌握坐标系转换方法,解决角色移动、UI交互、3D拖拽等开发中的常见坐标难题,提升开发效率与代码健壮性。

weixin_29015127的博客 429

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Unity实时镜子效果:RenderTexture与摄像机实现与ShaderGraph优化

在实时渲染领域,渲染纹理(RenderTexture)是一种动态的、存在于显存中的纹理对象,它允许摄像机将场景渲染到一张可编程的画布上,而非直接输出到屏幕。其核心原理在于通过创建一个额外的摄像机,并将其目标纹理设置为RenderTexture,从而捕获特定视角的渲染结果。这项技术的核心价值在于实现了动态、实时的图像捕捉与复用,是构建反射、监控屏幕、画中画等效果的基础。在游戏开发中,它被广泛应用于营造沉浸感,例如实现逼真的镜子或水面反射效果。本文聚焦于利用RenderTexture与摄像机搭配,在Unity中

weixin_34314962的博客 345

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: Pixel Coordinates
下一篇: c++17 using继承所有构造函数
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值