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

这篇具有很好参考价值的文章主要介绍了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距离之内,就能够被点击到,哈哈哈哈,为啥啊......文章来源地址https://www.toymoban.com/news/detail-772540.html

到了这里,关于Unity由“鼠标点不准物体”引发的Camera的相关思考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Camera -- (2)相机投影设置

            和场景视图中的其他游戏物体一样,相机本身也可以通过使用移动和旋转工具来进行调整。但这种方式比较难用,调整起来又慢又不精确。我们可以使用Move To View功能来快速调整相机所拍摄的画面。         1. 打开Camera_Projection_Scene(Scenes目录)。         2. 在Hi

    2024年02月10日
    浏览(45)
  • unity Camera(摄像机)介绍

    目录 一.摄像机类型 1.Perspective (透视摄像机) 2.Orthographic(正交摄像机) 二.摄像机属性 1.Clear Flags 2.Background 背景色 3.Culling Mask 剔除遮罩 4.Projection 投影 5.Field Of View   视野范围 6.Size 大小 7.Clipping Planes 裁剪屏幕 8.Viewport Rect 标准视图矩形 9.Depth 深度 10.Rendering Path 渲染路径

    2024年02月01日
    浏览(44)
  • Java类库中与Camera View框架相关的最佳实践指南

    使用SimpleHttpServer框架进行Java类库的网络测试和调试 原文:使用SimpleHttpServer框架进行Java类库的网络测试和调试 (techdatafuture.com)          简介:     SimpleHttpServer是一个基于Java的简单HTTP服务器框架,能够帮助开发人员进行Java类库的网络测试和调试。它提供了简单易用的

    2024年02月11日
    浏览(41)
  • Camera和Image sensor技术基础笔记(5) -- HDR相关技术

            动态范围最早是信号系统的概念,一种信号系统的动态范围定义为:最大的信号不失真的电平和噪声电平的差,在实际场景中,多用分贝(dB)为单位来衡量一个信号系统的动态范围。         以上说法可能有些抽象,来看两个例子。         1. 假设有一个系

    2024年02月12日
    浏览(53)
  • Unity Camera设置-Culling Mask

    参考文档:Unity中Camera参数—Culling Mask详解_-MCQ-的博客-CSDN博客_unity相机cullingmask 什么是Culling Mask?它是Camera的一个属性, 包含或忽略要由摄像机渲染的对象层。简单来说就是摄像机照射场景中哪些层级的物体。 理解起来比较简单,怎么动态赋值稍微麻烦一点,用过一次之后

    2024年02月15日
    浏览(59)
  • Unity URP 获取Camera Stack

    2024年02月11日
    浏览(46)
  • Unity 2020 URP Camera UI相机问题

    现在正在开发中的项目使用的URP,发现相机结构有变化直接使用场景相机和UI相机无法正常显示。 还是使用两个相机,场景相机使用Base模式,UI相机使用Overlay模式。 在场景相机的Stack中添加UI相机即可。 相当于UI相机叠加在上面,越靠下的相机优先级越高。 这样就可以实现

    2024年02月12日
    浏览(44)
  • Unity中Camera参数—Culling Mask详解

    Culling Mask 如下图所示: 显示层级如下: 应用: Culling Mask :主要是相机针对不同层级的物体进行渲染的操作(想让相机渲染哪个层就勾选哪个层) 层级介绍: unity中的层前7个被unity锁定,由低到高分别是nothing/everything/default/transparentFX/ignore raycast/water/UI 从第8个到第31个可以

    2024年02月11日
    浏览(36)
  • 【unity每日一记】 Camera相机+ Screen屏幕+动画机

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【unity本站最全系列】unity常用API大全

    2024年02月10日
    浏览(73)
  • 【Unity URP】URP Camera使用及动态设置

    官方文档:   摄像机 | Universal RP | 12.1.1 https://docs.unity3d.com/cn/Packages/com.unity.render-pipelines.universal@12.1/manual/cameras.html 相机类型: Render Type(渲染类型) Base(基础相机):渲染到特定渲染目标的通用相机,场景中必须至少有一个。 Overlay(叠加相机):将其视图渲染在另一个摄

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包