贝塞尔曲线绘制原理& unity 3d实现绘制贝塞尔曲线
2016-12-14 21:38
976 查看
贝塞尔曲线是一种绘制曲线的方法,它的原理很简单:
以二阶贝塞尔曲线为例
如图,在p0,p1之间移动着一个点,我们先称之为a0,同样在p1,p2之间移动着一个点,我们称之为a1。他们需要满足的条件是这样的,在移动中,保证线段p0a0:p0p1=p1a1:p1p2=X
,这个比值X是从0到1逐渐变化的。
然后我们连接a0,a1,在线段a0a1上有一点b0,我们同样保证a0b0:a0a1=X;最后X从0到1变化的过程就是如图所显示的样子。这就是贝塞尔曲线。简单吧!
相对于更高阶的,原理一样,如果你有时间有耐心,函数很容易写出来的,这里只用二阶作为例子。
二阶函数点的位置可以这样计算
a0=p0+(p1-p0)*X;
a1=p1+(p2-p1)*X;
b0=a0+(a1-a0)*X;
这样我们根据p0,p1,p2的坐标就求出b0的坐标,b0的运动轨迹就是贝塞尔曲线。
三个公式最后得出:
b0=X*X*(p0+p2-2*p1)+2*X*(p1-p0)+p0
知道原理,接下来我们用unity3d实现起来就容易了。
代码如下:将脚本赋予一个空gameobject,并将新建的三个cube分别拖入对应空缺物体,运行游戏拖动物体就能看到贝塞尔曲线的变化。注意:这里只能在场景中拖动,不能在游戏视图中拖动,因为
Debug.DrawLine方法是只能在场景中显示的。
unity3d项目资源可以点击 这里 下载
以二阶贝塞尔曲线为例
如图,在p0,p1之间移动着一个点,我们先称之为a0,同样在p1,p2之间移动着一个点,我们称之为a1。他们需要满足的条件是这样的,在移动中,保证线段p0a0:p0p1=p1a1:p1p2=X
,这个比值X是从0到1逐渐变化的。
然后我们连接a0,a1,在线段a0a1上有一点b0,我们同样保证a0b0:a0a1=X;最后X从0到1变化的过程就是如图所显示的样子。这就是贝塞尔曲线。简单吧!
相对于更高阶的,原理一样,如果你有时间有耐心,函数很容易写出来的,这里只用二阶作为例子。
二阶函数点的位置可以这样计算
a0=p0+(p1-p0)*X;
a1=p1+(p2-p1)*X;
b0=a0+(a1-a0)*X;
这样我们根据p0,p1,p2的坐标就求出b0的坐标,b0的运动轨迹就是贝塞尔曲线。
三个公式最后得出:
b0=X*X*(p0+p2-2*p1)+2*X*(p1-p0)+p0
知道原理,接下来我们用unity3d实现起来就容易了。
代码如下:将脚本赋予一个空gameobject,并将新建的三个cube分别拖入对应空缺物体,运行游戏拖动物体就能看到贝塞尔曲线的变化。注意:这里只能在场景中拖动,不能在游戏视图中拖动,因为
Debug.DrawLine方法是只能在场景中显示的。
using UnityEngine; using System.Collections; public class draw : MonoBehaviour { public GameObject v0, v1, a0; LineRenderer lineRenderer; //Vector3 v0, v1;//顶点 //Vector3 a0; float jianxi = 0.05f;//绘制的0-1的间隙 越小曲线越接近曲线, // Use this for initialization void Start () { } // Update is called once per frame void Update () { for(float i=0;i<1;i+=jianxi) { Debug.DrawLine(po(i, v0, v1, a0), po(i + jianxi, v0, v1, a0), Color.red); Debug.DrawLine(v0.transform.position,a0.transform.position, Color.green); Debug.DrawLine(a0.transform.position, v1.transform.position, Color.green); } } private Vector3 po(float t,GameObject v0, GameObject v1, GameObject a0)//根据当前时间t 返回路径 其中v0为起点 v1为终点 a为中间点 { Vector3 a; a.x = t * t * (v1.transform.position.x - 2 * a0.transform.position.x + v0.transform.position.x) + v0.transform.position.x + 2 * t * (a0.transform.position.x - v0.transform.position.x);//公式为B(t)=(1-t)^2*v0+2*t*(1-t)*a0+t*t*v1 其中v0为起点 v1为终点 a为中间点 a.y = t * t * (v1.transform.position.y - 2 * a0.transform.position.y + v0.transform.position.y) + v0.transform.position.y + 2 * t * (a0.transform.position.y - v0.transform.position.y); a.z = t * t * (v1.transform.position.z - 2 * a0.transform.position.z + v0.transform.position.z) + v0.transform.position.z + 2 * t * (a0.transform.position.z - v0.transform.position.z); return a; } }
unity3d项目资源可以点击 这里 下载
相关文章推荐
- 二级域名原理以及程序
- 3D设计 Adobe Acrobat 3D 8.1.0 英文版 下载
- C#实现绘制面形图表的方法详解
- C# 绘制统计图大全(柱状图, 折线图, 扇形图)
- C#绘制椭圆的方法
- CSS3 3D 技术手把手教你玩转
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- TCP三次握手及原理
- jQuery中的pushStack实现原理和应用实例
- sqlserver索引的原理及索引建立的注意事项小结
- C#绘制曲线图的方法
- php中的ini配置原理详解
- jquery原理以及学习技巧介绍
- PHP strtotime函数用法、实现原理和源码分析
- C#绘制中国国旗的方法
- C#画笔Pen绘制光滑模式曲线的方法
- Base64编码解码原理及C#编程实例
- IsPostBack原理的介绍
- ASP.NET中制作各种3D图表的方法
- mvvm双向绑定机制的原理和实现代码(推荐)