思路:
Kinect的手的節點(這里都是右手,左手的效果一致)在Unity中移動的距離是很小的,你可以用一個物體綁定到手上,然后就能看到具體能夠移動多大的范圍了。
正式開始:1.因為手的移動范圍很小,因此建立一個虛擬的小屏(2D,屏幕坐標),長寬就是你手上下左右移動的最大距離(在Unity中)。
2.換算出虛擬小屏的X/Y軸與實際屏幕的X/Y軸的比例,可以保存可以不保存,這個自己記住就成大小無所謂,甚至可以考慮相應的稍微減少一點值,以方便比你更加瘦小的人使用到全屏功能。但請記住,這個虛擬小屏是固定的不會移動的,要移動的是實際操作的人。
3.將手的世界坐標利用Camera.WorldToScreenPoint(手的Position位置)換算出屏幕坐標點,並保存好Z軸的值。
4.算出手的屏幕坐標與虛擬小屏X/Y軸的比例,然后利用第2步中得到的虛擬屏幕與實際屏幕的比例,可以得到一個虛擬的擴大后的手的屏幕坐標。(具體算法請自己考慮。)
5.利用第5步算出的X/Y軸的值,加上第3步得到的Z軸的值,通過Camera.ScreenToWorldPoint()方法得到在Unity中的世界坐標的Position值(這個值是虛擬出來的)
6.將第5步取得的Position值實時的賦給某個作為鼠標的物體的transform.position.
利用以上6步就能做到鼠標物體全屏移動了。
二。防抖:
因為通過Kinect取得的手的坐標點是在不斷的抖動的,因此,如果你僅僅是利用“一”中的思路去做,可能看到的效果是手在不停的抖動的。因此我們需要防抖。
思路:1不斷的去算鼠標物體(以后用鼠標代替)與“一”中得到的虛擬實際坐標的距離
2.利用Mathf.Lerp來不斷的改變鼠標的Position的值。
3.提示,可以自己設定一個數值變換的速度,然后考慮將距離融入到速度中去。。。
其實上就是將“全屏”的第6步換成上面的1+2兩步。。
三。模擬鼠標點擊:
要利用Kinect去模擬鼠標點擊的功能,必須要使用一個物體作為屏幕中的鼠標代替實際的物理鼠標。然后利用上面的:全屏+防抖方法使Kinect能夠控制鼠標物體滿屏移動。
因為是利用物體模擬的鼠標,所以了,OnMouseDown肯定是沒用的啦。所以要利用到了OnTriggerEnter()和OnTriggerExit()方法了。
為了確保鼠標能夠點擊到按鈕,那么就需要將按鈕的Collider范圍擴大,並且最好能夠保持鼠標和按鈕處在同一平面或者相互平行的平面,且鼠標與攝像機的相對距離要比按鈕與攝像機的相對距離小(若要如此設定,那么在"全屏”中的第6步中,改變的將僅僅是X/Y的值,Z的值用鼠標的原始值;同理,在“防抖”中第2步改變的值也只是X/Y軸的值,Z軸用原始的鼠標物體的值。)。
重點建議:如果要保證鼠標始終在屏幕內,那么最好是用一個正交攝像機去單獨渲染鼠標物體和所有的按鈕。那么以上的所有的計算用到的攝像機類(Camera)都是這次設定的正交攝像機了。
1.若要Unity+Kinect結合進行開發,建議訪問 http://wiki.etc.cmu.edu/unity3d/index.php/Microsoft_Kinect_-_Microsoft_SDK 以及http://channel9.msdn.com/coding4fun/kinect/KinectSDK--Unity3D-Interface-v5-now-Kinect-for-Windows-SDK-v1-compatible 這兩個網址都是介紹如何使用Windos的SDK與Unity結合進行開發的教程。當然,都是英文版,第一個會比較詳細一點。第二個只是簡單的進行了介紹。但是兩個都有具體的Unity項目進行下載。
2.開發Unity與Kinect結合的項目,不需要購買Kinect Sensor for Windows(壇子里有人問到了這個問題) 千萬不要被奸商給坑了。根本不需要的,至於為什么,看1里面提到的兩個網站的教程就知道了。
附加一個問題:我現在開發的項目在編輯器里面能夠正常執行,但是導出成EXE之后卻不能用了,不知道是為什么?我使用的是微軟官方的最新SDK版本。如有童鞋知道,請告知,萬分感謝。
=====================================================================
最近公司主攻Unity+Kinect開發,需要用到很多的Kinect的動作並綁定到Unity中進行操作。
在開發過程中遇到以下幾件小事,可能大家以后開發的時候也需要注意的。
1.人物骨骼綁定之后的,在Unity界面中默認手是不可能完全划到整塊屏幕的。所以需要在Unity中添加一定的算法確保雙手能夠划到整塊屏幕。
2.由於是通過Kinect進行操作,那么OnMouse****之類的方法肯定是用不了的啦。我利用的是發射線,但是這很明顯是個愚蠢的做法。而且很多時候射線出發會出現很多的問題。
3.不同版本的Kinect SDK包是不能通用的(針對微軟官方的SDK),並且非常坑爹是高版本也不兼容低版本?不知道是我同事的腳本寫法有問題還是怎樣。我個人還未研究Kinect的開發。
4.Kinect的坐標系統和Unity的坐標系統都是笛卡爾坐標系,但有一點區別是Kinect與Unity的Z軸是反向的。X/Y軸一致。
5.若需要將手與攝像頭進行位置/角度綁定,那么必須要添加一個腳本,確保手的在某個范圍內時返回一個固定值。若非如此,你會發現攝像頭會像抽風了一樣的抖動,原因是Kinect檢測到的人物手的坐標是不停變換的,即使你感覺你的手沒有動。

