NES(小霸王)的光电枪的原理你知道吗?

在看Angry Video Game Nerd(喷神James)系列时候看到这集

http://v.youku.com/v_playlist/f2358492o1p14.html

里面比较清楚地介绍了TV Game上光枪的原理。

然后又上网找了几篇介绍这个的文章,感觉挺有趣。

————————————————–

简而言之的版本:

光 电枪的原理很简单,在你扣动班机后屏幕不再显示游戏画面,而是显示一个定位光标(一般是一个矩形),光标的位置为第一个可被击中的物体所在位置。光电枪 是一个光信号接受器,能够判断在其视野范围内是否有较强的光亮,如果你此时正好瞄准在定位光标上,则光电枪就接收到了强光,如果瞄不准,就接受不到强光。 由此可以判定是否击中此目标。定位光标依次显示在不同可被击中的物体所在位置上,游戏机就可以判定你到底击了那个目标。如果你将光电枪指向某个强光源(比 如灯泡)你将百发百中。当然这是早期的光电枪程序。新光电枪增加了识别能力如果每次采样你都击中(中间无黑暗信号)则视为无效。由于定位光标信号显示的时 间很短,所以你一般觉察不到或看到屏幕一闪。

(剩下两篇文章篇幅比较长,点“全文”查看……全文)

——————————————

详细一点的版本:

以下以三点来说明光线枪的原理:

一、电视机的成像原理。

大家可能会奇怪,前面已经说了感应器不是电视而是枪,那为何要谈电视的成向原理呢?这个原因可大了,因为光线枪能知道要射击的目标的座标,全靠现行的电视(交错式萤幕)的特性而来。

大家都知道的一点,电视讯号是一条条的扫瞄线所组成的。以目前三台为例,三台的讯号是512条扫瞄线。那这512条线是如何来的?那是电台把讯号 一条条的送过来(因握微波不可能送整个画面,就算它的频宽很宽那也只能提高资料量而已)而512条就是一个画面由512条线组成的。而每秒钟中电视要送出 30张画面,也就是说电视的电子枪的频率是512*30/秒(这是三台的讯号)不过一般的电视都比这个数字大。如下图:

╭——————————————╮
│→→→→→→→→→→→→→→  │
│→→→→→           │
│                │
│                │
│                │
│                │
│                │
╰——————————————╯

是由左向右,由上到下一条条的由电子枪送出来的。黑白电视只要送出亮度资料,而彩色电视还要送出三原色的的资料。而萤幕为何会亮,那是由电子枪送出的讯号打在营幕后的萤光材质上,萤光物质受到辐射线的照射,就会发光了!

由上面可以知道,宽萤幕和大尺寸电视为何比较贵了。因为电子枪振动的振幅比较大的缘故。而高画质电视更贵的原因就是因为振动数远高於一般电视的缘故。而利用这种特性,光线枪就能知道我们射击的目标的座标值。

二、光线枪如何知道我们射击那里?

这下到重点了。在光线枪里有个感应器,这个感应器只接收特定频率的光线(肉眼看不见的)而游乐器送讯号到电视时,就在每个dot后面加上一个 dot的光线枪用的讯号。而光线枪里有个计时器,当每个画面第一点的讯号送出时(这个讯号由游乐器提供)计时器就开始计时,当感应器收到讯号时,计时器得 到受信的时间,再由这时间就可算出座标了。(有点难吧!)如下图:

╭——————————————╮
│→→→→→→→→→→→→→→│
│→→→→→→→→→→→→→→│
│→→→→→→→→→→→→→→│
│→→→→→⊙                       │
│               │
│               │
│               │
╰——————————————╯

讯号由左到右,由上到下发出时会用掉时间(虽然非常短)当枪对准⊙时,特殊频率的光由左上角出发当它到⊙时,感应器收到讯号计时器就把时间记下来,如此游乐器就能知道座标了。所以只要枪口指著萤幕,电脑就知道座标了。

而有人可能会奇怪,那萤幕的大小没影响吗?程式难道会因萤幕而修正吗?答案是不必,因为程式是根据扫瞄频率来算的。所以大小萤幕只牵涉到 dot和dot间的间距,和频率无关。而以上的动作向VRCOP每秒要计算30次。也因此枪里面的计时器越精确(最小时间单位月小)那枪的准确度越高。所 以VR枪的台制品准确度极差(放在萤幕前也会打偏)就是因为计时器的IC不好的缘故。这就是VR枪原版的不便宜的缘故。

而我们扣扳机时枪为何知道打那里?那很简单。枪的扳机本身是个开关,当按下时,游乐器会送出另一个讯号(枪也能收的,我们会发现萤幕会闪一下)座标的算法还是和上面一样(其实对程式而言更简单,因为它只要算这一瞬间的资料就可以了)。

由以上的介绍,各位应该对光线枪有所了解了吧!

三、关於光线枪的问题。

光线枪为何不能再投影电视和液晶电视上使用?
因为投影电视和液晶电视得成像原理,和一般电视不同。它们不是用扫瞄线成像的方式,所以光线枪无法计算座标,因此无法使用。(反正只要不是用映像管的电视都不能用啦!)

为什麼小於20吋的萤幕没办法用?
因为萤幕小於20吋时,由於dot和dot间的距离太近了,小於光线枪的误差值,所以它们虽然能用,但是误差会很大。(反正大家也不会拿14吋电视玩VR COP来折磨自己)

——————————————

专业的观点:

一点思考:光枪原理、光枪在模拟器中的应用

光 枪其实是个接收机,其枪口处有个光电检测管(PD,photodiode),外加聚焦透镜,用来接收来自屏幕上某点处的光线。当光枪的扳机被按下时,光电 检测管将检测接收到的光强,当光强超过一定阈值时,其输出1至游戏机,否则输出0。有两种方法可用来判断扳机触发时是否命中屏幕上的目标:

A. 逻辑判断 :即闪烁屏幕。在扣下扳机的一瞬间,先涂黑整个屏幕,同时将所有目标绘制成白色,然后打开 PD,此时,如果PD输出1,则目标命中。这种方法的优点在于足够简单,而缺陷在于:如果屏幕有多个目标,无法区分命中的究竟是哪一个目标(对光枪里面的 PD别心存太多期望,它只是个廉价设备,无法用来判别颜色的)

B. 精确定时 :即光栅计数器+微秒级定时器+闪烁屏幕。时序及说明如下:

  1. 扣下扳机的同时,开始涂黑整个屏幕
  2. 检测到第1个VBlank,此时屏幕已经全黑了
  3. 紧接着画下一帧,开始涂白整个屏幕,光枪PD打开,开始检测光输入
  4. PD输出一直为0,此间对HBlank个数进行计数,且每当发生了一个HBlank时,ms级定时器重新计时
  5. PD终于检测到了第一次光输入,且得到了此时的HBlank计数n和计时值t
  6. 接收到第2个VBlank,此时屏幕全白,光枪PD关闭
  7. 根据得到的n和计时值t,便可以知道扣动扳机时光枪所指向的究竟是屏幕上的哪个像素了:前者即为屏幕y坐标,而后者除以HBlank时间间隔再乘上光栅像素宽度即为屏幕x坐标,然后判断一下是否为目标,over
  8. 上述方法有两个前提:首先,需要2帧来完成判断,你的手抖动频率最好表超过30hz,否则瞄不准…其二,需要HBlank和VBlank计数,所以用CRT最简单,如果是投影和LCD的话,恐怕就得换换思路 了

一点思考:

  1. 现在总算知道为什么有些模拟器(尤其是Console,比方说变态的bsnes )需要达到光栅级以上的模拟精度了吧?
  2. hmmm… 就模拟器而言,如果想用真实的光枪,不管是那种显示设备,方法1都完全适用。而对于方法2,只要达到了光栅级渲染精度,HBlank/VBlank的获得 便不是问题;稍微麻烦点的在于方法2中第5步,单从硬件原理考虑,如果用户使用的是CRT,那么还好办,主要是一些数值校正方面的工作(也就是 说,CRT+光栅级精度的模拟器,完全有可能直接使用真实光枪来玩,哈哈)
  3. 对于方法2,如果用的是LCD的话,想要用真实光枪,最简单的方法莫过于直接使用像素级渲染精度的模拟器(逐像素绘制,每画一个像素模拟定时同步一次),遗憾的是,现有的模拟器没哪个能达到这种精度(bsnes应该是这方面最为接近的尝试 )…这样模拟效率实在太低,因此此路不通。其实可以变通一下,仍使用光栅级模拟精度,一次计算一根扫描线,然后将其像素从左至右地“逐点”绘制出来,以供光枪检测,即,模拟仍然是精确到光栅的,但绘制定时却是精确到像素的 ,如果定时把握得好,用LCD也能实现与CRT+光枪同样的效果,哈哈~但不知道时间同步粒度太小,对rom逻辑本身是否有影响
  4. 这里需要澄清一下:常见街机光枪游戏其实分2类(这里不讨论IR Camera定位),一类是枪下面有底座的,如野狼突击队 ,根据其底座机械运动本身便能将枪口所指向的位置坐标实时计算出来,因此这类光枪游戏根本无需使用上述光线检测法,在MAME中,这类游戏的输入是用鼠标 来模拟的;屏幕上一般都实时显示出了枪口当前所指向的位置,这是其特征所在。而另一类是枪下面只有线缆、没有底座的,如死亡之屋 等***游戏,由于用的是光线检测法,因此其屏幕上并不会实时显示枪口瞄准镜,值得注意的是,这类游戏在移植到PC上时把光枪支持全砍了,而使用了鼠标模拟+显示瞄准镜的方式来替代,导致临场感大减

4 Responses to “NES(小霸王)的光电枪的原理你知道吗?”

  1. simpleto 说道:

    真专业诶~
    果然是术业有专攻啊~
    耐着性子看完了,转帖的别字很多,最后在末尾还忘了句号。 :)

  2. d_x0 说道:

    :cry:
    4v你打算把我的难以理解在你的博客上发扬光大吗?!
    T.T

Leave a Reply