我正在为sphero写一个游戏,机器人球(他们的论坛有问题,似乎无法提出问题)。我正试图为2名或更多球员进行球碰撞检测。
首先,他们在这里给出样本: https://github.com/orbotix/Sphero-iOS-SDK/tree/master/samples/CollisionDetection
他们提供的门槛太过敏感,在木地板上它一直触发。忘掉那一分钟,我必须使用两个设备的影响时间戳来查看它们是否在大致相同的时间触发了碰撞。
我的问题是在减去时间戳时,在某些情况下我会得到非常广泛的变化,我认为差异很大。我正在存储几个时间戳,所以我不会错过正确的时间戳,我尝试玩死时间,看看降低它是否会有所帮助。
最常减去2个NSTimeIntervals我得到0.68和0.72之间的差异(我预计会有0.01个等级反应)。所以我检查差异是否低于0.72,连续3次我得到0.72和0.73,好几次我得到1.5,2.6,1.1甚至3.8。
它似乎并不可靠。文档说这次来自iPhone参考。两个设备同步以自动获得时间,因此它们尽可能彼此接近。
有没有人试过这个并想出一个可靠的解决方案,这不涉及让一个球保持不动?
答案 0 :(得分:3)
当我作为Sphero制造商Orbotix的开发人员开始时,我对球与球碰撞的主题进行了大量的研究。
这是一个非常复杂的问题需要解决。最接近我的工作(对于受感染的僵尸研究游戏)大约有80%的准确率,用于检测哪个球击中哪个球的样本大小为3.你投入的球越多,准确度越低成为。因此,我们决定通过让一个球在易受攻击之前停止移动来消除这个问题,就像Sphero TAG一样。
有一些因素限制了这种能力,似乎你已经发现了它们。我认为最大的问题是碰撞检测在球驾驶时表现不佳。特别是在粗糙的表面上或当球进行快速的不稳定运动时。仅这一点就会导致专业问题与死区时间相结合。
我能够将碰撞时间戳平均在50毫秒内。您是否考虑了在手机之间传输数据包的wifi延迟?
解决方案是您可能不想听到的,但您应该调整您的游戏以在碰撞检测功能内工作。也就是说,当它可以接触时,球的驱动速度非常慢,甚至可以像TAG一样停下来。问问自己,如何在没有球碰撞的情况下让这种乐趣变得有趣?
答案 1 :(得分:0)
我只是想说,首先,我们正在将我们的开发人员支持论坛转移到StackOverflow,这就是为什么你不能在论坛上发帖的原因。所以,你做了正确的事,西蒙,来到StackOverflow,你应该感到自豪。
我们刚刚将论坛改为重定向,而不是让人们感到困惑。
答案 2 :(得分:0)
Sphero生成的时间戳 。但它们才有意义,因为您正在使用轮询数据包时间命令来生成延迟和偏移值。请参阅API命令文档中的DID 00h,CID 50h。
话虽如此,碰撞检测是我们不断发展的技术。我们在机器人内部实时地在滑动数据窗口上采用巧妙编码的DFT频率变换。参数允许调整到您正在运行的表面;没有通用设置。如果您获得了太多的误报,那么请试验一下。如果您有改进算法的想法,请直接与我们联系,也许我们可以将其作为一种新的过滤方法。我们总是乐于接受聪明的想法!
答案 3 :(得分:0)
您可以在游戏开始时同步每个Sphero的内部计时器。这些可以与每个主机中的同步计时器匹配。时钟可能不同,但毫秒是毫秒。您还可以降低碰撞检测的阈值,从而使“事件”(损坏,感染等)只有在“攻击”Sphero以特定速度移动时才会发生。或其变体。