Unity用相机实现的镜子效果

[Unity] 利用RenderTexture与Camera实现镜子效果 阅读详情

首先登场

场景中的元素
在这里插入图片描述
mirror是镜子,挂着我们的脚本,Quad是一个面片。Camera是用来生成RenderTexture给面片的。里面的test1是我用来调试位置的球。
在这里插入图片描述
在这里插入图片描述
镜子size是大小,x是-2,为了反转一下贴图

在这里插入图片描述
相机直接可以禁用掉,用脚本来调用。

玩家就是一个胶囊,里面的eye位置把玩家视角的相机放上去,其他没什么特别的。

代码的原理就是把相机拍摄到的图给Quad的Texture,脚本根据人物的位置来改变位置,并计算近裁面,这里因为有旋转,所以镜子后面最好不要有东西,否则相机会拍摄到,或者用层来避免拍摄到的问题。

附上代码:


using UnityEngine;

//一个用相机当镜子的脚本,相机的FOV可以设置成40
public class MirrorEffect : MonoBehaviour
{
    public float disableDis = 20f;  //超过一定距离就不计算了
    public Transform eye;   //玩家的眼睛
    public Camera mirrorCamera;   //镜子相机
    public Transform targetObject;  //画布


    public Transform test1;
    public Transform test2;
    RenderTexture txture;


    float maxResolution = 1024;//根据宽度计算高度,这个是精度
    float maxWidth;
    float maxHeight;
    void Start()
    {


        maxWidth = maxResolution;
        maxHeight = Mathf.Abs(targetObject.localScale.y / targetObject.localScale.x * maxWidth);
        txture = new RenderTexture((int)maxWidth, (int)maxHeight, 24);

        Renderer rend = targetObject.GetComponent<Renderer>();
        if (rend == null)
        {
            Debug.LogWarning("MirrorEffect找不到Renderer.");
            return;
        }
        mirrorCamera.enabled = false;

        rend.material.mainTexture = txture;
        mirrorCamera.targetTexture = txture;

    }

    private void Update()
    {
        Comput();
    }

    private void OnDestroy()
    {
        DestroyImmediate(txture, true);
    }

    void Comput()
    {


        float dis = Vector3.Distance(eye.transform.position, transform.position);
        if (dis > disableDis)
        {
            return;
        }

        //计算视口高度和宽度
        float frustumHeight = targetObject.transform.localScale.y;

        //float frustumWidth = frustumHeight * mainCamera.aspect;

        //缩放目标面片物体大小
        //targetObject.transform.localScale = new Vector3(frustumWidth, frustumHeight, 1f);
        float distance = frustumHeight * 0.5f / Mathf.Tan(mirrorCamera.fieldOfView * 0.5f * Mathf.Deg2Rad);


        //镜子左右边的位置
        float sz = Mathf.Abs(targetObject.transform.localScale.x);
        Vector3 v3l = new Vector3(sz * -0.5f, 0f, 0f);
        Vector3 v3r = new Vector3(sz * 0.5f, 0f, 0f);
        v3l = transform.TransformPoint(v3l);
        v3r = transform.TransformPoint(v3r);
        //test1.position = v3l;
        //test2.position = v3r;

        //计算相机在镜子对象的局部坐标

        //计算反射位置
        Vector3 dir1 = (v3l - eye.transform.position).normalized;
        Vector3 dir2 = (v3r - eye.transform.position).normalized;

        Vector3 mirDir = -(dir1 + dir2).normalized;

        Vector3 dirref2 = Vector3.Reflect(mirDir, -transform.forward);
        //Debug.DrawRay(transform.position, dirref, Color.yellow, 1f);
        //Debug.DrawRay(transform.position, dirref2, Color.red,1f);



        //相机位于镜子正后方,要保持相机所有平移要水平与镜子
        Vector3 dirref3 = Vector3.ProjectOnPlane(dirref2, transform.up);

        Debug.DrawRay(transform.position, dirref3, Color.green, 1f);

        Vector3 cameraPlace = transform.position + dirref3.normalized * distance;


        mirrorCamera.transform.position = cameraPlace;// new Vector3(at2.x, 0f, distance);
        mirrorCamera.nearClipPlane = distance;

        Quaternion q = Quaternion.LookRotation((targetObject.transform.position - mirrorCamera.transform.position).normalized);
        mirrorCamera.transform.rotation = q;

        mirrorCamera.Render();

    }
}

画质可以修改maxResolution ,disableDis 是20米距离就不进入Update了,可以节省一些性能,根据自己情况来。

最后放一个效果图。
请添加图片描述
镜面清晰,但是算法还是有点问题,比实时反射来的性能好一点。凑合用还行。

Unity镜子效果的实现(无需镜子Shader) Unity镜子效果制作教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速实现一个简单的镜面反射效果为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Cre... 阅读详情

相关推荐

Unity新手必看:5分钟搞定RenderTexture镜子效果(附ShaderGraph优化技巧)

本文为Unity新手提供了实现RenderTexture镜子效果的详细指南,从基础设置到ShaderGraph视觉优化,涵盖反射相机配置、常见问题解决及性能优化技巧。通过实战案例,帮助开发者快速掌握高质量镜子效果的实现方法,特别适合游戏开发和VR场景应用。

weixin_29008805的博客 253

【Unity Shader】渲染纹理实现镜子效果

简单介绍了一下渲染纹理,并利用渲染纹理在Unity中实现了镜子效果。

qq_41835314的博客 2993

Unity镜子shader的应用

有时候会使用到镜子的功能或者倒影的功能,看具体情况需要吧以上就是今天要讲的内容,本文仅仅简单介绍了镜子shader的应用.有需要会在补充的,本次就这么多了。

心疼你的一切博客 2206

Unity 快速实现镜子效果

一、快速搭建一个简单拿的场景 如图,白色的Quad即当作镜子。 二、使用相机纹理 创建一个相机,放到和镜子相同的位置(根据具体效果微调),再新建一个renderTexture,链接到相机的TargetTexture,并赋给镜子的材质球当纹理贴图,如下就能把摄像机拍摄到的东西显示在镜子上。 三、实现镜面效果 我们现实中的镜子是左右反向的,所以要对现有纹理进行UV的反向处理。 为了...

YasinXin的博客 9499

Unity环境镜面效果

Unity环境镜面反射效果 利用Unity提供的设置、Shader、Cube、 简单的设置即可完成对环境的反射效果,无需写代码。 教程地址:https://blog.youkuaiyun.com/chinarcsdn/article/details/80210924

Unity镜面Shader插件

Unity镜面Shader插件

Unity镜子效果实现:RenderTexture与辅助相机方案完全解析

在Unity开发中实现镜面反射,很多开发者第一反应是编写复杂的Shader进行反射计算。然而,通过RenderTexture结合辅助相机的方案,开发者无需依赖Shader即可获得真实感极强的镜子效果。该方案将反射过程前置到相机渲染阶段,利用镜像矩阵将主相机位置关于镜面进行对称映射,辅助相机将场景渲染至RenderTexture,最终作为纹理贴图显示于镜面材质上。这种实现方式原理直观、管线兼容性好,适用于后视镜、试衣镜、监控大屏等场景。同时深入解析了RenderTexture参数配置、镜像旋转处理、斜视锥体裁

weixin_33849215的博客 243

Unity镜子效果、镜面反射效果(无需Shader)即可实现

无需自己找镜子Shader,只需2个脚本即可在Unity中创建一个简单的模拟镜面反射效果。 使用教程链接:https://blog.youkuaiyun.com/Chinar优快云/article/details/80862999

UntiyShader 镜子效果

1、新建RenderTexture 2、在场景中新建一个camera,canera设置如下,targetTexture设置为上一步创建的RenderTexture 3、在场景中新建一个Quad,在Quad中挂上镜子效果shader,代码如下 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Unity Shaders Book/Chapter 10/Mirro

Fanstasic的博客 366

Centos7.6下安装Zabbix6

一、

Overmaster博客 1906

研究生研一学习机器学习ML、深度学习DL的规划

研究生学习机器学习DL、深度学习DL的规划 保上研之后也没有很好规划自己的学习路线,看到b站上的一位清华博士讲述他本科也是机械跨考计算机的学习路线,所以记录下来,从现在开始按照规划来一点一点地做好。 掌握python(推荐一周) 1.1 面向对象编程 廖雪峰python网站: https://www.liaoxuefeng.com 1.2 数据分析Numpy numpy 100题: https://www.yanxishe.com/columnDetail/24784 1.3数据分析pandas pan

没有最好,只有更好 3100

UnityShader_实现镜子效果

主要运用了Unity的RenderTexture,和相机去实现。把相机的物体渲染到Texture上,进行实现的效果。

Leh1ng的博客 1128

IAR for ARM 搭建STM32F103C8T6工程模板(实战指南)

本文详细介绍了如何在IAR for ARM开发环境中为STM32F103C8T6微控制器搭建完整的工程模板。从环境准备、固件库获取、目录结构设计到工程配置与编译调试,提供了实战指南和常见问题解决方案,帮助开发者快速建立稳定的STM32开发环境。

fun88的博客 989

shader镜子效果错误

今天实现了下Unity shader的镜子效果,但是离谱的是跟着书上敲出来的代码,放在书上提供的场景中效果是正常的,我自己搭的场景就出现了左右都会映射,而且一层接一层。可能解释地不太清楚,这里放上图图吧。 用书提供的场景赋予材质和shader的正常效果: 太离谱了,不知道咋改,先放着之后要明白了再回来改这篇博客。

weixin_43789369的博客 583

增量式PID的P和I怎么理解(一)

增量式PID的P、I理解之推翻片 据我所知的资料里关于PID三个参数的理解是这样的:(我这里只说P和I,先不说D) P的作用:比例P可以加快系统调节速度,P过小调节时间变长,响应性不够,P越大响应性越高超调也越严重,过大的P会使系统振荡。 I的作用:消除静差,提高控制精度,I越大越滞后,过大会使系统振荡。 ...

fangchenglia的博客 1万+

普元EOS8.3精简版安装指南:从零开始搭建低代码开发环境

本文详细介绍了普元EOS8.3精简版的完整安装流程。从JDK1.8环境准备、MySQL数据库配置与初始化,到核心配置文件修改、服务启动与登录验证,提供了从零开始搭建低代码开发环境的清晰步骤和常见问题排坑指南,帮助开发者快速部署并体验平台核心功能。

ik678901的博客 1105

Unity 镜子效果

1Create Mirror —— 创建镜子 本教程,无需自己找镜子Shader,只需2个脚本即可在Unity中创建一个简单的模拟镜面反射效果 1. 在场景中创建一个 Plane —— 用来作为镜子 2. 同时创建一个材质球 /Material —— 给到 Plane 上 3. 修改新创建的 Material 的 Shader 为 Unlit/Texture 2Creat...

weixin_30663471的博客 473

工业质检升级!C#上位机集成YOLOv8.3.138+Blob分析:尺寸测量+缺陷检测一步到位

工业场景的技术选型,从来不是“选最先进的”,而是“选最适配的”。这个项目的成功,不在于采用了多前沿的技术,而在于找对了“贴合场景的技术组合”和“落地导向的实施思路”。C#上位机的稳定性保障了系统长期运行,YOLOv8.3.138的精度解决了缺陷检测痛点,Blob分析的抗干扰能力确保了尺寸测量准确,三者结合实现了“1+1+1>3”的效果。先摸透场景,再选技术:不要盲目追求最新模型,先深入了解车间环境、生产节奏、精度要求,选择兼容性强、稳定性高的技术方案;数据质量决定模型性能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 611

10.4高光纹理-镜子效果

//高级纹理-镜子效果 //创建RenderTexture 并付给相机镜子,创建一个quad当作镜子,并赋值材质 //使用渲染纹理作为输入属性,并把渲染纹理的水平向上反转 o.uv.x=1-o.uv.x Shader "Unity shader book/Chapter 10/Mirror" { Properties { _MainTex("Main Tex",2D) = ...

qq_22660469的博客 273

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

uniapp - 实现 App 端 “半屏幕“ 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程

uniapp app端实现半屏幕扫码,uniapp 扫一扫半个屏幕,uniapp 扫一扫,uniapp持续扫码实现,uniapp怎么自定义扫码和连续扫码,uni-app App端半屏连续扫码,uniapp 扫一扫半个屏幕,uniapp自定义扫码页面样式,实现连续扫码功能(uniapp),uniapp - 实现 App 端 "半屏幕" 连续扫码功能,页面只有半个屏幕是扫码框并且可持续连续扫码获取数据(不使用官方 uni.scanCode API,因为无法连续扫码!)详细示例源码插件教程。

✅ 精选推荐文章 1万+

如何在Unity中实现镜面效果

【代码】如何在Unity中实现镜面效果。

2302_76776557的博客 845

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Unity 互相反射的镜子

Unity互相反射的镜子 思路 使用2个相机分别渲染镜子的反射结果到RednerTarget 2个相机相对 使用2个材质分别显示渲染结果到物体

TDC的专栏 426

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于Unity渲染纹理的拍照方案

通过创建渲染纹理,将相机的渲染目标设置成该纹理,即可将相机捕获到的内容作为一张纹理渲染到你想要的地方。基于渲染纹理的技术除了可以实现一些拍照的功能以外,还能进行扩展,比如生成一些动态头像,或者镜子效果等。3.将对应的方法绑定按钮响应事件。

weixin_43671974的博客 658

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: C#小知识 - 技巧合集
下一篇: Unity下tga和png格式图片打包成AB包大小和加载速度测试
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论 2
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值