拾取模型的原理及其在THREE.JS中的代碼實現

?

1.?Three.js中的拾取?

?

?

?

1.1.?從模型轉到屏幕上的過程說開

?

??由于圖形顯示的基本單位是三角形,那就先從一個三角形從世界坐標轉到屏幕坐標說起,例如三角形abc

?

?

?

?

?

?

?

?

?

乘以模型視圖矩陣就進入了視點坐標系,其實就是相機所在的坐標系,如下圖:

?

?

?

進入視點坐標系后,再乘以投影矩陣,就會變換到一個立方體內,如下圖:

?

?

?

這個時候整個三角形就位于中心位于坐標系原點,邊長為2的立方體內,在這個立方體內,三角形要計算光照,要裁剪,然后乘以視口矩陣,最后轉到屏幕上。

?

?

?

?

?

轉到屏幕上后,三角形的所有點的Z坐標就是深度坐標,一定在(0, 1)這個區間內,那么哪些點的Z坐標是0呢,在投影坐標系中,一定是投影視景體的前剪切平面上的點,而投影視景體的后剪切平面上的點的Z坐標就是1

?

1.2.?思路來了

?

???根據以上三角形轉換到屏幕坐標上的過程可以分析出,鼠標在屏幕上點擊的時候,可以得到二維坐標p(x, y),再加上深度坐標的范圍(0, 1), 就可以形成兩個三位坐標A(x, y, 0), B(x, y, 1), ?由于它們的Z軸坐標是01,則轉變到投影坐標系的話,一定分別是前剪切平面上的點和后剪切平面上的點,也就是說,在投影坐標系中,A點一定在能看見的所有模型的最前面,B點一定在能看見的所有的模型的最后邊,假設視口矩陣的逆矩幀,投影矩陣的逆矩陣,模型視圖矩陣的逆矩陣為M, N, P,則?P * N * M * A = A1, ?P * N * M * B = B1, 在世界坐標系中,點A1B1就可以形成一個射線,此射線和模型再求交,就能選中模型。如下圖是在視點坐標系中的情形。注意,求交可以在視點坐標系或者世界坐標系計算都可以,但一般會在世界坐標坐標系中計算。

?

?

?

1.3.?拾取的優化,射線和AABB包圍盒求交

?

????如果射線和所有的模型求交,顯然不是一個好辦法,一般情況下會進行一些優化,比如先和模型的包圍盒求交,如果和模型的包圍盒不相交的話,就放過去,否則就接著往下進行,和模型的所有三角面片求交。

?

??????那么什么是包圍盒呢?在計算機圖形學與計算幾何領域,一組物體的包圍體就是將物體組合完全包容起來的一個封閉空間。將復雜物體封裝在簡單的包圍體中,就可以提高幾何運算的效率。通常簡單的物體比較容易檢查相互之間的重疊。其中有一種包圍盒叫做AABB,?AABB的全稱是axis aligned bounding box,就是我們常常提到軸向包圍盒,這個盒子的邊是平行于x/y/z軸的。?所有的2d3d物體都是由點組成的,所以只要找出這些物體的最大值點和最小值點,那么就可以使用這兩個點表示該物體的AABB包圍盒了。
? ? ? ?檢測碰撞的時候我們只需要檢測這些物體的AABB(即他們的最大值點和最小值點)是否相交,就可以判斷是否碰撞了。

?

?

?

?

?

?

?

1.4.?射線和三角形相交

?

?????判斷射線和包圍盒是否求交后,就輪到判斷是否和三角形求交了,最先想到的是 首先判斷射線是否與三角形所在的平面相交,如果相交,再判斷交點是否在三角形內。判斷射線是否與平面相交, 判斷點是否在三角形內.

?

1.5.?THREE.JS中求交的代碼實現

?

??three.js中的一個案例,名字叫webgl_interactive_lines.html,可以選中一根線,并顯示一個小球。根據以上的思路,代碼注釋如下:

?

//鼠標點擊的屏幕坐標轉換到視點坐標系

?

var vector = new THREE.Vector3( mouse.x, mouse.y, 1 ).unproject( camera );

?

?//在視點坐標系中形成射線

?

?raycaster.set( camera.position,vector.sub( camera.position ).normalize() );

?

?//射線和模型求交,選中一系列直線

?

var intersects = raycaster.intersectObjects( parentTransform.children, true);

?

if ( intersects.length > 0 ) {

?

if ( currentIntersected !== undefined )

?

?{

?

?currentIntersected.material.linewidth = 1;

?

?}

?

???//第一個直線

?

currentIntersected = intersects[ 0 ].object;

?

currentIntersected.material.linewidth = 5;

?

????//把球設為可見,并且位置移到鼠標點擊的屏幕位置

?

sphereInter.visible = true;

?

????sphereInter.position.copy( intersects[ 0 ].point );

?

}

?

歡迎加微信 nuonuodi_1, 交流更多的技術問題

?

轉載于:https://www.cnblogs.com/lizhengjin/p/5914216.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

StringBuilder-C#字符串對象

博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 在C# 中,string是引用類型,每次改變string類對象的值,即修改字符串變量對應的字符串,都需要在內存中為新的字符串重新分配空間。在默寫特定的情況…

java 19 - 11 異常的注意事項

1 /*2 * 異常注意事項:3 * A:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)4 * B:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常5 * C:如果被重寫的…

數組去重的各種方式對比

數組去重,是一個老生常談的問題了,在各廠的面試中也會有所提及,接下來就來細數一下各種數組去重的方式吧; 對于以下各種方式都統一命名為 unique,公用代碼如下: // 生成一個包含100000個[0,50000)隨機數的數…

Linux平臺Makefile文件的編寫基礎篇和GCC參數詳解

問:gcc中的-I.是什么意思。。。。看到了有的是gcc -I. -I/usr/xxxxx..那個-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默認的頭文件搜索路徑(比如/usr/include等)外,同時還在路徑xxx下搜索需要被引用的頭文件。 所以你的gcc …

舊知識打造新技術--AJAX學習總結

AJAX是將舊知識在新思想的容器內進行碰撞產生的新技術:推翻傳統網頁的設計技術。改善用戶體驗的技術。 學習AJAX之初寫過一篇《與Ajax的初次謀面》。當中都僅僅是一些自己淺顯的理解,這次就總結一下它在歷史長河中的重要地位。 【全】 AJAX全稱為Asnychr…

C#數組基本操作

文章目錄簡介數組排序和反轉語法實例查找數組元素語法實例數組元素求和、最大值、最小值、平均值語法實例數組字符串相互轉化語法實例在字符串中查找、刪除字符數組元素語法實例博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 C#提供了許…

redis(一)--認識redis

Redis官網對redis的定義是:“Redis is an open source, BSD licensed, advanced key-value cache and store”,可以看出,Redis是一種鍵值系統,可以用來緩存或存儲數據。Redis是“Remote Dictionary Server”(遠程字典服…

轉:如何用gcc編譯生成動態鏈接庫*.so文件 動態庫

轉:如何編譯.so動態庫問:我源文件為main.c, x.c, y.c, z.c,頭文件為x.h,y.h,z.h如何編譯成.so動態庫?編譯器用gcc最好能給出詳細參數解釋,謝謝答:# 聲稱動代連接庫,假設名稱為libtest.sogcc x.c y.c z.c -f…

工業鏡頭的主要參數與選型

文章目錄簡介1、鏡頭的分類(1) 以鏡頭安裝分類(2) 以攝像頭鏡頭規格分類(3) 以鏡頭光圈分類(4) 以鏡頭的視場大小分類(5) 從鏡頭焦距上分2、選擇鏡頭的技術依據(1) 鏡頭的成像尺寸(2) 鏡頭的分辨率(3) 鏡頭焦距與視野角度(4) 光圈或通光量3、變焦鏡頭(zoom lens&…

SQLSEVER 中的那些鍵和約束

SQL Server中有五種約束類型,各自是 PRIMARY KEY約束、FOREIGN KEY約束、UNIQUE約束、DEFAULT約束、和CHECK約束。查看或者創建約束都要使用到 Microsoft SQL Server Managment Studio。1. PRIMARY KEY約束 在表中常有一列或多列的組合,其值能唯一標識表…

數據庫 sqlite 進階

http://www.cppblog.com/czy463/archive/2013/12/16/204816.html 董淳光 前序: Sqlite3 的確很好用。小巧、速度快。但是因為非微軟的產品,幫助文檔總覺得不夠。這些天再次研究它,又有一些收獲,這里把我對 sqlite3 的研究列出來&a…

形象的列舉-C# 枚舉

文章目錄簡介例子分析點撥博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 枚舉類型用于聲明一組命名常數。 定義枚舉類型語法格式如下:enum 枚舉數組名{枚舉成員列表};例如: enum week{星期一,星期二…

Confluence 6 手動備份站點

2019獨角獸企業重金招聘Python工程師標準>>> Confluence 被配置自動備份數據,使用壓縮的 XML 格式。同時你也可以通過 Confluence 的 管理員控制臺(Administration Console)手動進行備份。 你需要具有 System Administrator 權限才…

編寫高質量的Makefile

分類: c/c研究 GNU&LINUX2010-09-12 15:31163人閱讀 評論(0)收藏舉報源地址 :http://acm.hrbeu.edu.cn/forums/index.php?showtopic1827&st0&gopid8924&#entry8924 一、前言 回想自己的第一個Makefile,是這個樣子的 …

第六篇:python基礎之文件處理

第六篇:python基礎之文件處理 閱讀目錄 一.文件處理流程二.基本操作2.1 文件操作基本流程初探2.2 文件編碼2.3 文件打開模式2.4 文件內置函數flush2.5 文件內光標移動2.6 open函數詳解2.7 上下文管理2.8 文件的修改一.文件處理流程 打開文件,得到文件句柄…

前端每日實戰:56# 視頻演示如何用純 CSS 描述程序員的生活

效果預覽 按下右側的“點擊預覽”按鈕可以在當前頁面預覽,點擊鏈接可以全屏預覽。 https://codepen.io/comehope/pen/YvYVvY 可交互視頻 此視頻是可以交互的,你可以隨時暫停視頻,編輯視頻中的代碼。 請用 chrome, safari, edge 打開觀看。 ht…

從特殊到一般-C#中的類

文章目錄類的概念類的定義實例例子分析類的成員數據成員屬性成員方法成員靜態成員博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 類的概念 在日常生活中,類是對具有相同特性的一類是物的抽象。比如水果是一個類,它是對…

Chapter 1 First Sight——30

The girl sitting there giggled. Id noticed that his eyes were black — coal black. 那個坐在那里的女孩笑著。我注意到她的眼睛是很色的--炭黑色的。 Mr. Banner signed my slip and handed me a book with no nonsense about introductions. Banner 先生簽了我的名字然后…

GPU 與CPU的作用協調,工作流程、GPU整合到CPU得好處

在不少人的心目中,顯卡最大的用途可能就只有兩點——玩游戲、看電影,除此之外,GPU并沒有其他的作用了。但是隨著微軟IE9的正式發布,不少人突然發現,微軟一直提到一個名詞:GPU硬件加速,從而也讓不…

[luoguP1029] 最大公約數和最小公倍數問題(數論)

傳送門 一.暴力枚舉&#xff08;加了點優化&#xff09; #include <cstdio>int x, y, ans;inline int gcd(int x, int y) {return !y ? x : gcd(y, x % y); }inline int lcm(int x, int y) {return x / gcd(x, y) * y; }int main() {int i, j;scanf("%d %d", …