3D模型在UI中的RenderTexture显示

【cocos2dx】之RenderTexture实现截图 cocos2dx之RenderTexture 大家好,我是Lampard 今天与大家探讨一下cocos中实现截图所使用到的类RenderTexture (一)使用RenderTexture实现截图功能 cocos实现截图可以通过两种方式。第一种就是今天将要介绍的使用renderTexture类去实现,第二种是利用cocos2dx在3.2版本之后给我们提供的utils:captureScreen()... 阅读详情

通常简单的做法
用一个Orthographic相机来做UI相机,Canvas的RenderMode用ScreenSpace-Camera . 这种直角相机照射的3D模型显示有问题,所以需要另外一个Perspective的锥形透视相机来单独照射模型。UI的直角相机设置CullingMask不照射模型。Perspective相机可以用SolidColor模式,背景色的alpha设置为0。
这样的简单做法就可以满足基本的需求了。

上面的做法的问题就是,如果有两个界面重叠都有3D模型,那么就会出现层次渲染问题。
那么进一步优化,给相机加RenderTexture,然后把透视相机拍摄的图像挂载在RawImage里问题就解决了。
创建一个RenderTexture,默认大小是256x256的,如果要清晰点可以设置成1024x1024。

不同的手机分辨率不同的,可能带来RawImage大小不同导致位置不对的问题。
我的CanvasScaler的UIScaleMode设置的是ScaleWithScreenSize.
Reference Resolution x:1080 y:1920

所以我想我只要给UI中心放一张RawImage来呈现Render。能动态计算出RawImage的宽和高就可以了。
我的Canvas的PlaneDistance设置的10,所以相机刚好距离Canvas10米的位置,锥形透视相机在UI直角主相机的子级,本地坐标是0。方便观察和计算。
首先计算出透视相机刚好在UI的视口的等距离的4个点的位置,如图:黄色的框就是计算出的位置。
在这里插入图片描述
计算这个网上有很多代码,贴一个上来。

Vector3[] GetCorners(float distance)
    {
        Vector3[] corners = new Vector3[4];
        Transform tx = theCamera.transform;
        float halfFOV = (theCamera.fieldOfView * 0.5f) * Mathf.Deg2Rad;
        float aspect = theCamera.aspect;

        float height = distance * Mathf.Tan(halfFOV);
        float width = height * aspect;

        // UpperLeft
        corners[0] = tx.position - (tx.right * width);
        corners[0] += tx.up * height;
        corners[0] += tx.forward * distance;

        // UpperRight
        corners[1] = tx.position + (tx.right * width);
        corners[1] += tx.up * height;
        corners[1] += tx.forward * distance;

        // LowerLeft
        corners[2] = tx.position - (tx.right * width);
        corners[2] -= tx.up * height;
        corners[2] += tx.forward * distance;

        // LowerRight
        corners[3] = tx.position + (tx.right * width);
        corners[3] -= tx.up * height;
        corners[3] += tx.forward * distance;

        Debug.Log("0:"+corners[0] + "UpperLeft -> UpperRight dis:" + Vector3.Distance(corners[0], corners[1]));
        Debug.Log("1:" + corners[1] + "UpperRight -> LowerRight dis:" + Vector3.Distance(corners[1], corners[3]));
        Debug.Log("2:" + corners[2] + "LowerRight -> LowerLeft dis:" + Vector3.Distance(corners[3], corners[2]));
        Debug.Log("3:" + corners[3] + "LowerLeft -> UpperLeft dis:" + Vector3.Distance(corners[2], corners[0]));

        Debug.DrawLine(corners[0], corners[1], Color.yellow ) ; // UpperLeft -> UpperRight
        Debug.DrawLine(corners[1], corners[3], Color.yellow); // UpperRight -> LowerRight
        Debug.DrawLine(corners[3], corners[2], Color.yellow); // LowerRight -> LowerLeft
        Debug.DrawLine(corners[2], corners[0], Color.yellow); // LowerLeft -> UpperLeft
        }

观察输出坐标发现4个边之间距离是相同的,因为我们的相机没有改过ViewportRect相关参数。

所以我们只用取左上角的一个点就可以计算出RawImage的宽度和高度。
下面的代码就很简单就计算出来了。

            Vector3 scrPos = theUICamer.WorldToScreenPoint(corners[0]);  //计算左上角的点在UI相机中的位置
            float w = (Mathf.Abs(scrPos.x) + Screen.width / 2) * (1080f / Screen.width) * 2; //计算在当前分辨率的宽度 1080是CanvasScaler的x


            Debug.Log("lt:" + theUICamer.WorldToScreenPoint(corners[0]));
            Debug.Log("w:" + w);

            if (rawimage != null)
            {
                rawimage.sizeDelta = new Vector2(w,w);
            }

这样我们把rawimage放在UI正中心就可以正确的显示RenderTexture里的内容了。

另外可能还遇到一些问题
如果模型不动,可以用相机的Depth模式。如果动可能有重影,就改成SolidColor。但是对于半透明效果的,锥形透视相机可能不能正常显示,可以加一个2D Sprite放在模型后方,否则alpha Blend不会计算 , 具体怎么做后面有空在研究。如果是纯色还好,如果有底图那么可能要计算2D Sprite的位置和大小.

Unity RenderTexture 与 RawImage 实战:3D模型UI显示性能与特效兼容性深度解析 本文深入解析Unity中RenderTexture与RawImage在3D模型UI显示中的性能优化与特效兼容性问题。通过实战案例和代码示例,详细介绍了Alpha混合异常、色差失真等常见问题的解决方案,并提供了性能优化指标和高级特效兼容方案,帮助开发者提升移动游戏开发效率。 阅读详情

相关推荐

创建小地图 && UI(UMG)上显示Mesh

UE4.20 利用第三人称项目,创建一个小地图 1.打开第三人称项目,在Character的相机组件上添加一个组件SceneCaptureComponent2D

fee_liang的博客 994

【Unity】Render Texture的实际应用(个人翻译)

Unity Render Texture的应用

sylardie的博客 3714

从零开始:PLUMED与GROMACS整合安装全攻略

本文详细介绍了如何从零开始整合安装PLUMED与GROMACS,包括系统环境检查、MPI配置、PLUMED编译安装、GROMACS补丁应用及常见问题解决方案。通过本教程,研究人员可以快速完成分子动力学模拟工具的整合安装,实现增强采样和自由能计算功能。

weixin_42520796的博客 292

Unity | RenderTexture

一、相关概念 RenderTexture是可以被渲染的纹理,简称渲染纹理。一般来说,RenderTexture可以应用在制作动态阴影,反射以及监视摄像机(车辆后视镜)等,另一方面可以应用到游戏截图,背景模糊等方面。 Camera(摄像机)是Unity中非常重要的一个组件,其中有一个属性叫做TargetTexture,在设置了TargetTexture后,Camera会在渲染时将其屏幕上的图像...

该用户还没想到好的昵称的博客 4431

Silvaco Atlas入门指南——从零开始掌握半导体器件仿真

本文为Silvaco Atlas半导体器件仿真软件的入门指南,详细介绍了从零开始掌握该工具的核心流程。内容涵盖Atlas的基本概念、仿真流程、核心文件(输入、结构、输出文件)、交互式与批处理两种操作模式,并逐步演示了如何从定义网格、划分区域、设置电极到进行掺杂、选择物理模型并求解,最终获取和分析器件特性的完整步骤。旨在帮助微电子相关专业人员和工程师快速上手这一强大的“数字实验室”,提升半导体器件设计与研发效率。

weixin_29306317的博客 402

浅谈向量检索

文章目录浅谈向量检索背景什么是向量什么是向量检索距离度量检索方法ANN的基本思路举个容易理解栗子举个正常的例子具体算法树方法KD-TreeAnnoyHash方法LSH 算法矢量量化方法乘积量化码本的建立码字搜索算法倒排乘积量化临近图方法HNSW 算法朴素想法Delaunay算法NSW 主要思想NSW构图NSW查找参考 浅谈向量检索 背景 索引一直被认为是检索引擎最重要的组成部分,之所以数据库能够快速的查询出来结果。系统设计中很多常见的多种数据结构都是为了快速命中索引设计的, 比如 红黑树、跳跃表、倒排索引、

qq_42828391的博客 6553

使用渲染纹理(RenderTexture)来实现3D视觉

然后创建一个新的Texture,其Shader属性设置为“Unlit/Texture”,再将刚刚的渲染材质拖到这个材质是哪个的MainTexture即可。然后将这个对象拖到Camera的Target Texture属性中,这样摄像机就会将它排到的图像都渲染到这个纹理上。特别是3D环境下这两个概念的理解。如上图的效果,使用2D场景,通过摄像头的改动,使其看起来像是3D效果一样。然后我们将这个材质设置为圆柱体的材质,这样,内容就显示到圆柱体上了。从材质预览也可以看到,我们已经将2D的画面,转换为3D的内容了。

grf123的专栏 1006

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

【Unity Shader】半透明特效在RenderTexture上的显示问题

0x00现象 下图可见,模型的翅膀部分有黑色的矩形。 游戏项目中,需要模型显示在UI上,这里采用了RenderTexture的方案,可以参考使用RenderTexture实现3D模型与UI的组合显示。 RenderCamera Background(0,0,0,0) 0x01寻找原因 首先查看RenderTexture的绘制是否正常 由于粒子特效常常会对alpha进...

coffeecato的个人博客 1万+

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 108

基于高光谱的物质反演与分类 — 技术文章(原理详解 + 深度代码实现)

高光谱遥感 / 近场光谱采集产生逐像素上百波段的光谱曲线,是物质识别与定量反演(abundance / composition estimation)和语义分类(landcover / material class)的一把利器。本文第一部分对常用模型(线性混合模型、非线性辐射传输、稀疏反演、降维与特征选择、分类器/神经网络)进行数学推导与理论分析;第二部分给出两套完整实现:A. 基于 LMM 的约束最小二乘 / 稀疏反演流水线(含端到端评估);

VectorShift的博客 221

使用RenderTexture实现3D模型与UI的组合显示

引言 游戏中常见的功能如角色创建选择,NPC对话等功能中,需要3D模型与UI的组合显示,该如何实现呢? 如何实现 首先想到添加一个3D camera将3D模型画出来,利用Camera中的Target Texture属性来缓存绘制的3D形象,再设置相应的位置,旋转等属性。 实现环境 利用NGUI\Examples\Scenes\Example X - Character的场景来进行实验。

coffeecato的个人博客 9311

Qt C++ HTTP 调用通义千问大模型 X 学术论文润色工具(SCI 格式适配)

请求地址:`https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation`;| Windows | 打包时携带 `Qt6Network.dll`/`libcrypto-1_1-x64.dll` 等依赖;| Linux | 安装 `libssl-dev` 和 `libcurl4-openssl-dev`;| API 调用失败 | 检查 API-KEY 是否有效;

寒寒豆豆软件公司的博客 104

Unity中如何通过UI显示3D模型解决方案?

需求:实现将3D模型显示在2DUI上面,实现王者荣耀英雄商城之中英雄展示功能,3D模型可以旋转,添加特效等正常3D功能。 使用RenderTexture和RawImage做相机映射 使用ScreenSpace Camera渲染摄像机 使用世界空间的UI和模型绑定 使用RenderTexture 和RawImage做相机映射 效果: 实现: Project面板创建一个RawImage 创建一个Camera,通过设置渲染模式控制模型显示的 创建一个Re..

KeithPro的博客 1万+

RK3568平台开发系列讲解(NPU篇)什么是RKNPU

📢本篇章将介绍RKNPU。

内核笔记 4357

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

使用RawImage把3D模型显示在UI上

使用RawImage把3D模型显示在UI上 在Hierarchy上右键进行创建一个RawImage。 在Project面板上进行右键创建一个Render Texture。 把刚刚进行创建的Render Texture拖拽到RawImage的Texture中,这个时候在场景视图中的RawImage会变得透明。 在画布的外面进行创建一个空物体作为父物体 然后在这个空物体下面进行创建一个摄像机 把Ra...

weixin_43333566的博客 1495

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

使用Render Texture在UI上显示3D模型动画

1.首先需要新建一个Render Texture,调试好相对应的属性。这里要注意Size尽量和后期UI上的大小相对应,要不然投射出来的会很糊。 2.若是要在UI上显示3D模型及其动画,就要确保模型在场景里能被某个摄像机拍到。我们把模型放在场景中,并且新建一个摄像机对准模型。 3.然后来调整这个摄像机的属性,首先要把Render Texture拖拽到Target Texture中。然后根据实际情况来调整Depth,记得勾选掉AudioListener防止发生冲突。 若此模型不是常驻在UI中,需要特殊情况

y1139735983的博客 1904

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

在UGUI上显示3D模型,并限制范围的拖拽

通过RenderTexture实现 显示图片 记得在用NGUI的时候,就是用这种方式实现在UI上显示模型的。 首先新建一张RenderTexture,右键点击Project窗口,Create->Render Texture; 新建一个Shader ,将刚刚新建的RenderTexture 拖入Shader中。    新建一个Cube 和一个相...

andyfan1366的博客 501

Unity中在界面上显示3D模型的方法

我们在mmo中通常会有在GUI上面显示一个3D模型的需求,比如查看人物装备的界面。我网上搜索了下,搜到的结果都是直接绑定一个模型到UI的指定位置,最多添加一个摄像机以便控制2d渲染和3d模型渲染的先后层次关系。NGUI和Daikon Forge的Demo中也是这么做的。这么做比较直接简单,通过一个新的摄像机并指定渲染内容和层级确实也可以一定程度上解决模型和GUI的遮挡问题。但是这个方法并不...

各研发管理 3112

UNITY把3D模型显示在UI层级上的思路

UNITY把3D模型显示在UI层级上的思路 一般UI是处理于显示最高层级的, 因此这里的做法是使用镜子效果,做镜子可使用renderTexture 然后启用一个摄像机对renderTexture进行数据填充, 然后在ui上使用Raw Image控件,读取renderTexture来显示 效果如下: ...

SilverFoxGame的博客 1504

Unity中将3D模型显示在UI上或者显示在UI前面

标题 Unity中将3D模型显示在UI上或者显示在UI前面 一、将3D模型显示在UI上—使用RawImage和Render Texture组合实现效果 1、创建一个RawImage控件 2、创建一个Render Texture,然后可以调节参数,截图如下: 3、需要创建一个单独的摄像机去渲染3D物体,将3D物体渲染到RawImage上,设置如下: 4、我们想要将3D物体单独渲染到独立的摄像机上面,因此需要对3D物体和摄像机进行相应的设置,首先需要添加一个Layer,我们这里命名为modle,然后把需要

qq_37179591的博客 2万+

ugui unity3d 仪表盘_Unity如何在UI界面上显示3D模型

使用Unity引擎做开发时,想在UI界面上显示一个人物的3D模型,那么要如何才能实现呢?考虑到有些人还不会,下面就给大家介绍下在UI界面上显示3D模型的方法,一起来看看吧。1、创建一个3D摄像机,渲染3D模型。(我为了方便就把模型放到了Camera的下面,你可以不这样)2、在2D里面指定一个TopLeft和BottomRight,用来表示模型渲染到UI上面的区域。3、在之前的3D摄像机上挂上UIV...

weixin_39920338的博客 653

Creator3D:太厉害了!3D模型原来可以这样显示在2DUI上

国庆,元旦收假了,菜鸟在这里给大家道声祝福: 同时可能不少人都已经知道,就在放假前,Creator3D 1.2.0 正式版 已经发布。菜鸟后边的自学demo也将全部用1.2.0,大家在打开demo时一定要注意版本奥。 前言 今天菜鸟分享一个小的技术点:3D模型应该怎样显示到2D的ui层上边。最近逛论坛经常看见有关于这个问题的帖子,正好菜鸟后边也要用到,那就提前研究一下。下边将实现的两种方式简单说明一下。 效果 咱们还是先来看看效果: 1.UIMeshRenderer 组件实现效果 刚接触1.2.0版本的人

carlos13207的博客 2915

Unity3D RenderTexture实现3D立绘

NGUI有个Demo,实现了这个功能,UI界面显示一个3D模型,但是这种方法并不具备适用性。 现在我们的项目中还没用到这种超前的3D界面设计,我们常用的UI都是由大堆的UI通过层级堆叠出来的。 那按照我们现在UI的制作方法怎么实现这种UI界面显示3D模型,3D模型还可以自由徐旋转运动的功能呢。 RenderTexture就是一种很好用的方法。 1.首先我们需要一个UITexture在U

cbbbc 8981
上一篇: Unity系统Cube的法线
下一篇: Android Studio取消代理
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值