將Microsoft Kinect集成到你的Flex應用

我之前在MAX大會中談過一個主題,是將遊戲控制器集成到FLEX/AIR/ActionScript應用裏面,從而讓遊戲的互動更加流暢自然。目前已經有很多使用Wii控制器的例子--鑑於下一代視頻遊戲平臺即將到來,我最好想花一些時間在近期最棒的Microsoft Kinect上。


對於那些不太瞭解Kinect的人,可以將它看成是一對攝像頭,一個是RGB(和平常的攝像頭一樣),另一個是紅外線攝像頭。兩個攝像頭在一起(也包括一對電子元器件和軟件)允許Kinect深度探測。這意味着追蹤人,手的行爲變得不那麼複雜。Microsoft Kinect 事實上是 PrimeSense開發的,它最早是爲PC提供這種裝備,而不是遊戲平臺。這說明這個裝備實際上是兼容PC的,而不必再去借助一堆不常見的方法。

讓Kinect工作起來最困難的事是搞定所有需要的組成部分,並讓他們一起工作 。文檔支持很少(通常在GitHub的文本文檔中找到)。綜合起來問題是,多則上百,少則幾十的開源的項目--不幸的是,它們每個都依賴不同的驅動,中間件和API -- 很多都相互不兼容。

我要說明的是我並不是這些所有領域的專家,但是我根據一個線索順來展開工作(在很多失敗的嘗試後)。Matt LeGrand和我打算開一個獨立站點和博客來探索其他更多的方法來幫助人們做正確的篩選。我的經驗首先是開Windows 7上運行Kinect,我知道我的老的Mac筆記本不足以支持Kinect。是的,你需要更先進的電腦來使用Kinect。

然後,從哪開始?很明顯,你需要Microsoft Kinect控制器的實物。目前有兩種型號--一種是USB only,另一種是USB+能量供應。USB only的版本只能搭配Xbox。USB+能量供應的版本搭配PC(Kinect使用一點小的電量可以讓Xbox通過USB提供)。兩者不同的地方是能量盒和USB能量注入模塊。如果你因型號問題沒有成功,可以嘗試購買能量盒和USB能量注入模塊。我並不確定哪裏可以買到。我是從Best Buy上的視頻遊戲翻版通道購買的(使用優惠券後,大約是100美元)。新的大約是140美元。

在使用前,你需要安裝驅動、中間件和API。有三個知名的驅動包和中間件,有一個是我直接從PrimeSence下載的,它被我選用。驅動和中間件存放在OpenNI的官網http://www.openni.org/downloadfiles/opennimodules。有三個你需要下載--OpenNI模塊(OpenNI Binaries),PrimeSense NITE中間件,PrimeSense驅動(OpenNI適用的硬件驅動)。下載32-bit的文件,及時你使用的是64位的Windows 7。使用的64位的驅動會碰到很多的問題,讓事情中斷。安裝好驅動,然後是中間件,然後是OpenNI的驅動。

最後,你需要AS3模塊。有一個開源的項目叫做AS3OpenNI,它讓對於OpenNI API的編程變得非常簡單。因爲AIR不能直接和API通訊,你必須使用內置的C++應用代理驅動調用TCP/IP連接。我確信這會在後續的AIR版本中變得更加簡單。AS3OpenNI取得從OpenNI返回處理過的數據,然後給到骨骼數據(作爲一個類),RGB,深度或者多點觸控點數據。通過這些數據,你可以從多個用戶讀取返回的數據,然後追蹤他們的手,投,脖子,腿等等。我是基於穩定的1.3.0版本創建應用。

看一下AS3OpenNI項目中的例子--它們充分展現,一旦你讓所有部件都一同工作,它們會運行得很好。

然後,我用Kinect做什麼呢?我的第一個遊戲是“太空入侵者”的簡易版本。我使用AS3OpenNI追蹤右手讓玩家從左到右移動,當右手在脖子的中間點經過的時候,會發射一枚導彈。以下的代碼是必須的全部代碼(除了玩家的建立部分,等等):

protected function gotShipMove(event:ONISkeletonEvent):void
{
var rightHand3D:NiPoint3D = event.rightHand; // get the right hand's x,y,z
var rightHand:NiPoint2D = NiPoint3DUtil.convertRealWorldToScreen(rightHand3D, this.stage.width, this.stage.height);
    
shipIcon.x = rightHand.pointX;
if ((event.skeleton.rightHand.pointY > event.skeleton.neck.pointY) && canFire)
{
  if (!fireInProgress)
  {
   fireInProgress = true;   // prevent 5,000 missiles from firing at once...
   var missile:MissileItem = new MissileItem(spaceInvadersCluster);
   missile.x = rightHand.pointX;
   missile.y = height - 64;
   missile.addEventListener("MissileFireComplete", missileFireComplete);
   missile.addEventListener("MissileFireHit", missileFireComplete);
   addElement(missile);
  }
}
else
{
  fireInProgress = false;
}
}

可以查看我的Twitter來獲取更多關於我們(Matt和我)專門Kinect和AS3網站的信息,在MAX大會上,我會更多地涉及到遊戲,所以屆時一定要來。


原文鏈接:http://www.9ria.com/news/2011/0825/23481.html#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章