有段时间没写日志了。

今天写Kinect操作Java3D模型的程序,发现两者坐标存在很大差异,遂整理了一下。

首先,Java3D坐标系单位是1,象征真是世界中的1m(但不是真的1m,要不显示器该放不下了)。

其次,OpenNI坐标系如下(翻译自OpenNI-API-1.5.4)

 

      OpenNI定义了两种坐标系统:

          投影坐标:深度值的二维地图

          真实世界坐标:三位点坐标集合

 

 

       两个坐标系统详细内容如下:

特征

投影坐标

真实世界坐标

x,y单位

pixels 像素

mm 毫米

z单位

mm 毫米

mm 毫米

(x,y) 平面原点

视域(FOV)左上角

视域中心

z0

传感器所处垂直面中心

传感器所处垂直面中心

x轴方向

从左到右

从左到右

y轴方向

从上到下

从下倒上

z轴方向

远离设备(从设备到用户)

远离设备

           这两种坐标系统的区别是,物体越靠近传感器,其在投影坐标系中变得越大,在真是坐标系中不变。

注意:OpenNI中返回数据格式并不统一,有的使用投影坐标(像depth maps),有的使用真实世界坐标(例如 skeleton joints),使用时需注意。

Java3D和OpenNI结合使用时可参照两者各自坐标系灵活调整了。