本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文讲Unity碰撞检测问题。
问题:
Tomáš Zato
我在尝试检测,发射体是否要撞击防护体,以及碰撞在哪里发生。
这幅图可以显示出具体的情形,虽然A和B发射体距离中心防护体中心S的距离基本相同,但是一个会撞击到防护体,另一个却不会。
用简单的数学来解决它,需要用到圆的数学方程和发射体路径线的方程。只要用一支笔和一张纸,我就能计算出来。然而,我直接解析几何的经历非常糟糕。此外,发射体将离开防护体,返回阳极。怎样过滤它们呢?
第二种方法是比较友好的方法——测量发射体路径与防护体中心的最短距离,如果L比R小,就发生碰撞。看上去很容易实现,但是这不能让我知道碰撞在哪里发生。
我做的是二维游戏,使用C#和Unity游戏引擎,欢迎大家提出各种通用解决方法。
发射体的大小忽略不计。
回答:
Lajos Arpad
你的防护体可以被描述成:
(X - X1)^2+ (Y - Y1)^2= R^2
发射体的路径线可以描述为:
Y - Y3 = ((Y4 -Y3) / (X4 - X3)) * (X - X3)
从这里:
Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3
用上述拓展第一个方程,得到:
(X - X1)^2+ (((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3 -Y1)^2= R^2
这是一个 二次方程 ,如果解决则能给出交点的X值。阅读链接中的二次方程解决方案,它将用一个公式获得第一个脉冲来解决问题。当然,如果判别式为负,就没有交点,那么方程式就没有真正的答案。如果判别式是0,那么发射体就会触碰到防护体。如果判别式为正,那你就获得了答案,用方程式的结果退出X。
知道了X的值之后,就可以计算用下面的公式计算Y的值。
Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3
最后注意,只有在发射体的路径线不是垂直的才能够起作用,因为那样X4就等于X3,导致基本方程无用。当出现发射体穿过一条直线的情况下,线的公式为:
X = X1
然后使用公式:
Y = ((Y4 - Y3) / (X4 - X3)) * (X - X3) + Y3
来获得可能的解决方案。(再次声明,这是一个二次元方程)
所以这一执行应该检查发射体的路径线是否垂直,然后根据具体情况选择相应的解决方案。希望这能帮到你。
原文链接:Detecting possible projectile vs shield collision
文章选自StackOverFlow社区,鉴于其内容对于开发者有所帮助,现将文章翻译于此,供大家参考及学习。9Tech将每日持续更新,读者可点击StackOverflow(简称:SOF)精选问答汇总,查看全部译文内容。同时,我们也招募志同道合的技术朋友共同翻译,造福大家!
建议使用电驴(eMule)下载分享的资源。
说明:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|