Unity3D学习日记(三)贝塞尔曲线
2016-04-20 11:44
681 查看
这里有很多小伙伴可能不知道啥事贝塞尔曲线是啥玩意,如果你用过PS的钢笔功能就知道这是啥,如果还是不知道这是啥那么说一个游戏你就知道了“愤怒的小鸟”这个游戏用到弹弓效果可以用这个贝塞尔曲线来实现。还不知道的话拿自己去百度谷歌,这个是游戏很常用到的一个画曲线的函数方式。
那么我们要实现贝塞尔曲线函数要怎么弄了,别把贝塞尔曲线想的太难,其实如果你懂得怎么贝塞尔曲线的公式怎么写,那么这个其实将数学公式转化成代码语言就行了。那么我们先去看看贝塞尔曲线公式有哪些,下图是百度百科对贝塞尔曲线的介绍并且其中还包括公式,有兴趣的娃可以去百科看看这些介绍,地址如下:点击打开链接
从上图我们可以看出大体上用法有3种,如果看不懂这些不要紧,这里我们把P1,P2等可以看作参数,t可以看作一个0-1的参数这样将其化作简单代码语言来看待,那么我们可以根据参数多少大体知道有3个不同的参数的函数。接下来我们继续往下把贝塞尔曲线函数实现出来,这里写成了静态函数方便调用,因为很简单所以就直接上代码了,如果连将数学公式转化为简单的代码语言都不会,怎么你可要慎重考虑是否适合做这行了,代码如下:
这里要感谢Momo大神,界面大部分代码都是用Momo写个那个案例,原文地址:点击打开链接
最后的效果如图显示:
那么我们要实现贝塞尔曲线函数要怎么弄了,别把贝塞尔曲线想的太难,其实如果你懂得怎么贝塞尔曲线的公式怎么写,那么这个其实将数学公式转化成代码语言就行了。那么我们先去看看贝塞尔曲线公式有哪些,下图是百度百科对贝塞尔曲线的介绍并且其中还包括公式,有兴趣的娃可以去百科看看这些介绍,地址如下:点击打开链接
从上图我们可以看出大体上用法有3种,如果看不懂这些不要紧,这里我们把P1,P2等可以看作参数,t可以看作一个0-1的参数这样将其化作简单代码语言来看待,那么我们可以根据参数多少大体知道有3个不同的参数的函数。接下来我们继续往下把贝塞尔曲线函数实现出来,这里写成了静态函数方便调用,因为很简单所以就直接上代码了,如果连将数学公式转化为简单的代码语言都不会,怎么你可要慎重考虑是否适合做这行了,代码如下:
using UnityEngine; [System.Serializable] public class Bezier : System.Object { /// <summary> /// 线性贝赛尔曲线 /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="t"> 0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t); B = t1*P0 + P1*t; //B.y = t1*P0.y + P1.y*t; //B.z = t1*P0.z + P1.z*t; return B; } /// <summary> /// /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="P2"></param> /// <param name="t">0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t)*(1 - t); float t2 = t*(1 - t); float t3 = t*t; B = P0*t1 + 2*t2*P1 + t3*P2; //B.y = P0.y*t1 + 2*t2*P1.y + t3*P2.y; //B.z = P0.z*t1 + 2*t2*P1.z + t3*P2.z; return B; } /// <summary> /// /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="P2"></param> /// <param name="P3"></param> /// <param name="t">0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, Vector3 P3, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t)*(1 - t)*(1 - t); float t2 = (1 - t)*(1 - t)*t; float t3 = t*t*(1 - t); float t4 = t*t*t; B = P0*t1 + 3*t2*P1 + 3*t3*P2 + P3*t4; //B.y = P0.y*t1 + 3*t2*P1.y + 3*t3*P2.y + P3.y*t4; //B.z = P0.z*t1 + 3*t2*P1.z + 3*t3*P2.z + P3.z*t4; return B; } }一般公式是教你怎么使用公式,这里我们可以忽略掉的。这里要注意的是,我们是通过t来绘制到曲线的每一个点位置,但是要记得t是一个0到1值,所以可以利用for循环来绘制所需要的点,大体用法就如图所示:
这里要感谢Momo大神,界面大部分代码都是用Momo写个那个案例,原文地址:点击打开链接
最后的效果如图显示:
相关文章推荐
- Unity之2d对象跟随鼠标旋转
- unity 获取当前键盘按键
- 【NGUI】Unity中使用NGUI和FingerGestures插件点击UI穿透的问题
- 浅谈RenderTexture的shadowmap格式
- unity各种路径
- unity3d c# 之事件
- Unity3d 实现顶点动画
- Unity3d 实现顶点动画
- Unity中将图片改为支持透明背景模式
- 小译UnityAPI-Mathf.Lerp
- unityc#脚本中实现socket服务器的构建
- 关于unity的CGIncludes的一些小问题
- Unity3D对安卓盒子的支持
- Android与Unity交互研究
- Unity模拟QQ截图以及全屏截图
- Unity内存优化(-)托管堆ManagedHeap的优化
- 关于unity打开非自己原创工程时出现命名空间不存在等错误问题
- 详解Unity Profiler内存分析问题
- Unity3D安卓导出包加密学习----编译mono
- Unity3D Terrain Settings 彻底搞懂 地形详细设置 全实验与解析 (三)Thickness