【问题标题】:Apply Projector-Kinect calibration to Unity3d Camera将 Projector-Kinect 校准应用于 Unity3d 相机
【发布时间】: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


    【解决方案1】:

    我使用RoomAliveToolkit 得到一个投影矩阵。我的 Unity 项目还解释数据并更改投影仪,以便相机从它的角度投影。但是骨架不适合投影。我问了 microft 的人,他们给了我一个提示。请注意,kinect 使用右手坐标系和统一左手坐标系。

    我不知道为什么你的矩阵是 11*1。但是如果你喜欢我可以支持你。你在 github 或 bitbucket 上分享你的源码吗?

    【讨论】:

    【解决方案2】:

    你可以根据这个untiy reference调整相机投影矩阵

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多