当前位置: 首页 > news >正文

【Unity项目经验分享】实现左右分屏裸眼3D程序

1、实现原理

左右分屏原理,左右屏内容左右方向存在些许偏差。通过左右相机,然后左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,然后将左右相机渲染内容通过RenderTexture渲染到Canvas上面的左右RawImage上面。

2、实现具体步骤

2.1 左右相机处理

在主相机下面创建左右相机两个Camera,左侧相机向左侧偏移一点3cm,右侧相机向右侧屏偏移一定3cm,如下

2.2 UI处理

将UI Canvas拖到主相机下面

设置RenderMode为Screen Space - Camera,然后设置距离

再将RenderMode设置为World Space。

2.3 将左右相机渲染内容重新渲染到Canvas上面

创建两个Custom Render Texture,分别为CameraLeft、CameraRight,并设置Size

将左右相机的OutputTexture分别设置为CameraLeft、CameraRight

创建一个Canvas,下面创建两个RawImage,分别占左侧和右侧一半,分别显示左右相机的内容

RawImageLeft设置

RawImageRight设置

将CameraLeft、CameraRight的Render Texture拖拽给对应RawImage

2.4 鼠标位置处理

在Canvas层级最优先的下面创建一个RawImage,设置图标样式

编辑处理脚本FollowMouse,代码如下,并进行如下设置

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;public class FollowMouse : MonoBehaviour
{public RectTransform mouseDown;public RectTransform canvas;public static FollowMouse1 instance;public GameObject obj;public Camera camera;public float screenMinX, screenMaxX, localMinX, localMaxX;public float screenMinY, screenMaxY, localMinY, localMaxY;public Texture2D cursorTexture;private void Start(){Cursor.lockState = CursorLockMode.Confined;Cursor.visible = false;}public void Awake(){instance = this;int width = Screen.width;int height = Screen.height;//Debug.Log(width);//Debug.Log(height);screenMaxX = width;screenMaxY = height;localMinX = -width / 2;localMaxX = width / 2;localMinY = -height / 2;localMaxY = height / 2;}void Update(){}void LateUpdate(){// »ñÈ¡Êó±êÔÚÆÁÄ»ÉϵÄλÖÃVector3 mousePosition = Input.mousePosition;//Debug.Log(mousePosition);// ½«Êó±êλÖÃת»»ÎªUI×ø±êϵϵÄλÖÃRectTransform rectTransform = mouseDown;//Vector2 localPosition = new Vector2();//float outputX = Remap(screenMinX, screenMaxX, localMinX, localMaxX, Input.mousePosition.x);//float outputY = Remap(screenMinY, screenMaxY, localMinY, localMaxY, Input.mousePosition.y);//rectTransform.localPosition = new Vector3(outputX, outputY, rectTransform.localPosition.z);//Vector2 hotSpot = new Vector2(cursorTexture.width / 2f, cursorTexture.height / 2f);//Cursor.SetCursor(cursorTexture, hotSpot, CursorMode.Auto);// ´´½¨Ò»¸öÓÃÓÚ´æ´¢½á¹ûµÄÏòÁ¿Vector2 localPosition;if(RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mousePosition, camera, out localPosition)){rectTransform.localPosition = new Vector3(localPosition.x, localPosition.y, rectTransform.localPosition.z);Vector2 hotSpot = new Vector2(cursorTexture.width / 2f, cursorTexture.height / 2f);Cursor.SetCursor(cursorTexture, hotSpot, CursorMode.Auto);}}float Remap(float a, float b, float A, float B, float value){float lerp = (value - a) / (b - a);float output = A + (B - A) * lerp;return output;}}

http://www.xdnf.cn/news/1447435.html

相关文章:

  • 数据结构之加餐篇 -顺序表和链表加餐
  • 从 0 到 1 实现 PyTorch 食物图像分类:核心知识点与完整实
  • 基础看门狗--idf开发esp32s3
  • PNP具身解读——RSS2025论文加州伯克利RLDG: 通过强化学习实现机器人通才策略提炼。
  • 基于物联网的智慧用电云平台构建与火灾防控应用研究
  • 复杂网络环境不用愁,声网IoT多通道传输实战经验丰富
  • Coze使用教程-插件
  • 袋鼠云产品功能更新报告14期|实时开发,效率再升级!
  • Kafka面试精讲 Day 6:Kafka日志存储结构与索引机制
  • 浏览器插件开发--通过调用本地nmap实现nmap插件扫描
  • python如何解决html格式不规范问题
  • Android使用内存压力测试工具 StressAppTest
  • [嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_用Qt编译linux-Opencv库 测试
  • 显存与内存
  • 【甲烷数据】MethaneSAT 卫星遥感数据
  • 使用DCGAN实现动漫图像生成
  • 树莓集团产教融合:数字学院践行职业教育“实体化运营”要求
  • Ubuntu 系统 LVM 逻辑卷扩容教程
  • 中小企业 AI 转型难?成本、技术、人才三重困境下,轻量化解决方案来了
  • 单位冲击响应频谱
  • python-对图片中的头像进行抠图
  • 确定软件需求的方法
  • 小青苔是什么?
  • C语言(长期更新)第13讲:指针详解(三)
  • GTH收发器初始化和复位全解析
  • 面试复习题-kotlin
  • ArcGIS与GISBox对比:中小企业GIS工具的高门槛与零门槛之选
  • Dify部署全攻略:从零开始搭建AI应用开发平台
  • 【高级】系统架构师 | 信息系统战略规划、EAI 与新技术
  • 华为HCIP、HCIE认证:自学与培训班的抉择