我正在开发一个带有多个Kinect V2,投影仪和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相机。因此,如果我从Kinect Body信息中生成Unity3D中的骨架,那么所有内容都与真实世界大小等相匹配。
缺少的部分是校准本身。
我想到了两个解决方案:
相机着色器
或
更改投影矩阵
有没有办法实现将3D点转换为2D到着色器的方法,以便将每个像素转换到正确的位置。
或者我可以简单地更改Unity相机的投影矩阵吗? Unity3d中的投影矩阵是一个列主要的4 * 4矩阵。 我的校准矩阵是一个11 * 1矩阵,有没有办法从该源生成一个4 * 4矩阵?
答案 0 :(得分:0)
我使用RoomAliveToolkit来获取投影矩阵。我的Unity项目还可以解释数据并更改投影机,以便相机从它的角度进行投影。但是这个骨架不符合预测。我问微软的家伙,他们给了我一个提示。请注意,kinect使用右手坐标系统和左手统一。
我不知道为什么你的矩阵是11 * 1。但如果你愿意,我可以支持你。你在github或bitbucket上分享你的消息来源吗?
答案 1 :(得分:0)
您可以根据此untiy reference
调整相机投影矩阵