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.pswp.cn/news/211249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211249.shtml
英文地址,請注明出處:http://en.pswp.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速度不…