Unity3d遊戲中自定義貝塞爾曲線編輯器[轉]

關於貝塞爾曲線曲線咱們再前面的文章提到過《Unity 教程之-在Unity3d中使用貝塞爾曲線》,那麼本篇文章咱們來深刻學習下,並自定義實現貝塞爾曲線編輯器,貝塞爾曲線是最基本的曲線,通常用在計算機 圖形學和 圖像處理。貝塞爾曲線能夠用來建立平滑的曲線的道路、 彎曲的路徑就像 祖瑪遊戲、 彎曲型的河流等。看下效果圖 !node

一條貝塞爾曲線是由一組定義的控制點 P0到 Pn,在 n 調用它的順序 (n = 1 爲線性,2 爲二次,等.)。第一個和最後一個控制點老是具備終結點的曲線;然而,中間兩個控制點 (若是有的話) 通常不會位於曲線上 。編輯器

貝塞爾曲線包含兩個控制點即 n = 2 稱爲線性的貝塞爾曲線函數

貝塞爾曲線包含三個控制點即 n = 3 稱爲二次貝塞爾曲線學習

貝塞爾曲線包含四個控制點即 n = 4,因此稱爲三次貝塞爾曲線。動畫

貝塞爾曲線返回點的貝塞爾函數,使用線性插值的概念做爲基礎。因此,讓咱們瞭解什麼首先是線性插值。ui

兩個點之間的線性插值的點獲取那兩個點之間,0 <= t <= 1,像 Mathf.Lerp 。spa

插值點,與 P 公式P0和 P1能夠寫成,.net

P = P0+ t (P1 – P0),0 <= t <= 13d

在這裏,爲獲得插值的點咱們添加 tth指向 P 的分數與這兩個之間的距離0.因此,orm

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、P一、P2和 P3三次方貝塞爾曲線,是二次貝塞爾曲線P0、P1和 P2和 二次貝塞爾曲線P一、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.sortingLayerID = layerOrder;

curveCount = (int)controlPoints.Length / 3;

}

void Update()

{

DrawCurve();

}

void DrawCurve()

{

for (int j = 0; 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

原文:http://www.xici.net/d224478514.htm

相關文章
相關標籤/搜索