当前位置:首页|资讯|ChatGPT

三维斜抛运动定点打击解算和unity实现

作者:DeadCyber发布时间:2023-05-18

思路概述

    假设起点为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过去了,这点误差对我的项目来说可以接受:

结束。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1