找回密码
 立即注册
查看: 356|回复: 7

Unity 贝塞尔曲线实现抛物线运动,投掷功能实现

[复制链接]
发表于 2022-11-28 17:50 | 显示全部楼层 |阅读模式
贝塞尔曲线公式

/// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param>
/// <param name="start">曲线的起始位置</param>
/// <param name="center">决定曲线形状的控制点</param>
/// <param name="end">曲线的终点</param>
public static Vector3 GetBezierPoint(float t, Vector3 start, Vector3 center, Vector3 end)
{
    return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * center + t * t * end;
}
start(p0),center(p1),end(p2)三点确定一条贝塞尔曲线,传入t获取曲线上的坐标





确认起点,终点,和贝塞尔曲线的中间点

起点:警察的坐标
public Transform startTrans;
终点:地面上某个点
public Transform endTrans;
中间点:这里设置为起点和终点的向量相加再乘0.5,再加一个高度,所以应该是起点和终点的中间再偏上的位置,这样应该能得到一个对称的抛物线
var bezierControlPoint = (startPoint + endPoint) * 0.5f+(Vector3.up*height);


获取路径点

知道了起点,终点,和中间点我们就可以取得这个抛物线的曲线了

var startPoint = startTrans.position;
var endPoint=endTrans.Position;
var bezierControlPoint = (startPoint + endPoint) * 0.5f+(Vector3.up*height);

_path = new Vector3[resolution];//resolution为int类型,表示要取得路径点数量,值越大,取得的路径点越多,曲线最后越平滑
for (int i = 0; i < resolution; i++)
{
    var t = (i+1) / (float)resolution;//归化到0~1范围
    _path = GetBezierPoint(t,startPoint,bezierControlPoint,endPoint);//使用贝塞尔曲线的公式取得t时的路径点
}


绘制曲线

绘制曲线得方法有很多种,如直接在路径点上生成小球或其他指数物,以及使用lineRenderer绘制。
这里我选择使用LineRenderer
public LineRenderer lineRender;



使用之前得到的路径点给它赋值

_lineRender.positionCount = _path.Length;
_lineRender.SetPositions(_path);


沿路径运动

在玩家确定路径之后应该让物体沿着路径移动到目的地
使用Dotween插件的DoPath直接移动最为简单

grenade.DOPath(path, 0.8f).SetEase(Ease.Linear);

想让物体一直朝着路径方向需要再加上SetLookAt(0)

grenade.DOPath(path, 0.8f).SetLookAt(0).SetEase(Ease.Linear);
如果路径点较少,看起来不够平滑可以使用CatmullRom曲线插值类型运动,默认PathType.Linear
grenade.DOPath(path, 0.8f,PathType.CatmullRom);

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-11-28 17:59 | 显示全部楼层
t是啥
发表于 2022-11-28 18:09 | 显示全部楼层
你可以理解成方程式中的x,区间在0到1,如果你想获取抛物线起点的位置,就传入t=0,如果你想获得中间点的位置,t=0.5f,如果你想获得终点的位置,t=1.
发表于 2022-11-28 18:16 | 显示全部楼层
var time = (i+1) / (float)resolution; 是不是应该是 var t = (i+1) / (float)resolution;
发表于 2022-11-28 18:20 | 显示全部楼层
发表于 2022-11-28 18:20 | 显示全部楼层
那起点和终点不在一个水平面上的话是不是就不行了
发表于 2022-11-28 18:21 | 显示全部楼层
不是,终点在哪都行
发表于 2022-11-28 18:22 | 显示全部楼层
请教下,我按着你的教程实现了物体沿抛物线移动,但是加了setlookat之后物体就不见了,你知道是什么原因吗,我做的是2d的
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-22 14:57 , Processed in 0.098925 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表