这一章说说Coordinate,坐标系。
有朋友要问了,Leap不是本来就有坐标定义吗?对,这里附加的Coordinate是为了更方便的定义实体范围,比如这个官方例子:
红色是Leap硬件能够采集的空间大小,如果我们要让球不能超越一个竖直的界线,我们通常会在程序中设定,超越边界时坐标值保持边界极限值。而Leap给我们提供了一个更加底层一些的做法,自定义坐标系大小,将2D或3D空间自我量化。
倒金字塔是Leap硬件可采集的范围,红色是我们定义出的一个Box,超出这个范围,我们就不要数据了。实例化这个Box即新建一个InteractionBox。这是官方给出的2D平面的坐标量化实例:
1 2 3 4 5 6 7 8 9 10 11 12 |
int appWidth = 800; int appHeight = 600; InteractionBox iBox = leap.Frame().InteractionBox; Pointable pointable = leap.Frame().Pointables.Frontmost; Leap.Vector leapPoint = pointable.StabilizedTipPosition; Leap.Vector normalizedPoint = iBox.NormalizePoint(leapPoint, false); float appX = normalizedPoint.x * appWidth; float appY = (1 - normalizedPoint.y) * appHeight; //The z-coordinate is not used |
程序指定一个长度800,高度600的垂直剖面。不要疑惑为啥Y轴是(1-y)*Height,因为官方给的例子就是反转的。官方给了一个tip,记得用hand.stabilizedpalmposition或Pointable.stabilizedTipPosition来稳定操作,能有效的过滤掉一些抖动。具体使用,可以借鉴官方的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Leap.Vector differentialNormalizer(Leap.Vector leapPoint, InteractionBox iBox, bool isLeft, bool clamp) { Leap.Vector normalized = iBox.NormalizePoint(leapPoint, false); float offset = isLeft ? 0.25f : -0.25f; normalized.x += offset; //clamp after offsetting normalized.x = (clamp && normalized.x < 0) ? 0 : normalized.x; normalized.x = (clamp && normalized.x > 1) ? 1 : normalized.x; normalized.y = (clamp && normalized.y < 0) ? 0 : normalized.y; normalized.y = (clamp && normalized.y > 1) ? 1 : normalized.y; return normalized; } |
由于定义了坐标系,我们可以调整灵敏度,但通过坐标放大的Scale,灵敏度是线性变化的,这点在大部分情况下适用。官方的例子也给出了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
float appWidth = 800; float appHeight = 600; InteractionBox iBox = leap.Frame().InteractionBox; Pointable pointable = leap.Frame().Pointables.Frontmost; Leap.Vector leapPoint = pointable.StabilizedTipPosition; Leap.Vector normalizedPoint = iBox.NormalizePoint(leapPoint, false); normalizedPoint *= 1.5f; //scale normalizedPoint -= new Leap.Vector(.25f, .25f, .25f); // re-center float appX = normalizedPoint.x * appWidth; float appY = (1 - normalizedPoint.y) * appHeight; //The z-coordinate is not used |
定义坐标这个东西如果不是特别要求,意义不是特别大,但是VR中,空间的概念应该是稳定,精确的,这时候Coordinate应该是一个重头戏,现在先摸一遍所有的API,等实际使用中发现问题再好好试。具体例子还是以SDK为准,我之前做的模拟飞行例子已经加上了坐标检测,油门量是通过Z轴调整的,可以跳转至优酷看看,点我点我点我。
另外说一下,昨天没有解决的问题,就是Finger和Gesture对应。好好的看了下SDK,由于Gesture等级是低于Hand的,所以直接在Gesture中找Finger或者Finger中找Gesture是没有可能的,只能想办法去匹配坐标,今天大概试了一下,有一些小问题,日后解决了直接传代码。
这周团队要交付个小项目,估计没时间更新了,看看能不能抽时间写个Leap控制鼠标的程序试试看。