2015-05-19 107 views
0

我正在開發具有多個Kinect V2,投影機和Unity3D的交互式藝術裝置。將投影機 - Kinect校準應用到Unity3d相機

因此,我使用了這裏描述的技術:https://github.com/genekogan/KinectProjectorToolkit,並在C#中的Unity3D中實現了我自己的校準。

校準的結果是一個有11個條目的DotNetMatrix。

使用該矩陣,我可以通過以下方法獲得3D點正確映射的2D屏幕位置。

public static Vector2 convertKinectToProjector(Vector3 ksp) 
{ 
    Vector3 kp = new Vector3(ksp.x * 1000, ksp.y * 1000, ksp.z * 1000); 
    Vector2 mappedScreenPoint = new Vector2(); 
    float denom = (float)x.GetElement(8, 0) * kp.x + (float)x.GetElement(9, 0) * kp.y + (float)x.GetElement(10, 0) * kp.z + 1; 
    mappedScreenPoint.x = Screen.width * ((float)x.GetElement(0, 0) * kp.x + (float)x.GetElement(1, 0) * kp.y + (float)x.GetElement(2, 0) * kp.z + (float)x.GetElement(3, 0))/denom; 
    mappedScreenPoint.y = Screen.height * ((float)x.GetElement(4, 0) * kp.x + (float)x.GetElement(5, 0) * kp.y + (float)x.GetElement(6, 0) * kp.z + (float)x.GetElement(7, 0))/denom; 

    return mappedScreenPoint; 
} 

使用該解決方案,我可以顯示正確映射到GUI上的紋理和其他東西,但我也想使用3D空間的優勢。

所以我正在尋找一種方法讓這種校準進入Unity3D相機。 我的目標是,相機所看到的一切都從3D空間正確映射到屏幕空間。

我已經安裝了Unity3D相機。它具有正確的視場(60)和位置(0,0,0),就像Kinect相機一樣。所以如果我在Unity3D中從Kinect Body生成一個骨架信息,所有的匹配都像真實的世界尺寸等。

缺少的部分是校準本身。

我想兩種解決方案:

一個攝像頭的Shader

改變投影矩陣

是否有實施轉換3D該法的方式進行將2D指向着色器,以便它將每個像素轉換到正確的位置。

或者我可以簡單地更改Unity相機的投影矩陣嗎? Unity3d中的投影矩陣是列主要的4 * 4矩陣。 我的校準矩陣是一個11 * 1矩陣,有沒有一種方法可以從該源生成4 * 4矩陣?

回答

0

我用RoomAliveToolkit得到投影矩陣。我的Unity項目也解釋了數據並更改了投影機,以便相機從它的角度進行投影。但骨骼不適合投影。我問微軟傢伙,他們給了我一個提示。請注意,kinect使用的是右手座標系統,左手統一。

我不知道爲什麼你的矩陣是11 * 1。但如果你喜歡我可以支持你。你在github或bitbucket上分享你的源代碼嗎?

+0

您可以根據http://docs.unity3d.com/ScriptReference/Camera-projectionMatrix.html調整相機投影矩陣攝像機投影矩陣 –