思路概述
假设起点为source,目标点为target,source以theta角度朝上抛出,求初速度M使得能够正好落在target。
可以将问题分为2个部分。
第1部分,求得“仰角”为theta的抛出方向ThrowDir。
第2部分,解算求得初速度M。
可以将运动划分为2个部分。
第1部分,从出发点开始到最高点结束。
第2部分,从最高点开始到target结束。
抛射方向
我用chatGPT问的,然后改了一下bug。dir为target-source方向,angle为“仰角”
列关系式
设throwDir的xz平面分量大小为k1,垂直大小为k2。
设source和target的水平距离d1,垂直距离d2。
设h为第一阶段垂直距离。
设第1阶段用时t1,第2阶段用时t2。
关系1:t1*g=M*k2。因为只受重力,垂直速度均匀降为0
关系2:h=M*k2*t-1/2*g*t^2。初中“公式”,其实是速度Mk2-gt积分来的。
关系3:d2+h=1/2*g*t^2。同理初中“公式”,因为第二阶段是从最高点0速度开始的。
关系4:M*k1*(t1+t2) = d1。 水平方向是匀速运动。
公式见下图,
由于貌似不能化简出简单方程,所以用二分法(我图省事)解算方程。
以上图波浪线的关系,也就是水平位移关系式做解方程f(x)=0。
即为f(M) = M*k1*(t1+t2) - d1 = 0,求零点。
f比较复杂:
整个变量初始化和解算:
二分法解方程代码(设定了最多100000步,其实10来步error就<0.0001了):
迭代和终点问题
1.必须使用FixedUpdate
2.必须先speed+=a*dt,其次pos+=speed*dt
3.由于到终点速度过快,无法完全对准:
由于我的需求是完全对准,所以就硬set过去了,这点误差对我的项目来说可以接受:
结束。