三維斜拋運(yùn)動(dòng)定點(diǎn)打擊解算和unity實(shí)現(xiàn)
思路概述
? ? 假設(shè)起點(diǎn)為source,目標(biāo)點(diǎn)為target,source以theta角度朝上拋出,求初速度M使得能夠正好落在target。
? ? 可以將問題分為2個(gè)部分。
????第1部分,求得“仰角”為theta的拋出方向ThrowDir。
????第2部分,解算求得初速度M。
????可以將運(yùn)動(dòng)劃分為2個(gè)部分。
????第1部分,從出發(fā)點(diǎn)開始到最高點(diǎn)結(jié)束。
????第2部分,從最高點(diǎn)開始到target結(jié)束。


拋射方向
我用chatGPT問的,然后改了一下bug。dir為target-source方向,angle為“仰角”
列關(guān)系式
設(shè)throwDir的xz平面分量大小為k1,垂直大小為k2。
設(shè)source和target的水平距離d1,垂直距離d2。
設(shè)h為第一階段垂直距離。
設(shè)第1階段用時(shí)t1,第2階段用時(shí)t2。
????關(guān)系1:t1*g=M*k2。因?yàn)橹皇苤亓?,垂直速度均勻降?
????關(guān)系2:h=M*k2*t-1/2*g*t^2。初中“公式”,其實(shí)是速度Mk2-gt積分來的。
????關(guān)系3:d2+h=1/2*g*t^2。同理初中“公式”,因?yàn)榈诙A段是從最高點(diǎn)0速度開始的。
????關(guān)系4:M*k1*(t1+t2) = d1。 水平方向是勻速運(yùn)動(dòng)。
公式見下圖,

由于貌似不能化簡(jiǎn)出簡(jiǎn)單方程,所以用二分法(我圖省事)解算方程。
以上圖波浪線的關(guān)系,也就是水平位移關(guān)系式做解方程f(x)=0。
即為f(M) = M*k1*(t1+t2) - d1 = 0,求零點(diǎn)。
f比較復(fù)雜:
整個(gè)變量初始化和解算:
二分法解方程代碼(設(shè)定了最多100000步,其實(shí)10來步error就<0.0001了):
迭代和終點(diǎn)問題
1.必須使用FixedUpdate
2.必須先speed+=a*dt,其次pos+=speed*dt
3.由于到終點(diǎn)速度過快,無法完全對(duì)準(zhǔn):

由于我的需求是完全對(duì)準(zhǔn),所以就硬set過去了,這點(diǎn)誤差對(duì)我的項(xiàng)目來說可以接受:
結(jié)束。