2019獨角獸企業重金招聘Python工程師標準>>>
? ? ? ?在opengl中關于拾取有封裝好的選擇模式,名字棧,命中記錄,實現拾取的功能,相對容易一些。但是到了opengl es里面就比較倒霉了,因為opengl es是opengl的簡化版,很多功能都被去掉了。沒辦法,要想實現拾取的功能只有自己動手。目前比較成熟而且相對較簡單的拾取方案是:射線相交拾取。
? ? ? 先介紹一下射線相交拾取的原理:
? ? ? (1):將用戶在屏幕上點擊的坐標(X, Y),轉換為歸一化坐標(Xn, Yn)
? ? ? (2):考慮到透視投影的可視錐有一個近平面和一個遠平面,所以可以將剛才的歸一化坐標轉換為兩個歸一化坐標,一個的z值在近平面上,z值為-1;另一個的z值在遠平面上,z值為1
? ? ? (3):計算出透視投影的逆矩陣,用這個逆矩陣分別乘以兩個歸一化坐標,相乘之后得到的值分別除以w,也就是做透視除法,這樣就得到了在虛擬空間中的兩個點。
? ? ? (4):用上一步計算出的虛擬空間中的兩個點,生成一條射線。
? ? ? (5):用這條射線和其他的物體做相交檢測。為了便于檢測,可以將要檢測的物體當成一個球體,這樣射線和球體之間是否相交就比較容易檢測了。
?
原本想自己在這篇博客中,將所有的步驟都講的詳細透徹,但是,真正動手才發現自己水平不夠。既然這樣就向大家推薦一處好的資料吧,《opengl es應用開發實踐指南 android卷》的第九章,講的很精彩。
?
? ? ?
?