Kinect Scripts文件夾下所有managers(管理器)的用途:
這些在KinectScripts文件夾下的管理器都是組件,你可以根據你想實現的功能在項目中使用它。
KinectManager 是最通用的組件,需要它與傳感器交互以獲取底層數據,譬如彩色數據流和深度數據流,以及身體和關節在Kinect空間中的位置(單位:米)。
AvatarController的目的是將檢測到的關節位置和旋轉傳遞到一個可操縱骨骼上。
CubemanController效果同上,但是它通過transforms 和線來展現關節和骨骼,以便於定位人體追蹤問題;
FacetrackingManager(臉部追蹤)用於處理臉部點陣和頭/脖子旋轉。如果與此同時KinectManager存在且可用的情況下, 它將被KinectManager 內部調用來獲得頭和脖子更精准的位置和旋轉。
InteractionManager(交互) 用於控制手型光標,同時檢測手部的抓取、釋放以及點擊.
最后呢SpeechManager用於識別聲控(語言識別控制)。
示例文件夾包含了許多簡單的示例(一些將在下文提及),你可以參考學習、直接使用或者拷貝部分代碼到你的腳本中。
如何將Kinect v2-Package 功能模塊用在你自己的Unity 工程里面:
- 將 ‘KinectScripts’文件夾從插件包的Assets文件夾拷貝到你工程的 Assets文件夾下.該文件夾包含了 腳本,接口和過濾器(filters )。
- 將 ‘Resources’文件夾從插件包的Assets文件夾拷貝到你工程的 Assets文件夾下。這個文件夾包含了所有需要的庫和資源,你可以不必拷貝那些你不打算用到的庫(譬如64位庫和Kinect-v1的庫)來節省空間。
- 將 ‘Standard Assets’文件夾從插件包的Assets文件夾拷貝到你工程的 Assets文件夾下。它包含Kinect v2的MS包裝類,等到Unity檢測並編譯新復制的資源和腳本。
- 將KinectManager.cs腳本作為組件添加到主相機或者其他已存在與游戲場景中的游戲對象上。作為與底層傳感器交互獲取底層數據的通用組件,它真的很重要。
- 使用其他你想加入到項目中的Kinect相關組件,所有這些組件均內部依賴於 KinectManager 。
如何將 AvatarController腳本用於你自己的模型上:
- 確認你的模型處於T-pose(可選),這是Kincet關節方向的歸零姿勢。
- 在Assets文件下選中該模型資源,在inspector面板上選中“Rig”標簽。
- 將AnimationType設置成 ‘Humanoid’,將AvatarDefinition設置成 ‘Create from this model’。
- 點擊Apply按鈕。然后點擊Configure按鈕來確認關節被正確的指定了,完成以上步驟我們退出配置窗口。
- 將模型放置到游戲場景中。
- 將KinectScript文件夾下的AvatarController腳本作為組件添加到游戲場景中的模型游戲對象中。
- 確保你的模型上還掛有Animator組件,必須是激活且它的Avatar合理設置.
- 如有需要,可以啟用或者禁用AvatarController組件上的MirroredMovement(鏡像移動)和VerticalMovement(垂直方向移動) 設置項。記住:如果鏡像運動被啟用 ,模型的Y方向將旋轉180°。
- 運行場景測試Avatar模型。如果需要,調整AvatarController的某些設置,然后重試 。
如何讓Avatar的手繞着骨骼運動:
要做到這一點,你需要將KinectManager的“Allowed Hand Rotations”設置為“All”。KinectManager是示例場景中MainCamera的組件。
此設置有三個選項:
- None - 關閉所有手的旋轉,
- Default - 啟用手的旋轉,除了骨頭周圍的扭曲,
- All- 將所有手的旋轉開啟
如何利用Kinect 與GUI 按鍵和組件進行交互:
- 將InteractionManager添加到主攝像頭或場景中的其他一直會存在的對象上。它用於控制手形光標並檢測手的握拳,釋放和點擊。握拳即手掌拽緊拇指在其他手指之上,釋放 - 將手打開,當用戶的手不移動(靜止不動)約2秒鍾時,會產生點擊。
- 啟用InteractionManager組件的“Control Mouse Cursor”設置。該設置將手形光標的位置和點擊傳輸到鼠標光標,這樣就可以與GUI按鈕,Toggles和其他組件進行交互。
- 如果需要使用拖放功能與GUI進行交互,請啟用InteractionManager組件的“Control Mouse Drag”設置。一旦它檢測到握拳並且拖動直到手釋放的過程,以開始拖動功能。如果您啟用此設置,您也可以以握拳姿勢點擊GUI按鈕,而不是普通的的手點擊(即保持原位,在按鈕上方約2秒鍾)。
如何獲得depth(深度)或color(彩色)相機textures(紋理):
首先,如果需要深度紋理,確保KinectManager組件的Compute User Map設置被啟用即可,如果您需要彩色相機紋理,則KinectManager的Compute Color Map設置啟用。
然后在你的腳本的Update()方法中寫上如下內容:
1 KinectManager manager = KinectManager.Instance; 2 if(manager && manager.IsInitialized()) 3 { 4 Texture2D depthTexture = manager.GetUsersLblTex(); 5 Texture2D colorTexture = manager.GetUsersClrTex(); 6 // do something with the textures 7 }
如何獲得身體關節的位置:
這個示例在KinectScripts / Samples / GetJointPositionDemo(腳本)。 您可以將其作為組件添加到場景中的游戲對象,以便在運行時看效果。 只需選擇需要的關節並可選是否保存到csv文件。 不要忘記將KinectManager作為組件添加到場景中的游戲對象。 它通常掛載在示例場景中MainCamera上。 這是演示腳本的主要部分,用於檢索選定關節的位置:
1 KinectInterop.JointType joint =KinectInterop.JointType.HandRight; 2 KinectManager manager = KinectManager.Instance; 3 if(manager && manager.IsInitialized()) 4 { 5 if(manager.IsUserDetected()) 6 { 7 long userId = manager.GetPrimaryUserID(); 8 if(manager.IsJointTracked(userId, (int)joint)) 9 { 10 Vector3 jointPos = manager.GetJointPosition(userId, (int)joint); 11 // do something with the joint position 12 } 13 } 14 }
如何讓游戲對象跟隨用戶的旋轉:
這與前面的示例類似,在KinectScripts / Samples / FollowUserRotation(腳本)中演示。 要在實際中看到它,可以在場景中創建一個Cube,並將該腳本作為組件掛載其上。不要忘記將KinectManager作為組件添加到場景中的游戲對象。 它通常是示例場景中MainCamera的組件。
如何讓游戲對象跟隨頭部位置和旋轉呢?
您需要將KinectManager和FacetrackingManager作為組件添加到場景中的游戲對象。
例如,它們是KinectAvatarsDemo場景中MainCamera的組件。
然后,為了獲得頭部的位置和脖子的方向,在腳本中需要這樣的代碼:
1 KinectManager manager = KinectManager.Instance; 2 if(manager && manager.IsInitialized()) 3 { 4 if(manager.IsUserDetected()) 5 { 6 long userId = manager.GetPrimaryUserID(); 7 if(manager.IsJointTracked(userId, (int)KinectInterop.JointType.Head)) 8 { 9 Vector3 headPosition = manager.GetJointPosition(userId, (int)KinectInterop.JointType.Head); 10 Quaternion neckRotation = manager.GetJointOrientation(userId, (int)KinectInterop.JointType.Neck); 11 // do something with the head position and neck orientation 12 } 13 } 14 }
如何獲得面部標志點的坐標?
您需要拿到各個FaceFrameResult對象的引用。
演示:KinectScripts / Samples / GetFacePointsDemo(腳本)。 您可以將其作為組件添加到場景中的游戲對象,以便查看運行中的效果。在腳本中調用其公共方法:GetFacePoint()獲取面部標志點坐標。
不要忘記將KinectManager和FacetrackingManager作為組件添加到場景中的游戲對象。 一般來說,它們是KinectAvatarsDemo場景中MainCamera的一個組件。
如何將Kinect捕捉的運動與Mecanim動畫混合
- 使用AvatarControllerClassic代替AvatarController組件。僅僅指定那些需要被傳感器動畫捕捉的關節。
- 將AvatarControllerClassic的SmoothFactor設置為0,以便立即應用被檢測到骨骼的各個朝向。
- 為Mecanim動畫層創建一個 (avatar-body-mask )阿凡達身體遮罩並應用,在這個遮罩里面,將上述提到的Kinect動畫捕捉關節點的Mecanim動畫設置為禁用。但別禁用根節點。
- 將KinectManager(一般位於示例場景的主相機上)組件的Late Update Avatars設為可用。
- 運行場景確認上述設置,當一個玩家被傳感器檢測到時,他的部分關節會被AvatarControllerClassic組件捕捉動畫,其他部分 - 由Animator組件負責。
如何將你的模型添加到 FittingRoom-demo
- 每一個模型,導入它們並在Unity編輯器Assets視窗選中。
- 選中Rig選項卡,將AnimationType設置為:‘Humanoid’ ,並且將AvatarDefinition改為‘Create from this model’(基於此模型創建)。
- 點擊應用(Apply)按鈕,然后點擊Configure按鈕來確認所有需要的關節點都被正確的分配。衣服模型一般不能使用所有的關節點,因為它會導致阿凡達定義無效。這種情況下你可以通過手動分配丟失的關節點(顯示為紅色)
- 記住:這些關節在這個模型中位置必須與Kinect關節的結構相匹配。在示例KinectOverlayDemo2中有涉及,否則模型可能不會完全的覆蓋用戶的身體。
- 在FittingRoomDemo的Resources文件夾下一個個子文件夾來為你的模型分類(Shirts, Pants, Skirts等等)。
- 在模型分類文件夾,為第一步所有導入的模型繼續創建文件名為數字且連續的文件夾形如:0000,0001,0002,
- 將你的模型移入這些數字標記的文件夾,每個文件夾一個模型。他們的貼圖及材質球需要被一並移入。然后將這個Fbx文件重命名為‘model.fbx’.
- 你可以在各自的文件夾下放入每個模型的jpg格式(100 x 143px, 24bpp)的預覽圖,並將其重命名為 ‘preview.jpg.bytes’,如果你沒有放入預覽圖,FittingRoom示例的模型選擇菜單將顯示‘No preview’(無預覽).
- 打開FittingRoomDemo1場景。
- 為你的分類模型添加ModelSelector到KinectController游戲對象,將Model category與上面第5頁中創建的子文件夾的名稱相同。將Number of models設置與第6步中創建的子文件夾數值一一對應。
- ModelSelector的其他設置必須與Demo中存在的ModelSelector一致。比如:
‘Model relative to camera’ 必須設置成‘BackgroundCamera’,
‘Foreground camera’必須設置為:‘MainCamera’,
‘Continuous scaling’ – enabled.
scale-factor (縮放因子)盡量設置為原來的1 並且'Vertical offset(垂直偏移量)’-設為:0.
稍后,你可以對他們進行微調以便更好地實現模型到身體的覆蓋。 - 如果你想選中的模型在模型類別變更后持續的覆蓋用戶的身體,請將ModelSelector組件的Keep selected model設置啟用,如果有幾個類別(即ModelSelectors),例如用於襯衫,褲子,裙子的實例等等。在這種情況下,當類別改變並且用戶開始選擇褲子時實例時,選擇的襯衫模型仍然覆蓋用戶的身體。
- CategorySelector組件為改變模型和類別提供手勢控制,並負責為同一用戶切換模型類別(例如襯衫,褲子,領帶等)。第一個用戶已經存在一個CategorySelector(玩家索引為:0),你無需添加。
- 如果你計划做多人 fitting-room(換衣間),為每一個新增的用戶添加一個CategorySelector組件。也可能需要為這些用戶將使用的模型類別添加相應的ModelSelector組件。
- 運行場景,確保你的模型能在列表被選中且正確的覆蓋用戶身體。找到實現模型到身體完美覆蓋的縮放因子和垂直偏移,可能需要些許調試。
- 如果要關閉場景中的光標交互,請禁用KinectController游戲對象的InteractionManager組件。 如果您想關閉手勢(滑動切換模型,抬手改變類別),請禁用CategorySelector組件的相應設置。 如果您想關閉或更改T-Pose姿態校准,請更改KinectManager組件的“玩家校准姿態”(Player calibration pose)設置。
- 最后但並非最不重要:您可以使用FittingRoomDemo2場景來利用或試驗單個疊加模型。 如果需要,調整AvatarScaler的比例因子設置以精確調整模型的全身,手臂或腿骨的比例。 如果您希望模型在每個Update中被重新縮放,請啟用“連續縮放”(Continuous Scaling)設置。
UI點擊事件的實現
- 獲取左手(右手)關節的3D坐標
- 3D坐標轉換為屏幕坐標
- 屏幕坐標轉換UGUI坐標(得到手的位置在UGUI的位置)
- 判斷手的位置是否在UGUI控件上
- 手如果在UGUI控件上,判斷是否握拳
- 握拳就表示點擊了該UGUI了
最后為我微信公眾號引個流,歡迎大家關注我的微信公眾號,大家一起學習一起進步