小学时突然有一阵流行3D立体图,很多人拿着花花绿绿的铅笔盒到处显摆,然后一伙人聚到一起讨论看到了什么。我那时不知道怎么看,听别人描绘的神奇图景十分沮丧,小伙伴还把能看出来跟超能力啥的挂了钩。所以,我,AKA热血日漫业余爱好者,从小学起,就觉得自己不是拯救地球的料了,就算被人画到漫画里,也是个连专属招式都没有的战五渣。当然现在更不是,甚至都不认为地球需要拯救了,人类说到底只是在自救。
虽然我记性差,但这个从未看到3D立体图的心结时不时会炸个尸,毕竟童年的遗憾才叫遗憾,现在的遗憾我都已经学会自欺欺人了。中学时期读过一本《趣味物理学》,里面也提到了裸眼3D立体图,当时我费了半天劲也还是没看出来。我第一次真正看到3D立体图是一个读研究生时期的晚上,偶然看到网上有人贴了一张标着刘红石作品的3D立体图,其实本来还是没希望看到但突然在某个距离上我看到了其中的一个大茶壶。这个图很神奇,你要是能看到,就一直能看到了,然后眨眨眼同样视角又消失了。刘红石是一位中学老师,自己凭兴趣制作了大量3D立体图,如果有人为中国3D立体图立传,那他一定占据重要篇章。我后来来回尝试几次,总结出了看到的方法:打比方你的屏幕离你20厘米,要聚焦去看23到25厘米的距离,你当然不能透视屏幕,但通过欺骗大脑,你就能看到3D图像出现在23到25厘米的地方,好像屏幕陷了进去成了一个舞台。童年的心愿通过一种类似自欺欺人的方法实现了,不得不说也是一种成长。
其实原理上3D立体图并不难,就是人的视觉会自动识别景深,这些图的产生原理就是找一个基础模块反复重叠组成一张大图,然而景深的出现则是依赖在基础模块对应的像素点进行偏移,当你眼睛聚焦在屏幕后面时,其实本质上是让你的大脑重叠两个基础模块,因为基础模块在景深上有偏移,重叠后你会感觉图片凹或凸了一块,因为大脑还是认为两个点没有偏移而增加了深度差异。同理,因为聚焦点在图片后面,所以你看到图就像是窗子里往外看,会因为有景深而显得更广阔些。当然,如果你理解了原理还是看不到也没关系,我当年也这样的,安心等待你的惊喜一刻。
其实这玩意也是个舶来品,上世纪60年代,研究人员就首先提出随机点立体图来研究视觉,特别是立体视觉形成的过程。但这个研究是用两张图来进行的,到了70年代才出现单张图的立体视觉,由神经科学家 Christopher Tyler 提出。不过这种图首次出现在大众视野是在上世纪90年代,当时在美国一家出售调试计算机模拟器的英国公司雇员 Baccei 苦于宣传手段来推销新产品,这时他见到了摄影师 Ron Labbe 工作室里出现的立体图,这种新颖的设计马上就吸引了他的注意力。 Baccei 马上就去买了《Stereo World》的杂志潜心研究,很快他就把自己需要推广产品型号“M700”制作成了立体图并投放了广告,很快就形成了一股流行趋势。
刚开始 Baccei 是为了卖公司产品,结果很快他就发现卖这种3D立体图比卖产品要赚的多。例如他们将这种图卖给了美国航空飞机杂志 《American Way》,然后美国航空就说如果能首先看出来的乘客就可以获得香槟一瓶,当然也是大获成功。之后他们与一家日本公司合作,而日本人为了发音方便就给这种图起了个英文名:magic eye,魔眼,时至今日这个词依旧很流行,也成为Baccei与设计师 Cheri Smith 后来公司的名字。1993年, Baccei 在麻省开办设计公司专门出售这种图,第一本相关书籍的初版30000本马上售罄,出版商加印了50万份来满足市场需求。但这个潮流到了1995年就开始降温了,最初一张图要25刀,然后逐渐降价到5刀。此时市面上有了芭比娃娃、毛绒玩具以及电子宠物,这种费力还不一定能看到的图自然也会退潮。同时,也出现了光栅立体画这种变个角度就可以看到不同图像的技术玩具,更低的娱乐门槛且可以彩色显示(魔眼无法还原色彩),魔眼消退几乎也是必然。
后来互联网崛起,娱乐走向了虚拟化,魔眼这种图再也没有重新崛起而是很稳定地成为了一种小众兴趣。然而,裸眼3D技术并未就此停止,任天堂的3DS掌上游戏机就采用了这种技术,我曾经尝试玩过恶魔城,观感跟魔眼其实类似,也是找一个距离,在距离范围内欺骗大脑,然后你就一直可以看到3D效果的游戏场景了。不过,似乎玩家对此并不买账,反而是阉割后的2DS卖的不错。其他裸眼3D技术还有一些,例如全息投影之类,不过现在裸眼3D的竞争对手可能是增强现实,特别是跟智能眼镜或手机摄像头结合的那种。
但我还是对魔眼耿耿于怀,因为我想自己做出来,毕竟也是个科研向伪程序员。最简单就是找包,但这次我发现这类小众应用会有C++版、JavaScript版、Java版、python版、甚至Matlab版都有,甚至都有反解原图的程序,但就是木有R版生成的软件。其实早在2017年我就动了念头写个R版的魔眼,但里面那个位移部分的算法当时没搞清楚,然后因为这个图的生成存在图片逐行扫描的问题,把图片向量化完了找位移像素然后重新组合的算法我想想脑袋就大,最后索性就引入了 Rcpp 写 for 循环,但无奈功力太弱,生成的图能感觉是魔眼,但里面的图像怎么看都不对,所以这事就扔一边了,一扔三年。
前两天我重新整理了诺谟图,那篇的初版是2011年写的,好容易填了个九年的坑,这个三年的坑就想也顺道解决。不同于三年前的是我这几年对 python 的使用经验在增长,虽然没到熟练运用的程度但能看懂代码,所以这次就直接尝试把python版的魔眼翻译到 Rcpp 里去,而且我先在 python 里进行了调试,搞清楚了每一步到底在干什么,创造轮子或许费事但照虎画猫的事我常干。不过这次我终于搞清楚了三年前似是而非的魔眼图是怎么回事,其实就是行与列搞反了,把三年前的代码输入矩阵做个转制其实就可以了。不过这次也是踩了不少 Rcpp 的坑,什么编译完了没输出啥的,但做完了回头看其实我需要的函数特别简单,只是基础太差来回绕弯了。这个包就叫做 magiceyer
,我先扔到 Github 上,有个很简单的使用说明。其实可以认真扩展下成为一个更完整的包,不过我心愿已了,就这样吧。
在我看来,这种图具备一种延迟特性,无论是谁不用程序反解突然给一张魔眼图都得停一下集中注意力才能看出来,这个特性有一定的加密前景,且可以藏到二维码里。技术不论好坏就看使用场景,但可以作为一种抽签方法,因为其实能否看出来比较随机,除了极少数爱好者估计不会有人专门训练这个。如果配合我之前搞的回归残差藏信息的方法,估计会是一个不错的谜题,如果有人在无背景知识条件下全部逐层解开,想来也是很有成就感的事。
我一直有种感觉,现在网络时代人们的生活少了些类似魔眼图的东西,也许我们可以获得更优质的信息,但乐趣却更多与感官刺激或情绪释放相联系,有些探索的乐趣正被一种“网上都有”的想法抹杀,网上的确都有,但探索的乐趣跟答案有没有不是一个概念。如果远离了键盘鼠标跟视网膜屏幕,还有没有什么小玩意或兴趣可以让你不在乎外面的风雨压力呢?或者说除了自己情绪的释放与让别人知道你很不错,还有没有眼前一亮?可能是锤炼一道拿手菜,可能是手抄一段杂志里有意思的话,可能是对着一套古腾堡机械装置发呆,可能是打一套太极拳,如果你从未看出来立体效果或许可以去看看魔眼图,重要的不是别人期望你去做或该做什么或你期望做什么去迎合自己的人设,仅仅就是想去做而已。
那就去做,留给人类享受生活的时间可能不多了。