砸向敌人的炮弹:已知初速度让抛物线过任意点

本文介绍了一种在游戏开发中实现炮弹轨迹精确命中目标的方法。通过数学推导得出适用于程序的公式,使得炮弹能在已知初速度的情况下,调整发射角度以命中射程内的任意目标点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自http://bbs.9ria.com/thread-171055-1-1.html


这个问题大家做游戏的时候可能都遇到过,最近手上一个项目正好用到,昨天推导了一下适用于程序的公式,不敢藏私分享给大家。
问题:如何使初速度恒定的炮弹,以合适的角度击中射程内的任意点,画图表示的话就是这样:已知炮弹初速度,求发射角度使抛物线过某点 p(就是小蘑菇同学了)。这在一些需要计算提前量的射击游戏中很有用。

 

推导过程比较繁琐,简单说下:
1  假设角度α
2  获得初始速度的横纵向两个分量
3  列出其到达指定点p 的加速度公式和速度公式(纵向为恒加速的直线运动,横向为匀直运动)
4  最后利用三角函数公式将前式子归纳为一个关于 Math.tan(a)的一元二次方程
5  利用一元二次方程求解公式获得 Math.tan(α)的值(此处会获得两个值,可以直接取绝对值较小最小的那个)
6  利用反三角函数获得 角度α。

好了不废话了 直接给出公式如下,需要的同学自取即可,注意加速度应为负数

//speed:初始速度//g :重力加速度//bp: 初始点//tp: 目标点
public function getAngleToPoint(speed:Number,g:Number,bp:Point,tp:Point):Number{                                                //获得坐标差
                        var dx:Number=tp.x-bp.x;
                        var dy:Number=tp.y-bp.y;
                        
                        //tempV: 便于简化计算的一个临时变量
                        var tempV:Number=g*dx/(2*speed*speed)
                        
                        //根据一元二次方程会有两个解,对应一个角度较高和一个较低的两条抛物线,均可到达指定点
                        //这里为了便于应用两个角度的解都给出,一般只计算减法解即可
                        var ta1:Number=(1+Math.sqrt(1-4*tempV*(tempV+dy/dx)))/(2*tempV);
                        var ta2:Number=(1-Math.sqrt(1-4*tempV*(tempV+dy/dx)))/(2*tempV);
                        
                        //超出射程范围时无解,故需要判断(这里只取了减法解)
                        if(!ta2){
                                return NaN
                        }else{
                        //由于是用原始的反正切函数,所以需要判断一下象限,注意所得到的为弧度
                                return Math.atan(ta2)
                        }
                        
                }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值