1

在使用 kinect(在 C++ 中)时,我正在学习 D3D 和坐标空间。虽然我可以使用 Direct2D 轻松绘制骨架位置,但我很好奇如何使用 Direct3D 11 绘制这些位置以及我需要哪些坐标空间转换。

一个简单的例子:我想根据左手的运动来平移一个立方体。跟踪左手关节,我可以得到骨架位置。但是,我如何将这些位置转换为立方体的世界空间可以理解的东西?

我尝试了一个解决方案:

  1. 使用 SkeletonToDepth 转换将骨架位置转换为深度 - 给我屏幕空间的结果。
  2. 使用 将屏幕空间点映射回对象空间XMVector3UnProject(...),即本质上是一种光线拾取解决方案。

虽然这很好,但有没有更有效的方法不涉及映射回对象空间,并且可以让我直接在屏幕空间或至少在投影空间中工作?

4

1 回答 1

1

我找到了适合我的答案。

来自骨架/面部跟踪器的 kinect 原始数据为您提供 kinect 相机空间中的数据,我将其定义为一个视图矩阵,定义为 (0,1,0),查看 (0,0,-1),原点 (0,0,0)。在 y = 45.8f 的 fov 投影矩阵,视口的纵横比,以及与应用程序匹配的远近(在我的情况下为 1.0f 到 2000.0f,因为我以毫米为单位工作),kinect 返回的任何 3D 点在相机空间中。因此,要进入世界空间,乘以视图矩阵的逆矩阵(在我的例子中,通过乘以 -1 来翻转变换点中的 x 轴坐标)。屏幕上的对象应跟随 kinect 的运动。

于 2013-03-21T09:20:43.040 回答