我搞体感开发两年,从去年知道了leapmotion这款产品,开始不以为然,以为是基于空气动力学的扰流分析产品,春节后看到某位po主的拆机 图,不禁惊叹:平台类的好创意都让外国开发者抢先了。leapmotion的官方售价低于500元人民币,利润不高。既然制作相同产品为时已晚,就让我详 细地分析它的技术原理,抛砖引玉,激励我们国内开发者也能有如此优秀的创意迸发出来吧。
我们的手上纹路很多,笔杆等物体也有很多显著纹路与凹凸,leapmotion的基本原理是用高清摄像头近距离捕捉被测物体的表面照片,采集物体的纹理特征,并进行反算得到物体表面的空间信息。
学过图形图像学的同学对矩阵变换已经很熟悉了,其实矩阵没啥难的,三个数量构成一个向量,那么一个向量的空间变换必然基于三个以上的方程组,位移和旋转三个系数够用,再加一列标志缩放的方程系数就够成了齐次矩阵,也就是给向量多加一个常量的尾巴,这里一笔带过了。
但是有一个关键点,那就是由world space到screen space有一个倒数运算,够成了近大远小的投影图像,也就是游戏编程尽量回避的z fighting问题。
我们的眼球成像和摄像头成像都是视锥投影,所以把含有倒数的结果反算成空间中实际存在的物体表面就必须靠猜。
两条投影线难以确定线性方程的两个系数,所以由平面投影反算三维点位至少需要三条投影线,如果是黑白画面的话,投影线要更多,越多越准确。
现在运算公式我们有了,剩下的就是用步进角匹配两个摄像头的特征值结果了。当两个经过矩阵换算的原始纹理大致相同时,我们就可以确定,这个特征面的角度。
这个捕捉方式的问题在于,如果物体太远,纹理就捕捉不到,所以捕捉距离是非常有限的,但是作为操作界面来说足够用了。