一、參考知識(shí)
1搪搏、斜拋物體的軌跡
向斜上方拋出的物體狭握,受到跟它的速度方向不在同一直線上的重力作用而做曲線運(yùn)動(dòng),這種運(yùn)動(dòng)叫做斜拋運(yùn)動(dòng)疯溺。投出的標(biāo)槍和手榴彈论颅,大炮發(fā)射的炮彈,它們的運(yùn)動(dòng)都是斜拋運(yùn)動(dòng)囱嫩。做斜拋運(yùn)動(dòng)的物體恃疯,先是沿曲線上升,升到最高點(diǎn)后墨闲,又沿著曲線下降今妄。圖中閃光照片中小球的運(yùn)動(dòng)軌跡就是斜拋物體的運(yùn)動(dòng)軌跡,這個(gè)軌跡就是一條拋物線。
通常是水平和豎直兩個(gè)方向上分解蛙奖,以便于利用直角坐標(biāo)系進(jìn)行計(jì)算潘酗。我們把初速度v0分解為水平方向上的分速度vx=v0cosθ和豎直方向上的初速度vy=v0sinθ,在水平方向上雁仲,物體不受力仔夺,做勻速直線運(yùn)動(dòng),速度等于vx攒砖;在豎直方向上做豎直上拋運(yùn)動(dòng)缸兔,初速度等于vy。把上圖中閃光照片里斜拋的小球的位置跟左邊和下邊的兩幅對(duì)照?qǐng)D比較吹艇,就可以看出斜拋運(yùn)動(dòng)是上述兩個(gè)分運(yùn)動(dòng)的和運(yùn)動(dòng)惰蜜。
2、射程與射高
在斜拋運(yùn)動(dòng)中受神,從物體被拋出的地點(diǎn)到落地點(diǎn)的水平距離X叫做射程抛猖。物體到達(dá)的最大高度Y叫做射高。斜拋物體的射程與射高跟那些因素有關(guān)呢鼻听?
用圖所示的裝置來做實(shí)驗(yàn)财著,可以看到,在噴水嘴方向不變(即拋射角不變)時(shí)撑碴,隨著容器中水面的降低撑教,噴出的水流速度減小,它的射程也隨著降低醉拓。
如果在噴水過程中保持容器內(nèi)水面的高度不變伟姐,噴出的水流速度也就不變。改變噴水嘴的方向亿卤,可以看到愤兵,在拋射角小的時(shí)候,射程隨著拋射角的增大而增大排吴,當(dāng)拋射角達(dá)到45°時(shí)恐似,射程最大;繼續(xù)增大拋射角傍念,射程反而減小。但是水流的射高一直是隨拋射角的增大而增大的葛闷。
上面的討論中我們沒有考慮空氣的阻力憋槐。實(shí)際上,拋體運(yùn)動(dòng)總要受到空氣阻力的影響淑趾。在初速度比較小時(shí)阳仔,空氣阻力可以忽略不計(jì),但是在初速度很大時(shí)(例如射出的炮彈),空氣的影響是很明顯的近范,圖中虛線是在理想的沒有空氣阻力的空間中炮彈飛行的軌跡嘶摊;實(shí)線是以相同的初速度和拋射角射出的炮彈在空氣中飛行的軌跡,這種曲線叫做彈道曲線评矩∫抖眩可以看出,彈道曲線跟拋物線實(shí)際上有很大差別斥杜。用20°角射出的初速度是600m/s的炮彈虱颗,假如沒有空氣阻力,射程可以達(dá)到24km蔗喂,由于空氣阻力的影響忘渔,實(shí)際射程只有7km,射高也減小了缰儿。
3畦粮、在Unity中計(jì)算射程與落點(diǎn)
/// <summary>
/// 得到球拋物線的落點(diǎn)
/// </summary>
/// <param name="startPos">球初始位置</param>
/// <param name="vel">球運(yùn)動(dòng)的初始的方向和大小</param>
/// <returns></returns>
public Vector3 GetTennisDropPoint(Vector3 startPos, Vector3 vel)
{
//球初速度
float _vel = vel.magnitude;
//直接算斜邊與水平的角度
float angle = Vector3.Angle(new Vector3(vel.x, 0, vel.z), vel);
//網(wǎng)球斜上拋后的射程
float s = _vel * _vel * Mathf.Sin((2 * angle) * Mathf.Deg2Rad) / Physics.gravity.magnitude;
//計(jì)算z和x軸的分射程
float anglez = Vector3.Angle(Vector3.forward, new Vector3(vel.x, 0, vel.z));
float s_z = s * Mathf.Cos(anglez * Mathf.Deg2Rad);
float s_x = s * Mathf.Sin(anglez * Mathf.Deg2Rad);
//判斷往左還是往右
Vector3 v3 = Vector3.Cross(Vector3.forward, new Vector3(vel.x, 0, vel.z));
if (v3.y < 0)
{
s_x *= -1;
}
//返回落點(diǎn)
return new Vector3(startPos.x, 0, startPos.z) + new Vector3(s_x, 0, s_z);
}