游戏中抛物线的计算

最近在设计一个炮打怪物的游戏动作,大炮打出子弹后子弹沿抛物线轨迹运行,同时怪物也在移动。

因此就需要预计子弹会与怪物在何处相遇。

好吧,众所周知,三点确定一抛物线,那我们就来找三个点吧。

(x1,y1),子弹发射点;

(x2,y2),目标所在点;

第三个点该如何确定呢?

其实这里我们需要再给出一个条件。

一般游戏效果会有这几种要求:

--第一种--

 抛物线的高度为定值:

 

 

如图,有几个点很重要,a(x1,y1) ,子弹的发射点;c(x2,y2), 目标的当前位置;b现在还不知道,也就是子弹的射击点

另外需要知道目标的移动速度v2,抛物线可以达到的高度h;

我们设从发射点到达抛物线最高点需要时间t1,从最高点到达点射击点时间t2;

t1 = sqrt(2*h/g);[注:g为重力加速度] ;t2 = sqrt( 2*(h + y2-y1)/g );

子弹出射速度分解为vx 和 vy;

vx = (x2 - x1)/(t1 + t2) - v2;

设抛物线方程: y = a*pow(x - b,2) + c;  ---这里使用顶点式,稍后解释为什么。

首先,假设抛物线顶点在y轴上,这样b = 0;x1 = -vx*t1;c = y1 + h;  [屏幕显示的默认坐标系中y的正向是朝下的,要注意]

好了,把已知量代入,求得a = h/pow(vx*t1,2);

然后平移抛物线,使a点与发射点重合就ok了; (变量设重名了,原谅我吧 - -|||)

 

 

--第二种--

发射角固定:

这种跟上一种的思路一样,也是求出 t1 , t2,

但是高度不知道就不能一步步求解,需要建立方程组了;

设抛物线高度为h,

---h = pow(vy,2)/(2*g) ,

|  t1 = sqrt(2*h/g);

|  t2 = sqrt( 2*(h + y2-y1)/g );

|  vx= vy/tan(alpha);

---vx = (x2 - x1)/(t1 + t2) - v2;

 

 

=> (vx + v2*tan(alpha))*(vx+sqrt(   pow(vx,2)  + 2*g*(y2 - y1)  )) = tan(alpha)*g*(x2 - x1);

 

这个方程式解起来有难度,感谢baidu知道为我求解的小朋友^_^

 

设 i = v2*tan(alpha);

j = g*(x2 - x1);

k = tan(alpha)*2*g*(y2 -y1)

 

vx 1= (- i*j - i*k + sqrt( i^2*j^2 + 2*j^3 + j^2*k ) )/2*j + k ;

vx 2= (- i*j - i*k - sqrt( i^2*j^2 + 2*j^3 + j^2*k ) )/2*j + k ;

 

右,下正值;左,上负值

下面的求解过程如上。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity是一款强大的游戏开发引擎,支持创建各种3D和2D游戏。在Unity,要创建抛物线效果的网格(mesh),可以使用以下步骤: 1. 首先,在Unity创建一个空物体作为抛物线网格的父物体。 2. 在该空物体上添加一个Mesh Filter(网格过滤器)组件,并设置其Mesh属性为一个新创建的Mesh实例。 3. 继续在该空物体上添加一个Mesh Renderer(网格渲染器)组件,这样就可以在游戏场景看到抛物线网格的显示效果。 4. 在代码,先创建一个空的Mesh实例,并获取其顶点、法线、三角形索引等属性的引用。 5. 使用for循环来生成抛物线上的顶点位置。 6. 将顶点位置数据赋值给Mesh实例的vertices属性。 7. 计算并赋值Mesh实例的法线数据,以确保抛物线网格正确渲染光照效果。 8. 生成并赋值Mesh实例的三角形索引数据,用于指定顶点之间的连接顺序。 9. 调用Mesh实例的RecalculateBounds()方法来重新计算其边界,以确保抛物线网格在场景正确显示。 10. 使用Mesh Filter组件的sharedMesh属性引用生成的Mesh实例,进而实现抛物线网格的显示。 通过以上步骤,我们可以在Unity创建一个抛物线的网格。这个网格可以用于渲染游戏场景的物体,或者用于创建一些特殊的游戏效果,如飞行轨迹、弹道轨迹等。而Mesh这个类则是Unity用于创建和操纵网格的重要组件,通过设置其顶点、法线、纹理等属性,我们可以根据需求生成不同形状和效果的网格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值