Unity用相机实现的镜子效果

news2024/9/28 19:20:09

首先登场

场景中的元素
在这里插入图片描述
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了,可以节省一些性能,根据自己情况来。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无需申请专线、无需改动网络,ERP/MES管理系统如何远程访问?

深圳市某模具公司作为一家以设计、制作五金模具、五金冲压、机加工件、加工经营为主的五金企业。为了实现更为高效的生产管理流程&#xff0c;引入了面向钣金/五金行业信息化建设的ERP/MES管理系统及方案&#xff0c;并将其部署在了企业总部的内网服务器。 除了总部访问需求外&…

ThreeJS入门-创建一个正方体

ThreeJs实际上是WebGL的框架&#xff0c;Three.js是在WebGL的api接口基础上&#xff0c;又进行的一层封装。相当于js和JQuery的关系&#xff0c;学习webgl需要图形学知识&#xff0c;而webgl需要通过js和glsl两种语言。如果我们不通过threejs使用webgl势必逃不过底层知识:你必须…

SSRF漏洞(利用file协议读取本地文件)

简介 当利用SSRF漏洞时&#xff0c;攻击者可以通过构造恶意请求来读取本地文件。其中一种方法是使用file协议来读取本地文件。例如&#xff0c;file:///etc/passwd是一个常见的示例&#xff0c;它用于读取Linux系统上的passwd文件。 passwd文件是Linux系统中用于存储用户账户…

Flink——Flink检查点(checkpoint)、保存点(savepoint)的区别与联系

Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能&#xff0c;能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot&#xff0c;从而将这些状态数据定期持久化存储下来&#xff0c;从而将这些状态数据定期持久化存储下来&#xff0c;当Flink程序一…

【C语言】进阶——字符串和内存函数

目录 一&#xff1a;非限制字符串函数 1.strlen &#x1f44a;模拟实现 方法1&#xff1a;计算器法 方法2.指针-指针 方法3.函数调用 2.strcpy &#x1f44a;模拟实现 3.strcat &#x1f44a;模拟实现 4.strcmp &#x1f44a;模拟实现 二&#xff1a;可限制字符串函…

Echarts 旭日图的详细配置过程

文章目录 旭日图 简介配置过程简易示例 旭日图 简介 Echarts旭日图是一种数据可视化图表类型&#xff0c;用于展示层次关系数据的分布情况。旭日图通过不同的环形区域和扇形区域来表示数据的层次和大小关系&#xff0c;从而形成一个太阳的形状&#xff0c;因此得名旭日图。 E…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

Intellij IDEA 提效小技巧

快速找到Controller方法 如果你的项目里有非常多的controller&#xff0c;里面有非常多的http或者resful方法。如何快速找到这些方法呢&#xff1f;这个时候&#xff0c;ctrlaltshiftn就可以派上用场了。 比如说&#xff0c;你依稀记得入账单相关的接口&#xff0c;都有个bil…

让Pegasus天马座开发板用上OLED屏

继上篇《让Pegasus天马座开发板吃上STM8S标准库》移植完标准库之后&#xff0c;于是我又想为天马座开发板添加一块屏幕。终于在我的零件箱底下找到了沉入箱底多年的0.96OLED屏幕。 屏幕介绍 这个是128x64像素的屏幕模块&#xff0c;其使用的SSD1306的驱动IC。而目前该模组&…

软件测试为什么外包更好?权威软件测试外包公司应该具备的资质

软件测试外包公司是一家专门从事软件测试服务的企业&#xff0c;其主要任务是帮助公司或个人进行软件产品的测试工作。相比较于自行开设测试部门或雇佣全职测试人员&#xff0c;外包软件测试具有成本更低、灵活性更高的优势。同时&#xff0c;外包公司通常拥有丰富的测试经验和…

Java高级-Junit单元测试框架

单元测试框架 1.介绍2.案例、断言机制3.常见注解 1.介绍 单元测试 就是在针对最小的功能单元方法&#xff0c;编写测试代码对其正确性测试 Junit单元测试框架 可以对方法进行测试&#xff0c;是第三方公式开源出来的 优点 可以灵活的编写测试代码&#xff0c;可以针对某个…

Stable Diffusion 参数介绍及用法

大模型 CheckPoint 介绍 作用&#xff1a;定调了作图风格&#xff0c;可以理解为指挥者 安装路径&#xff1a;models/Stable-diffusion 推荐&#xff1a; AnythingV5Ink_v32Ink.safetensors cuteyukimixAdorable_midchapter2.safetensors manmaruMix_v10.safetensors counterf…

leetcode刷题笔记——位运算

C/C语言中逻辑右移和算数右移共享同一个运算符>> 如果运算数类型是unsigned则采用逻辑右移&#xff0c;而signed则采用算数右移。对于signed类型的数据&#xff0c;如果需要使用算数右移&#xff0c;或者unsigned类型的数据需要使用逻辑右移&#xff0c;都需要进行类型转…

JAVASE---认识异常

在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。 1.算数异常 2.数组越界异常 3.空指针异常 java中不同类型的异常&#xff0c;都有与其对应的类来进行描述。 异常的体系结构 1. Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子…

阿里云服务器租用费用价格表(2023新版报价)

租用阿里云服务器怎么收费&#xff1f;阿里云服务器配置不同一年价格也不同&#xff0c;阿里云2核2G3M带宽108元一年、2核4G4M带宽297.98元12个月&#xff0c;云服务器u1公网带宽可选1M到5M&#xff0c;系统盘为ESSD云盘40GB起&#xff0c;CPU内存配置可选2核2G、2核4G、4核8G、…

Python爬虫在电商数据获取与分析中的应用

前言 随着电商平台的兴起&#xff0c;越来越多的人开始在网上购物。而对于电商平台来说&#xff0c;商品信息、价格、评论等数据是非常重要的。因此&#xff0c;抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序&a…

BaseRecyclerView - 一个强大的RecyclerAdapter框架

官网 BRVAH 项目介绍 高效的使用RecyclerView应对项目中的常见需求的Adapter&#xff0c;RecycleView从未如此简单&#xff01; BRVAH官方使用指南 BRVAH官方使用指南&#xff08;持续更新&#xff09; - 简书

智慧交通:连接城市未来的纽带

在当今快节奏的现代生活中&#xff0c;交通问题一直是城市面临的重要挑战之一。拥堵、事故和空气污染等问题不仅影响着居民的日常生活&#xff0c;也对经济和环境产生了负面影响。为了解决这些问题&#xff0c;智慧交通作为一项重要的技术和社会创新出现在我们的视野中。 智慧交…

docker镜像相关

docker镜像相关 docker镜像相关理解解释unionFS&#xff08;联合文件系统&#xff09;镜像加载原理docker镜像要采用这种分层结构 重点理解docker镜像commit 操作实例案例演示总结 docker镜像相关理解 解释 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;它包含…

软考高级之系统架构师之企业应用集成EAI

概述 在企业信息化建设的过程中&#xff0c;由于缺乏统一规划和总体布局&#xff0c;往往形成多个信息孤岛。信息孤岛使数据的一致性无法得到保证&#xff0c;信息无法共享和反馈&#xff0c;需要重复多次的采集和输入。信息孤岛是企业信息化一个重要的负面因素&#xff0c;其…