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