我们做Unity的Kinect开发,其实好多情况下要用到竖屏这样的模式,然后你就会发现,怎么切换个竖屏,里面的追踪坐标怎么就不准了呢,这里面主要就是牵扯到坐标转换的问题。

        我先是参考的这个示例来进行的测试,在 1920*1080的分辨率下追踪还是十分准确的。

unity text 竖版 unity 竖屏_unity text 竖版

         但当分辨率前换成竖屏(1080*1920)后就会发现,追踪虽然依旧准确,但画面被压缩的不成样子了,这样的画面那肯定是不行的。

unity text 竖版 unity 竖屏_竖屏_02

        查了查资料你会发现,勾上“BackgroundImage”上的“PortraitBackground”脚本后画面就变成正常比例了,但手部得追踪位置Y轴上还是准的,但X轴上出现了明显的偏移。

unity text 竖版 unity 竖屏_unity_03

        通过上面两张图其实不难看出,虽然转换成了竖屏,但手部的追踪还是根据1920*1080的分辨率来计算的,所以才会出现了Y轴追踪正确,X轴发生偏移的现象,只要把两张图的缩放前后的比例代入到手部追踪的代码里去 ,追踪坐标就会正常显示了。

        找到脚本“HandColorOverlayer”里“OverlayJoint”这个方法就是坐标追踪的根源了。

unity text 竖版 unity 竖屏_游戏引擎_04

        其中的第一句

Vector3 posJoint = manager.GetJointKinectPosition(userId, jointIndex);

就是我们需要修改的的地方了,确切的说是 posJoint的这个值的X轴的数据。

 

unity text 竖版 unity 竖屏_游戏引擎_05

        上图只代表分辨率,不代表实际大小 ,可以看到Y轴上1080被拉到了1920的大小那么对应的X轴: 1080/X = 1920/1080  X = 607.5。

        所以这个坐标下加上这一句,没错这一句就是整篇文章的精华所在。

Vector3 posJoint = manager.GetJointKinectPosition(userId, jointIndex);
posJoint.x = (1920f / 607.5f) * posJoint.x;

        切换成竖屏后运行,发现追踪的位置基本差不大多了(有点偏左)

unity text 竖版 unity 竖屏_竖屏_06

unity text 竖版 unity 竖屏_unity text 竖版_07

         对比1920*1080分辨率下的视野其实可以发现Y轴上也有些裁切,所以算出的比例才没那么精准,不过这个精度基本够我用了,要想算出精准比例怕是要扒一扒“PortraitBackground”这个脚本了,暂时比较忙,以后空闲了看看再细算吧······

        有大佬算出结果来的或者我的思路是错误的也可以发在评论里,大家一起进步,还能帮帮各位被Kinect折磨的道友~

        (悄悄说一句,在我加上了0.07的偏移后,追踪的位置基本定在手掌中心了)

         即:

posJoint.x = (1920f / 607.5f) * posJoint.x+0.07f;

        哈哈,有点投机取巧了,不过实在懒得扒代码了······

unity text 竖版 unity 竖屏_坐标转换_08