Unity由“鼠标点不准物体”引发的Camera的相关思考

问题        

        前段一个同事在使用Unity开发时遇到一个奇怪的问题,使用左键点击发射射线的方式选择物体,总是选不准,尤其是小的物体,鼠标点击到物体上,有时能选上,有时选不上,偶尔点击到物体旁边反而能选上,于是他让我帮看看咋回事。我第一个想法是也许代码写的有问题吧,但我仔细检查了同事写的代码,规规矩矩,完全没问题。

        就类似下面这种:

if (Input.GetMouseButtonDown(0))
{Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit, 500)){Debug.Log(hit.transform.name);}
}

        我一时也是有点儿发懵,但是当我检查他的摄像机设置时,发现他把摄像机的近剪切平面距离设置的很小,是0.01,同事说是为了避免距离近的物体看不到,只能设置到最小,本来想设置为0,但是Unity不允许,最小就只能是0.01了。好吧,反正我也找不到问题所在,咱不妨把这个值先设置为默认值0.3,排除是这个引发问题的可能吧。结果不可思议的事情发生了,再次运行,马上就能够精确点击了。

为啥(一)

        问题是解决了,但是为什么呢?

        先看看这行代码:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        很多时候,这几乎就是Unity的标准写法,一直以来,我都没有深入的研究过,我一直以为这个ray是从摄像机的位置发射出来,也就是ray.origin这个值应该和摄像机的位置是重叠的,但是,当我把ray.origin打印出来(代码如下)的时候,我发现,这个这值位于摄像机的近剪切平面上,并不和摄像机位置重叠!!!

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.Log(ray.origin);

        但是,这和近剪切距离的值有什么关系呢?

        因为我们会发现,近剪切平面的长宽和近剪切距离是等比关系,如果近剪切距离小,那么意味着近剪切平面的长宽也变得很小,对于

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

这样的代码来说,射线的 ray.origin这个值的位置取决于鼠标在屏幕上的位置映射到近剪切平面的结果,而近剪切平面的长宽越大,越容易获得一个精确的值(这个也实在是没办法的事情,Unity的位置精度是float嘛,而这种精度也不单单是Unity如此,大部分游戏引擎都如此,据说使用Double精度的位置对显卡渲染速度影响很大,同时动力学计算也有问题,当然了,听说而已,没亲身研究过)。

        所以我们可以认为,如果近剪切距离是0.3的话,其精度是近剪切距离0.01的30倍,嗯,好像应该可以这么认为吧。

为啥(二)

        但是为什么射线的起始点不是和摄像机位置重叠,偏偏要放在近剪切平面上呢?仔细想想,好像也很好理解,摄像机只会渲染其视锥体内的物体,不会渲染摄像机所在位置和近剪切平面之间的物体,如果射线的出发点和摄像机重叠,那么就可以点击到摄像机所在位置和近剪切平面之间的物体,而这个物体用户根本看不到!Unity当然不应该让这种事情发生,于是把射线的位置放在了近剪切平面上就成了解决这个问题的绝佳方法!!

为啥啊

        到此为止,我以为一切都在掌握之中,于是我认为,远剪切平面之外的物体也点击不了,不管你在Physics.Raycast方法中把射线发射距离设置为多远!

        然后我把Physics.Raycast方法中的maxDistance设置为2000,因为摄像机默认的远剪切距离为1000,如果我把一个物体放置在远剪切平面之外,那么一定是即渲染不了,也点击不到。然而经过测试,发现并非如此,远剪切平面之外的物体只要在射线发射的maxDistance距离之内,就能够被点击到,哈哈哈哈,为啥啊......

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

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

相关文章

Tensorflow.js 入门学习指南

Tensorflow.js 入门学习指南 官方地址TensorFlow.js (google.cn) Tensorflowjs是一个机器学习框架,使用 TensorFlowJS 可以创建生产级机器学习模型 安装包 浏览器设置 您可以通过两种主要方式在浏览器项目中获取 TensorFlow.js: 使用脚本代码。从 NPM…

基于MATLAB车辆防碰撞系统仿真

摘要 近年来,汽车行业的飞速发展使得我国的汽车保有量快速增长,但由此引发的交通事故导致的人员伤亡数量仍居高不下。从保护人身安全和降低交通事故发生的可能性的角度出发,车辆防碰撞系统能够使驾驶员在没注意到与前方车辆有碰撞危险的情况下…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门👆(在文章最后): 6.…

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源: 12V~24V的直流电源 网络接口&am…

前端知识库Html5和CSS3

1、常见的水平垂直居中实现方案 最简单的方案是flex布局 .container{display: flex;align-items: center;justify-content: center; }绝对定位配合margin:auto(一定要给.son宽高) .father {position: relative;height: 300px; } .son {position: absolute;top: 0;right: 0;b…

PID控制参数整定(调节方法)原理+图示+MATLAB调试

PID控制参数整定(调节方法)原理图示MATLAB调试 Chapter1 PID控制参数整定(调节方法)原理图示MATLAB调试序一、P参数选取二、I的调节三、D的调节四、总结 Chapter2 PID参数调整,个人经验(配输出曲线图&#…

【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键,包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。 之前的LED、蜂鸣器、数码管中IO口都是作为输出使用,这里通过独立按键实验介绍IO口作为输入的使用…

Edge 中的msedgewebview2总想联网

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用Edge浏览器的时候,右下角火绒总会弹出“msedgewebview2”想要联网的弹窗,如下 点击发起程序,找到路径如下: C:\Program Files (x86)\Microsoft\…

zabbix 进阶

zabbix的字段发现机制: zabbix客户端主动和服务端联系,将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点:自定义网段中主机数量太多,登记耗时会很久,而且这个自动发现机制不是很稳定。…

centos6.8下载地址

Index of /centos-store/6.8/isos/x86_64/ (liu.se) archive.kernel.org : http - rsynclinuxsoft.cern.ch : http - rsyncmirror.nsc.liu : http - rsync

被遗忘的书籍

C-被遗忘的书籍_牛客小白月赛82 (nowcoder.com) #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unor…

计组中各种透明性总结

虚拟存储器&#xff0c;对应用程序员不可见。主存- cache层由硬件自动完成&#xff0c;对程序员不可见。cache纯硬件&#xff0c;程序员不可见。内存&#xff0c;对程序员可见。知识点来源&#xff1a;王道模拟第六套主存-辅存层由硬件和操作系统共同完成&#xff0c;对应用程序…

【Docker一】Docker架构、镜像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机” docker的容器技术可用在一台主机上轻松到达为任何应用创建一个轻量级到的&#xff0c;可移植的&#xff0c;自给自足的容器 dock…

免费的数据采集软件,最新免费的几款数据采集软件【2024】

在当今数字化时代&#xff0c;数据是企业决策和业务发展的关键。而如何高效获取数据成为许多企业和研究机构的关注焦点。本文将深入探讨数据采集软件的种类。帮助大家选择最适合自己需求的数据采集工具。 数据采集软件种类 在众多数据采集软件中&#xff0c;有一类强大而多样…

postgresql自带指令命令系列二

简介 在安装postgresql数据库的时候会需要设置一个关于postgresql数据库的PATH变量 export PATH/home/postgres/pg/bin:$PATH&#xff0c;该变量会指向postgresql安装路径下的bin目录。这个安装目录和我们在进行编译的时候./configure --prefix [指定安装目录] 中的prefix参…

跨境电商运营常用的ChatGPT通用提示词模板

市场分析&#xff1a;如何分析目标市场&#xff1f; 选品策略&#xff1a;如何选择要销售的商品&#xff1f; 供应链管理&#xff1a;如何管理供应链&#xff1f; 物流解决方案&#xff1a;如何选择合适的物流解决方案&#xff1f; 跨国支付&#xff1a;如何处理跨国支付&a…

labelimg遇到的标签修改问题:修改一张图像的标签时,保存后导致classes.txt改变

问题描述&#xff1a;修改一张图像的标签时候&#xff0c; classes.txt 会同步更新&#xff0c;导致重新生成了 classes.txt 但是这个 classes.txt 只有你现在写的那个类别名&#xff0c;以前的没有了。 解决&#xff1a;设置一个 predefined_classes.txt&#xff0c;内容和模…

Metasploit渗透测试的漏洞利用和攻击方法

预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…

基于ssm理发店会员管理系统的设计和实现论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此理发店会员信息…

Cache的基本概念和原理

目录 一. Cache的工作原理二. 局部性原理三. 性能分析四. 待解决的问题 \quad 一. Cache的工作原理 \quad 存储系统存在的问题 虽然双端口RAM、多模块存储器提高存储器的工作速度, 但是优化后的速度与CPU差距依然很大, 为了改善这个问题就出现了Cache, 来解决存储器与CPU速度不…