» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

光枪2.0和鼠标2.0

一定有很多人玩过FC上的打鸭子.
用一个专门的光枪外设就可以做到"指哪打哪", 这一定让人感到很有趣吧.
据说还有的父母因此而担心电视会被损害的.-___-
然而这种光枪虽然不会真的对电视造成损害, 却存在两个问题:
一个是只适用于CRT电视, 另外一个则是画面会闪烁.

随着技术的进步, 新的光枪已经能够解决以上的两个问题了. 而且在新的游戏主机Wii上也采用了类似的技术.
下面我们来看看这种技术到底是怎么一回事:
首先声明, 我并没有权威的资料, 所有推论都是从别人的谈论加上猜测和观察得来。如果有误请指出。

1. 这种定位方式都由两部分组成, 一个是信号发射器, 一个是信号接收器.
那么, 光枪和屏幕到底那边发射那边接收呢?是否双向收发?
这里由于缺乏验证的手段, 所以判断的依据主要是网络上一些信息, 以及技术可行性.
某网友曾提到是屏幕旁边的红外线发射装置发送信号, 而光枪接收信号.
现在就以这个为起点, 看看是否能有一种可行的方案.(双向收发也不妨到单向收发无法解决问题时再考虑)
不过先等一等, 红外线? 为什么不是紫外线? 甚至是超声波?
应该是红外线对人体影响较小吧? 再说去看看街机, 屏幕的上下各有5个像灯一样的东西, 还略微发红光.
(超声波就应该是喇叭一类的东西了)
下面讨论就基于这个假设: 屏幕上下各有5个(共10个)红外线发射装置(下面简称发射点)发送信号,
光枪接收信号并计算出其指向的位置.

2. 如何定位? 它们是否能够提供足够的信息来计算光枪指向的位置?
最容易想到就是距离和角度, 那么获取这两个信息是否可行呢?
我认为, 距离很难获得, 主要是发射点和光枪的距离相对光速而言太短, 对测量的精度要求过高.
剩下就是角度了(这个再没有就没法玩了).
那么光枪的信号接收器应该是可以接收一定角度的信号了, 为了方便把它想像成眼睛.
现在我们在"眼睛"的正中间选择一个点作为基准点, 它对应瞄准的方向.
我们的目标是得到它瞄准的方向在屏幕上对应的点(我们把实际的瞄准点记为O, 计算的瞄准点记为O').
第一步, 获取了它与某个发射点的角度, 就可以得到瞄准点与这个发射点的偏移量.
不过, 这里得到的不是O'的坐标, 而是以发射点为圆心的一个圆.
为了得到O'的坐标, 我们首先确定坐标轴XY, 两个发射点就可以做到:
过两个发射点的射线可以作为一个轴, 另一个则与之垂直.(既然是射线, 就要求这两个发射点能被区分, 发射不同的频率是一种办法.)
这样,瞄准点与这个发射点的偏移角度,包括水平和垂直的偏移角度都有了,O'的坐标也就得到了。
再加上设置时的纠正数据,就基本上能得到实际的瞄准点的位置了。

3.但靠这种方法还是存在缺点的:
玩过这种光枪游戏(比如TC4或GS)的人也许会注意到这种情况,已经校准了,向左或右移动一步,准心就有偏移了。
为什么有这种情况?请看图:
A   D  B     C

         M
假设A,B,C对应屏幕旁的发射点,M是人站的位置,D是瞄准的位置。(现在我们只考虑水平的坐标计算,垂直的同理可得)
用B点做参考,角BMD已知,D就是可以计算的。
但这里有一个隐含的假设:M点,也就是人站的位置是固定的,设置时的纠正数据也是以此为准的。
我们再看一种极端情况:
A   D  B     C
                        N
         M
现在,假设人站在了N的位置上,当他再瞄准D点时,由于角BND小于角BMD,所以程序计算出来的位置会在B和D之间。也就是说,你的位置往哪个方向偏,准心也会往那个方向偏。
正因为有这种情况存在,所以可以判断这种光枪采用的是两点定位。之所以有10个发射点,我认为是为了提高精确度,当接收到多个发射点的信号时,取偏移角度最小的。
还有一点要说明的:
定位用的是光枪的位置而不是人的,所以即使是人不动,光枪的位置也会随瞄准的方向发生变化。
但这个是可以通过程序纠正的。

4.一种可能的改进方案?
这个方案可能会有问题,请大家指正。
这里我们仍然只考虑水平的坐标计算,垂直的同理可得。
在上面的方案中,只用到了两个发射点,如果用3个呢?请看图(注意这里O就不是处于中间了):
A      B      C




           O
在这个坐标系里,A(Xa,Y), B(Xa+d,Y), C(Xa+2*d,Y)都为已知,AB和BC的距离也已知,设为d,
角AOB,角BOC已知。
求:O(Xo,Yo)

再加一个辅助点D,它是O在直线AC的垂点。
A      B D    C




           O

已知量:
Xa, Y, d
角AOB,角BOC
求:
Xo,Yo

(Xo-Xa)/(Yo-Y)=tan(角AOD)
(Xo-(Xa+d))/(Yo-Y)=tan(角BOD)
角AOD-角BOD=角AOB
(Xo-(Xa+2*d))/(Yo-Y)=tan(角COD)
角COD+角BOD=角BOC

设Xa=0,Y=0,化简得:
Xo/Yo=tan(角AOD)
(Xo-d)/Yo=tan(角BOD)
角AOD-角BOD=角AOB
(Xo-2*d)/Yo=tan(角COD)
角COD+角BOD=角BOC

未知数:
角AOD
角BOD
角COD
Xo
Yo
5个方程,5个未知数

然后,可以用Xo,Yo来求瞄准E:
A      B D E  C




           O

(Xe-Xo)/Yo=tan(角EOD)
角EOD+角BOD=角BOE
未知数:
Xe
角EOD
2个方程,2个未知数



两点定位对于光枪来说不是很足够,但如果仅用来当鼠标的话就非常合适了,因为只要偏移量,不用去真正的瞄准。Wii采用这种技术还是很恰当的。


TOP

引用:
原帖由 handsomeken 于 2007-6-13 22:40 发表
楼主分析的很用心啊。


其实Wii的手柄很简单:
Sensor Bar 感应条是定位信号发射器 一共有十个红外线发射装置,并且以一定角度偏离,而Wii的手柄前方是接收器,这组传感器是用于定位手柄在平行于屏幕平面的 ...
一直没有想明白为什么Sensor Bar一共有十个红外线发射装置, 我觉得有两个就够了,只要发射不同的频率。
光枪这边也是,实际上不是10个,而是20个。因为每个红外线发射装置都有两个“灯“。
但这两个“灯“离的很近,接收器恐怕不好区分它们。



TOP

发新话题
     
官方公众号及微博