Unity 使用贝塞尔曲线实现抛物线运动
在游戏中使用Tween+贝塞尔曲线实现一个抛物线的效果。
1、线性贝塞尔曲线公式:
给定点P0、P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出:
2、二次贝塞尔曲线公式:
二次方贝兹曲线的路径由给定点P0、P1、P2控制,这条线由下式给出:
3、三次贝塞尔曲线公式:
P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是用来充当控制点。P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。
曲线的参数形式为:
这里使用二次贝塞尔曲线实现抛物线运动:
代码如下
using DG.Tweening;
using System;
using System.Collections;
using UnityEngine;public class CurvedMoveEffect : MonoBehaviour
{private Action callback = null;[SerializeField]private GameObject startPos, endPos;private void Start(){MoveTo(startPos.transform.position, endPos.transform.position, 0.6f, 1, null);}private void OnComplete(){if (callback != null){callback.Invoke();}Destroy(gameObject);}/// <param name="centerOffset">中心点偏移量,0.5为基准,调整幅度0.01,根据实际调整</param>public void MoveTo(Vector3 startPos, Vector3 endPos, float centerOffset, float time = 0.5f, Action callback = null){this.callback = callback;gameObject.transform.position = startPos;gameObject.SetActive(true);StartCoroutine(Move(startPos, endPos, centerOffset, time, OnComplete));}//如果有拖尾效果,延迟一定时间再显示,否则尾巴会有残影IEnumerator Move(Vector3 startPos, Vector3 endPos, float centerOffset, float time = 0.5f, Action onComplete = null){TrailRenderer trail = gameObject.GetComponentInChildren<TrailRenderer>(true);yield return new WaitForSeconds(trail ? trail.time : 0);//如果路径点较少,可以使用CatmullRom曲线插值类型运动,默认PathType.Linear//同时可以设置easetype来使用不同的运动方式,其它easetype:https://blog.csdn.net/w0100746363/article/details/83587485//如果想让物体一直朝着路径方向可以加上SetLookAt(0):DOPath(path, time).SetLookAt(0);Tween tween = gameObject.transform.DOPath(Path(startPos, endPos, centerOffset, 6), time, PathType.CatmullRom).SetEase(Ease.OutSine);if (onComplete != null){tween.OnComplete(new DG.Tweening.Core.TweenCallback(onComplete));}if (trail)trail.enabled = true;}private Vector3[] Path(Vector3 startTrans, Vector3 endTrans, float centerCtl, int segmentNum){var startPoint = startTrans;var endPoint = endTrans;//中间点:起点和终点的向量相加再乘一个系数,系数可以根据实际调整var bezierControlPoint = (startPoint + endPoint) * centerCtl;//segmentNum为int类型,路径点数量,值越大,路径点越多,曲线越平滑Vector3[] path = new Vector3[segmentNum];for (int i = 0; i < segmentNum; i++){var time = (i + 1) / (float)segmentNum;//归化到0~1范围path[i] = GetBezierPoint(time, startPoint, bezierControlPoint, endPoint);//使用贝塞尔曲线的公式取得t时的路径点}return path;}/// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param>/// <param name="start">曲线的起始位置</param>/// <param name="center">决定曲线形状的控制点</param>/// <param name="end">曲线的终点</param>private Vector3 GetBezierPoint(float t, Vector3 start, Vector3 center, Vector3 end){return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * center + t * t * end;}
}
另外,相同的中间点偏移系数在场景中Canvas的不同Render Mode和MainCamera的不同Projection时都可能产生不同的效果,需要根据实际情况调整。
Unity 使用贝塞尔曲线实现抛物线运动相关推荐
- unity 控制点 贝塞尔曲线_在Unity中使用贝塞尔曲线(转)
鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...
- unity之贝塞尔曲线
简介 什么是贝塞尔曲线 贝塞尔曲线(Bezier curve),又称 贝兹曲线 或 贝济埃曲线 ,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,当时主要用于汽车主体设计.现主要应 ...
- Unity ——使用贝塞尔曲线对三维管状物体进行弯曲
参考链接:[Unity]弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文:吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): ...
- 【Unity】贝塞尔曲线关于点、长度、切线计算在 Unity中的C#实现
写在前面 最近给项目做了个路径编辑,基本思路是满足几个基本需求: [额外说明]其实本篇和这个没关系,可以跳过"写在前面"这部分,跨到正文部分 编辑时: ① 随意增减.插入.删除路点 ...
- unity 控制点 贝塞尔曲线_在Unity中使用贝塞尔曲线
前言 最近项目需要呈现各种轨道且随机性较强,在找了一天插件后打算自己实现平滑曲线,思路是策划对关卡中的轨道放置任意个节点,我通过代码将所有节点绘制成一条平滑的曲线,每两个节点之间通过三阶贝塞尔实现,最 ...
- Unity笔记-贝塞尔曲线
定义 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像 ...
- unity 控制点 贝塞尔曲线_Handles.DrawBezier 绘制贝塞尔曲线
Handles.DrawBezier 绘制贝塞尔曲线 static function DrawBezier (startPosition : Vector3, startTangent : Vecto ...
- 贝塞尔曲线实现抛物线运动,投掷功能实现
贝塞尔曲线公式 /// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param> /// <param name ...
- Unity画贝塞尔曲线自定义图片组件
头一回写这个文章,也是就分享一点自己的学习心得,并且记录下自己做过的这个功能. 事实上我这也是借鉴了大佬的代码,统筹琢磨出来的,比较初级,但是有用. 话不多说,上效果图: 如图所见,展现出来的功能组件 ...
最新文章
- 是我太天真之被BUG按在地上疯狂摩擦
- java 底层方法_底层方法测试--【Java】
- 11g 64位部分安装过程
- 带参数的过滤器|| 过滤器案例:格式化日期|| time.js ||
- union-find算法分析(1)
- IE与IE内核浏览器的那点事
- 怎么读取瑞萨mcu的 checksum_为物联网设备选择一颗“安全”的MCU
- Vue.js 介绍及其脚手架工具搭建
- python编程从入门到精通实践_《Python编程:从入门到实践》总结_Day01
- idea项目(git)版本回退
- Photoshop 入门教程「4」如何使用撤消命令?
- R语言不止可以做数据分析,还可以变着方法玩出花
- puppet学习—默认WEBRick安装DashBoard
- 6.面向对象的三大特征
- [转] Web前端开发工程师常用技术网站整理
- 软件开发模型-螺旋模型
- 格雷码转换成二进制c语言程序,各位老师格雷码和二进制有什么区别,怎么转换....
- ISO639等多语言列表信息
- html中电子邮件地址怎么写,电子邮件地址怎么写
- Only the Paranoid Survive
热门文章
- python发html邮件_在python中如何制作发送HTML格式的邮件?
- Kafka SSL 和 ACL 配置
- 总结:python代码实现矩阵最基本操作
- 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC
- ZBrush笔刷整理大合集
- 互动微剧《明星大侦探》打造沉浸式探案体验
- YOLO家族再度升级——阿里达摩院DAMO-YOLO重磅来袭
- 基于51单片机TLC2543芯片实现AD转换
- PhoneGapjQuery Mobile应用开发环境配置(For Android)
- 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能