【发布时间】:2015-07-31 20:45:50
【问题描述】:
我正在开发一个包含多个 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 相机。它像 Kinect 相机一样具有正确的视野 (60) 和位置 (0,0,0)。因此,如果我从 Kinect Body 信息中生成 Unity3D 中的骨架,那么一切都匹配,例如真实世界的大小等。
缺少的部分是校准本身。
我想到了两个解决方案:
相机着色器
或
改变投影矩阵
有没有办法实现将 3D 点转换为 2D 到着色器的方法,以便它将每个像素转换到正确的位置。
或者我可以简单地更改 Unity 相机的投影矩阵吗? Unity3d 中的投影矩阵是一个列主要的 4*4 矩阵。 我的校准矩阵是 11*1 矩阵,有没有办法从该源生成 4*4 矩阵?
【问题讨论】:
标签: matrix unity3d shader kinect camera-calibration