[游戏开发]无目标抛物线弹道实时计算,含二维、三维、真实落点推导

本文探讨了游戏中抛物线运动的数学原理,包括平抛和斜抛运动,以及如何在UE引擎中通过公式计算物体的运动轨迹、旋转、落地时间和碰撞预测。作者详细给出了代码示例,涵盖了二维到三维坐标转换,以及抛物线的最大高度和旋转值计算。

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

前言

下文中无论是弓箭、弩车、还是投石车,发射出的物体以抛射物命名

无特殊要求,抛射物不考虑其他力,只考虑重力加速度g

t        抛射物飞行总时间 从0到T,如果不碰撞,或者不让它死亡,T是无穷大,无限飞。

Vo     抛射初速度,恒定不变

ϴ       抛射时角度,恒定不变

g        重力加速度,恒定不变

Vy      垂直方向Y轴当前速度,随重点不断变化 Vy = Vo * Sinϴ - g * t

Vx      前方向X轴当前速度,恒定不变  Vx = Vo * Cosϴ 

在我们推导运动的过程中,有下面5个公式可以直接使用,无须推导,其中u是初速度,v是当前速度。

注意事项

下文中说的Sin是角度制,在UE引擎中要区分Sin角度和Sin弧度接口

正文

游戏中常见的抛物线形式有两种

1:平抛运动,例如弩车

2:投石车、弓箭手斜抛运动

在实际开发中,我们还会遇到两种不同的情况

  1. 第一种是射击目标坐标已知(例如阴阳师那种回合制战斗游戏,弓箭手向固定坐标射一箭,可以用贝塞尔曲线模拟一个假的弹道就行了,箭的旋转方向就是贝塞尔曲线的切线方向)
  2. 第二种是射击目标坐标未知(弓箭手拉弓,向上抬ϴ角度,射一箭,具体射谁我也不知道,这种情况下就需要实时计算弓箭的位置和朝向)

第一种情况直接用二次贝塞尔曲线做假弹道,弹道的高度或者说弧度取决于你中间点的摆放位置,C#和Lua版本的贝塞尔曲线代码以及切线代码如下

XXXXXXXXXXXXXXXXXXXXXXXXXXXX

无目标抛物线弹道

在游戏中,我们需要知道每一帧抛射物的位置,以及朝向,然后刷新抛射物的坐标和旋转,但我们已知的数据只有初始速度,射击角度,重力,还有一个很重要的自变量(飞行总时长)

下面的公式是二维运行时间t和高度y的对应关系

//Vo 射击方向的初速度
//t  抛射物经过总时长
//g  重力

//运行t时间的高度值y
y = Vo * Sinϴ * t - 1/2 * g * t² 

//垂直方向的速度,垂直上抛自由落体公式 V-V₀=-gt,公式中的初速度 Vo是我们Y轴的速度 Vo * Sinϴ

Vy = Vo * Sinϴ - g * t

//向前移动的距离
x = Vo * Cosϴ * t

//水平方向速度 恒定不变
Vx = Vo * Cosϴ 

实时二维坐标(Vo * Cosϴ * t,Vo * Sinϴ * t - 1/2 * g * t² )

提问:上面三个公式,y的值可以设置当前三维坐标的y值代表高度,t可以设置当前坐标的横移x

求Vy和Vx的目的是什么

那当然是为了设置旋转啦,光有坐标怎么行,以箭头为例,在飞行过程中,箭头的朝向始终是抛物线的切线方向

后面再介绍抛射物旋转

求发射点坐标系落地点路程和运动时间 t1

我们的投石车坐标和发射坐标肯定不是一个位置,那么发射点落地点和真实落地点肯定有偏差,我们先计算以发射点坐标系的落地点所用时间t1

根据公式 y = Vo * Sinϴ * t - 1/2 * g * t1² ࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little丶Seven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值