孙广东   2015.8.15

比方在3D rpg游戏中。我们想设置弹道,不同的轨迹类型!

目的:这篇文章的主要目的是要给你关于在游戏怎样使用贝塞尔曲线的基本想法。

贝塞尔曲线是最主要的曲线,一般用在计算机 图形学和 图像处理。

贝塞尔曲线能够用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。

一条贝塞尔曲线是由一组定义的控制点 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

二次贝塞尔曲线动画计算例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

三次贝塞尔曲线:

三次方贝塞尔曲线具有四个控制点。

二次贝塞尔曲线是  点对点的两条二次贝塞尔曲线的线性插值。对于给出的四个点 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

三次贝塞尔曲线计算例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

所以。一般能够作为点对点的线性插值获得从两个对应的贝赛尔曲线的程度 n-1 的两个点定义程度 n 的贝塞尔曲线(就是高级的是两个低一级的线性插值)。

在大多数应用程序使用两种二次或三次方贝塞尔函数。

然而,你总能够使用更高程度贝塞尔函数绘制更复杂的曲线,但较高程度贝塞尔函数的计算是比較复杂和添加处理开销。

所以。而不是使用更高的学位贝塞尔函数绘制更复杂的曲线,你能够多次使用两种二次或三次方贝塞尔函数。在这里。我创建了一个演示和绘制的∞形曲线,使用三次方贝塞尔函数中循环。例如以下所看到的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

若要创建一条曲线。如上所看到的。请创建场景,例如以下所看到的:

如今,将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.

不论什么控制点  可处理其对应的曲线的曲率。你能够在不论什么时间改变曲线,通过拖动随意控制点,例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

最新文章

  1. php7 安装redis扩展
  2. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]
  3. iptables基本规则
  4. Office 365 - Windows PowerShell for SharePoint Online
  5. 启动一个新的activity并携带数据,返回数据给上一个activity
  6. 关于doctype
  7. 移动互联与O2O的完美衔接
  8. 编程内功修炼之数据结构—BTree(二)实现BTree插入、查询、删除操作
  9. python binary lib on win/各种python库的二进制包
  10. OSGI学习总结
  11. js中各个类型的转换总结
  12. python制作爬虫爬取京东商品评论教程
  13. mac ox下android 通过battery-historian进行电量分析
  14. cadence元件放置方法
  15. poj3162(树形dp+优先队列)
  16. 初学mybatis和mysql碰到的问题
  17. 转:VIM选择文本块/复制/粘贴
  18. ActiveMQ入门案例-生产者代码实现
  19. 如何解决无法成功git commit 和git push
  20. 移动端自适应布局 rem方案

热门文章

  1. 4. ZooKeeper 基本操作
  2. 用JavaScript实现表格编辑器
  3. SQL Server 初识游标
  4. Python 日志处理(二) 使用正则表达式处理Nginx 日志
  5. RSA非对称加密简析-java
  6. asp.net core 实现一个简单的仓储
  7. Thymleaf——工作笔记本
  8. Entity Framework——建模建库
  9. 关于控制台输出 警告 log4j:WARN No appenders could be found for logger
  10. 拓扑排序&amp;关键路径