在opengl中關於拾取有封裝好的選擇模式,名字棧,命中記錄,實現拾取的功能,相對容易一些。可是到了opengl es裏面就比較倒黴了,由於opengl es是opengl的簡化版,不少功能都被去掉了。沒辦法,要想實現拾取的功能只有本身動手。目前比較成熟並且相對較簡單的拾取方案是:射線相交拾取。android
先介紹一下射線相交拾取的原理:開發
(1):將用戶在屏幕上點擊的座標(X, Y),轉換爲歸一化座標(Xn, Yn)博客
(2):考慮到透視投影的可視錐有一個近平面和一個遠平面,因此能夠將剛纔的歸一化座標轉換爲兩個歸一化座標,一個的z值在近平面上,z值爲-1;另外一個的z值在遠平面上,z值爲1原理
(3):計算出透視投影的逆矩陣,用這個逆矩陣分別乘以兩個歸一化座標,相乘以後獲得的值分別除以w,也就是作透視除法,這樣就獲得了在虛擬空間中的兩個點。opengl
(4):用上一步計算出的虛擬空間中的兩個點,生成一條射線。生成
(5):用這條射線和其餘的物體作相交檢測。爲了便於檢測,能夠將要檢測的物體當成一個球體,這樣射線和球體之間是否相交就比較容易檢測了。封裝
本來想本身在這篇博客中,將全部的步驟都講的詳細透徹,可是,真正動手才發現本身水平不夠。既然這樣就向你們推薦一處好的資料吧,《opengl es應用開發實踐指南 android卷》的第九章,講的很精彩。