使用Unity画一条平滑曲线(贝塞尔曲线)并使小球沿曲线运动
来源:互联网 发布:sql developer 查询 编辑:程序博客网 时间:2024/05/16 09:17
关于贝塞尔曲线知识(请具体阅读)转载自:http://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html
这里直接讲解在U3D中的实现方式直接拿三阶贝塞尔曲线为例,首先观察下图:
从图中可以看出,只有四个点是保持不变的,分别是P0,P1,P2,P3,这四个点两两相连得到三个线段
(1)在上四点构成的三个线段中,p0-p1上有到一个点,p1-p2上有到一个点,p2-p3上有到一个点,这三个点分别这在上三个线段做差值运算。现在以上三个点分别取名为A1,A2,A3,这三点两两相连得到绿色线
(2)继续观察可看出,上面得到的三个点构成二个线段,A1-A2上得到一点,A2-A2上有一个点。这两点分别在这二个线段上做差值运算,现将这两点分别为B1,B2。这两点相连得到蓝色线
(3)再观察蓝色线上可看出,有一点在这做差值运算,最终轨迹画成曲线。
//实现代码如下:(这里我比上面多添加了一个点,最外层有5个点,依次4个,3个,2个)//并添加了一个小球,没沿曲线上运动using UnityEngine;using System.Collections;using System.Collections.Generic;public class DrawLine : MonoBehaviour { public List<Transform> gameOjbet_tran = new List<Transform>(); private List<Vector3> point = new List<Vector3>(); public GameObject ball; public float Speed = 1; public float Time1 = 2f; private float Timer = 0; int i = 1; // Use this for initialization void Init() { point = new List<Vector3>(); for (int i = 0; i < 200; i++) { //一 Vector3 pos1 = Vector3.Lerp(gameOjbet_tran[0].position, gameOjbet_tran[1].position, i / 100f); Vector3 pos2 = Vector3.Lerp(gameOjbet_tran[1].position, gameOjbet_tran[2].position, i / 100f); Vector3 pos3 = Vector3.Lerp(gameOjbet_tran[2].position, gameOjbet_tran[3].position, i / 100f); Vector3 pos4 = Vector3.Lerp(gameOjbet_tran[3].position, gameOjbet_tran[4].position, i / 100f); //二 var pos1_0 = Vector3.Lerp(pos1, pos2, i / 100f); var pos1_1 = Vector3.Lerp(pos2, pos3, i / 100f); var pos1_2 = Vector3.Lerp(pos3, pos4, i / 100f); //三 var pos2_0 = Vector3.Lerp(pos1_0, pos1_1, i / 100f); var pos2_1 = Vector3.Lerp(pos1_1, pos1_2, i / 100f); //四 Vector3 find = Vector3.Lerp(pos2_0, pos2_1, i / 100f); point.Add(find); } } void OnDrawGizmos()//画线 { Init(); Gizmos.color = Color.yellow; for (int i = 0; i < point.Count-1; i++) { Gizmos.DrawLine(point[i], point[i + 1]); } }//------------------------------------------------------------------------------ //使小球没曲线运动 //这里不能直接在for里以Point使用差值运算,看不到小球运算效果 //定义一个计时器,在相隔时间内进行一次差值运算。 void Awake() { Init(); } void Update() { Timer += Time.deltaTime; if (Timer > Time1) { Timer = 0; ball.transform.localPosition = Vector3.Lerp(point[i - 1], point[i], 1f); i++; if (i >= point.Count) i = 1; } }}
0 0
- 使用Unity画一条平滑曲线(贝塞尔曲线)并使小球沿曲线运动
- 使用Unity画一条平滑曲线(贝塞尔曲线)并使小球沿曲线运动
- 利用贝塞尔曲线实现小球曲线运动
- 曲线平滑-贝塞尔曲线
- Android 使用贝塞尔曲线将多点连成一条平滑的曲线
- 怎么用U3D画 平滑曲线(贝塞尔曲线)
- Unity 实现 曲线运动轨迹(也可以攻击曲线标志等曲线)
- unity使用贝塞尔曲线
- Unity使用贝塞尔曲线
- 曲线平滑-贝塞尔曲线
- 画平滑曲线 & 曲线加粗
- Android开发 之 曲线运动动画(贝塞尔曲线)
- Qt画平滑曲线
- swing 画平滑曲线
- 贝塞尔曲线 --匀速贝塞尔曲线运动的实现
- 平滑曲线连接各点(贝塞尔曲线)
- Unity中使用贝塞尔曲线
- unity中使用贝塞尔曲线
- HDOJ Secrete Master Plan (求矩阵翻转是否和给定矩阵相同)
- 黑马程序员---反射小结
- json
- 2、实例变量可⻅度与方法
- 记录——《C Primer Plus (第五版)》第十章编程练习第一题
- 使用Unity画一条平滑曲线(贝塞尔曲线)并使小球沿曲线运动
- 传智播客 Android 音乐播放器笔记 之mediaplayer
- JavaScript 检测数组
- iOS动画 CATransition动画
- 警惕泛型是不能协变和逆变的
- ASP.NET中防止页面多次加载的IsPostBack属性
- 实验三 二叉树的基本操作(建立)及遍历
- 杭电-1495非常可乐(BFS)
- Android问题集锦之四十五:undefined reference to 'srand'