我正在開發具有多個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矩陣?
您可以根據http://docs.unity3d.com/ScriptReference/Camera-projectionMatrix.html調整相機投影矩陣攝像機投影矩陣 –