Unity教程之-Unity3d游戏中自定义贝塞尔曲线编辑器
来源:互联网 发布:windows8如何卸载软件 编辑:程序博客网 时间:2024/05/16 08:48
关于贝塞尔曲线曲线我们再前面的文章提到过《Unity教程之-在Unity3d中使用贝塞尔曲线》,那么本篇文章我们来深入学习下,并自定义实现贝塞尔曲线编辑器,贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。看下效果图!
一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上 。
贝塞尔曲线包含两个控制点即 n = 2 称为线性的贝塞尔曲线
贝塞尔曲线包含三个控制点即 n = 3 称为二次贝塞尔曲线
贝塞尔曲线包含四个控制点即 n = 4,所以称为三次贝塞尔曲线。
贝塞尔曲线返回点的贝塞尔函数,使用线性插值的概念作为基础。所以,让我们了解什么首先是线性插值。
两个点之间的线性插值的点获取那两个点之间,0 <= t <= 1,像 Mathf.Lerp 。
插值点,与 P 公式P0和 P1可以写成,
P = P0+ t (P1 – P0),0 <= t <= 1
在这里,为得到插值的点我们添加 tth指向 P 的分数与这两个之间的距离0.所以,
For T = 0,P = P0.
For T = 1,P = P1.
For T = 0.5,P = P0和 P1间的点.
线性的贝塞尔曲线:
线性的贝塞尔曲线有两个控制点。为给出了两个点 P0和 P1一个线性的贝塞尔曲线是只是这两个点之间的直线。曲线是相当于线性插值给出,
B(t) = P0+ t (P1 – P0) = (1-t) P0 + tP1 ,0 <= t <= 1
线性贝塞尔曲线如何计算出来的是如下所示:
二次贝塞尔曲线:
二次贝塞尔曲线具有三个控制点。二次贝塞尔曲线是点对点的两个线性贝塞尔曲线的线性插值。为给出了三个点 P0、P1和 P2一条二次贝塞尔曲线,其实是两条线性的贝塞尔曲线,线性贝塞尔曲线的 P0和 P1和 线性贝塞尔曲线P1和 P2. 所以,给出二次贝塞尔曲线 :
B(t) = (1-t) BP0P1(t) + t BP1P2(t),0 <= t <= 1
B(t) = (1-t) [(1-t) P0 + tP1] + t [(1-t) P1+ tP2],0 <= t <= 1
通过重新排列上述方程,
B(t) = (1-t)2P0+ 2 (1-t) tP1 + t2P2, 0 <= t <= 1
二次贝塞尔曲线动画计算如下所示:
三次贝塞尔曲线:
三次方贝塞尔曲线具有四个控制点。二次贝塞尔曲线是 点对点的两条二次贝塞尔曲线的线性插值。对于给出的四个点 P0、P1、P2和 P3三次方贝塞尔曲线,是二次贝塞尔曲线P0、P1和 P2和 二次贝塞尔曲线P1、P2和 P3 得到的 线性插值 .所以,给出三次方贝塞尔曲线
B(t) = (1-t) BP0,P1,P2(t) + t BP1,P2,P3(t),0 <= t <= 1
B(t) = (1-t) [(1-t)2P0+ 2 (1-t) tP1 + t2P2] + t [(1-t)2P1+ 2 (1-t) tP2 + t2P3],0 <= t <= 1
通过重新排列上述方程中,
B(t) = (1-t)3P0 + 3(1-t)2tP1+ 3 (1-t) t2P2 + t3P3 0 <= t <= 1
三次贝塞尔曲线计算如下所示:
所以,一般可以作为点对点的线性插值获得从两个相应的贝赛尔曲线的程度 n-1 的两个点定义程度 n 的贝塞尔曲线(就是高级的是两个低一级的线性插值)。
在大多数应用程序使用两种二次或三次方贝塞尔函数。然而,你总可以使用更高程度贝塞尔函数绘制更复杂的曲线,但较高程度贝塞尔函数的计算是比较复杂和增加处理开销。所以,而不是使用更高的学位贝塞尔函数绘制更复杂的曲线,你可以多次使用两种二次或三次方贝塞尔函数。在这里,我创建了一个演示和绘制的∞形曲线,使用三次方贝塞尔函数中循环,如下所示。
若要创建一条曲线,如上所示,请创建场景,如下所示:
现在,将Bezier.cs脚本附加到 Bezier Manager
Bezier.cs:
using
UnityEngine;
using
System.Collections.Generic;
[RequireComponent(typeof(LineRenderer))]
public
class
Bezier : MonoBehaviour
{
public
Transform[] controlPoints;
public
LineRenderer lineRenderer;
private
int
curveCount = 0;
private
int
layerOrder = 0;
private
int
SEGMENT_COUNT = 50;
void
Start()
{
if
(!lineRenderer)
{
lineRenderer = GetComponent<LineRenderer>();
}
lineRenderer.sortingLayerID = layerOrder;
curveCount = (
int
)controlPoints.Length / 3;
}
void
Update()
{
DrawCurve();
}
void
DrawCurve()
{
for
(
int
j = 0; j <curveCount; j++)
{
for
(
int
i = 1; i <= SEGMENT_COUNT; i++)
{
float
t = i / (
float
)SEGMENT_COUNT;
int
nodeIndex = j * 3;
Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints [nodeIndex].position, controlPoints [nodeIndex + 1].position, controlPoints [nodeIndex + 2].position, controlPoints [nodeIndex + 3].position);
lineRenderer.SetVertexCount(((j * SEGMENT_COUNT) + i));
lineRenderer.SetPosition((j * SEGMENT_COUNT) + (i - 1), pixel);
}
}
}
Vector3 CalculateCubicBezierPoint(
float
t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
float
u = 1 - t;
float
tt = t * t;
float
uu = u * u;
float
uuu = uu * u;
float
ttt = tt * t;
Vector3 p = uuu * p0;
p += 3 * uu * t * p1;
p += 3 * u * tt * p2;
p += ttt * p3;
return
p;
}
}
在这里,CalculateCubicBezierPoint 函数是 Cubiz 贝塞尔函数,我已解释了上面执行。DrawCurve 函数绘制两条 三次方贝塞尔曲线。
Between P0, P0- control Point1, P1- control Point1 and P1.
Between P1, P1- control Point1, P0- control Point2 and P0.
任何控制点 可处理其相应的曲线的曲率。你可以在任何时间改变曲线,通过拖动任意控制点,如下所示:
0
好了本篇unity3d教程到此结束,下篇我们再会!
- Unity教程之-Unity3d游戏中自定义贝塞尔曲线编辑器
- Unity游戏中使用贝塞尔曲线
- unity3D游戏开发二之unity编辑器一
- unity3D游戏开发三之unity编辑器二
- unity3D游戏开发二之unity编辑器一
- unity3D游戏开发三之unity编辑器二
- unity3D游戏开发三之unity编辑器二
- unity3D游戏开发二之unity编辑器一
- unity3D游戏开发三之unity编辑器二
- unity游戏引擎基础之编辑器布局自定义(二)
- Unity教程之-Unity3d中图片的灰度处理
- unity3d中使用贝塞尔曲线
- Unity 曲线编辑器说明
- Unity3d——自定义编辑器Editor教程
- Unity中使用贝塞尔曲线
- unity中使用贝塞尔曲线
- [Unity3D]Unity3D游戏开发之在Android视图中嵌入Unity视图
- [Unity3D]Unity3D游戏开发之在Android视图中嵌入Unity视图
- HTML-Day02-1
- java中awt和swing是什么关系
- C Primer Plus5-6
- C Primer Plus5-7
- Gson解析:declares multiple JSON fields named XXX
- Unity教程之-Unity3d游戏中自定义贝塞尔曲线编辑器
- PHP之——CentOS linux下为已经编译好的php环境添加mysqli扩展
- iOS 缩放等级 Set the Zoom Level of an MKMapView
- swift函数式编程(高级)-闭包,协议,扩展,泛型,可空链
- 函数调用过程简单分析
- 我对viewport的理解
- 基于用户投票的排名算法(二):Reddit
- 数据层的多租户浅谈
- Android之MediaPlayer的框架源码分析