基于Unity的N阶贝塞尔曲线绘制三维物体运动轨迹

2020-11-30 09:02李澔民陆向艳
软件 2020年9期

李澔民 陆向艳

摘  要: 为实现在Unity引擎中使用任意阶贝塞尔曲线绘制三维物体的轨迹,本文提出了一种灵活绘制N阶贝塞尔曲线的方法。该方法设计了一种可以降阶的插值计算函数来实现自定义控制点数的N阶贝塞尔曲线。对比实验结果表明该方法有效且简化了三维物体的运动轨迹的参数定义,为应用贝塞尔曲线来控制三维物体的运动轨迹提供了方法参考。

关键词: Unity;N阶贝塞尔曲线;三维物体;运动轨迹

中图分类号: TP391.7    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2020.09.001

本文著录格式:李澔民,陆向艳. 基于Unity的N阶贝塞尔曲线绘制三维物体运动轨迹[J]. 软件,2020,41(09):0104

【Abstract】: In order to use the Bessel curve of arbitrary order in the Unity engine to draw the trajectory of 3d objects, this paper presents,  a flexible method for drawing N-order Bessel curve. This method designs an interpolation calculation function which can reduce the order of Bessel curve and support the custom amounts selection of control point of N-order Bessel curve. The comparative experimental results show that this method is effective and simplifies the parameter definition of motion trajectory of 3d objects. This paper provides a method for controlling the motion trajectory of 3d objects with Bessel curve.

【Key words】: Unity; N-order Bessel curve; Three-dimensional objects; Motion trajectory

0  引言

Unity3D引擎是大多数虚拟现实项目选择的开发工具[1],应用Unity实现物体运动轨迹绘制,会受到诸多的外界干扰因素。为避免干扰,可以在Unity中使用贝塞尔曲线提前计算出路径,再使用适当的运动方法沿路径进行移动,使得到的路径固定且运动轨迹稳定。已有相当多的研究将贝塞尔曲线应用于Unity3D引擎,例如用来对三维物体进行弯曲[2],控制足球射门运动曲线等。贝塞尔曲线也在很多二维绘图软件(如微软绘图软件、PhotoShop等)中得到应用。使用物理公式的方法绘制物体运动轨迹往往参数较多,后期调整轨迹需要繁杂的计算和验证,而贝塞尔曲线则只需调节中间控制点就可以快速调整整条轨迹路线。然而,将贝塞尔曲线应用于Unity3D环境需要进行算法设计和编程才能使其应用于三维坐标,最终实现对三维物体运动的控制。为此,本文提出一种绘制N阶贝塞尔曲线的方法,该方法可以自定义控制点的数量,绘制出复杂的物体运动轨迹。

1  贝塞尔曲线

贝塞尔曲线,也称为贝兹曲线或贝济埃曲线,是在制作二维图形的应用程序中广泛应用的数学曲线。1962年,贝塞尔曲线由法国工程师Pierre Bezier对伯恩斯坦多项式进行扩展用于汽车工业辅助设计而产生,之后推广而得到广泛应用。贝塞尔曲线的优点是绘制曲线简便易行,只需要定义曲线的起始点、终止点以及两个相互分离的中间点(控制点)即可完成。用贝塞尔曲线绘制复杂曲线可以先分段定义多段曲线,然后再将这些曲线段连接起来形成所需要的曲  线或曲面图形[3]。贝塞尔曲线的简单性特点,使很多  图形工作者选择用它来绘制形状较为复杂的图形或模型[4-15]。贝塞尔曲线的数学表达如下:

2  方法描述

在实际应用中,绘制三维物体平滑运动轨迹,主要是应用贝塞尔曲线2阶公式或贝塞尔曲线3阶公式。本文的问题是拟在Unity3D环境下,用GetBezierList函数实现应用贝塞尔曲线绘制三维物体平滑运动轨迹。解决问题的核心思想是应用GetBezierList函数来绘制任意中间控制点(N取2或3均可)的三维贝塞尔曲线轨迹。解决方法是首先分析二阶和三阶贝塞尔的插值点关系,导出GetBezierList函数实现贝塞尔曲线的N阶公式的插值的计算函数;然后设计Unity中的实现贝塞尔曲线N阶公式插值的计算函数代码;最后用刚体Rigidbody组件和本文设计的贝塞尔曲线N阶公式法进行物体运动轨迹实现的效果和参数复杂度对比。

3  方法设计与实现

3.1  函数设计

本文通过GetBezierList函数获得贝塞尔曲线的线段点列表,其参数为:GetBezierList(List PiList, float pointsNum);PiList代表包括起点和终点的所有控制点,pointsNum代表通过多少个点来描述贝塞尔曲线,这些采样点根据式(1)中的参数t平均分布在贝塞尔曲线的路径上。

式(25)中,j代表{Pi}控制點集降了多少次维,由于每降一次维,控制点数量就减少一个,故i的取值范围是(0,n–j)。当降了n次维以后,最后得到B(t)点的位置。

3.2  方法实现

///

/// 获取N阶贝塞尔曲线

///

/// 包括起点和终点在内的所有控制点

/// 描述贝塞尔曲线的点数量

///

public static List GetBezierList(List PiList, float num)

{

List beizerPath = new List();

for (int i = 1; i <= num; i++)

{

float t = i / num;

Vector3 pixel = GetBeizerPoint(PiList, t);

beizerPath.Add(pixel);

}

return beizerPath;

}

//根据PiList各点插值递归得到贝塞尔曲线B(t)值

public static Vector3 GetBeizerPoint( List PiList, float t)

{

if (PiList.Count <= 1)

return PiList[0];

List newPiList = new List();

for (int i = 0; i < PiList.Count - 1; i++)

{

Vector3 pp = (1 - t) * PiList[i] + t * PiList[i + 1];

newPiList.Add(pp);

}

return GetBeizerPoint(newPiList, t);

}

4  实验与对比分析

绘制运动轨迹我们使用unity的LineRenderer组件,LineRenderer线渲染器组件主要是用于在3D中渲染线段,使用LineRenderer我们可以对绘制线段进行很多操作,例如设置颜色、宽度等。本文中我们在一款乒乓球游戏中利用生成N阶贝塞尔曲线的方法绘制乒乓球运球的一条预判轨迹,来展示本文提出的方法是如何在实际项目中应用的。

LineRenderer组件可以定義一段由多个采集点构成的曲线,然后在相邻两个采集点之间渲染出一条直线,只要绘制的时候生成的采集点足够多就能绘制出相对来说更平滑的曲线。所以我们将GetBezierList方法生成出来的描述曲线的点坐标组代入LineRenderer组件中去。

4.1  使用Rigidbody控制物体运动实验

控制unity3D里面物体的物理运动一般使用刚体Rigidbody组件来控制,赋有刚体属性的对象可以施加力,并且可以设置物体的质量,初速度等物理运动初始属性。我们控制一个乒乓球在乒乓球桌上进行一次运球运动,并设置乒乓球的两段运动属性如表1所示。第一段运动为乒乓球从被击出后到接触到乒乓球桌上的运动,第二段运动为乒乓球从桌上弹起后到落地的运动,设置好上表1中的属性后绘制出的运动轨迹如图3所示。

4.2  使用贝塞尔曲线控制物体运动实验

由于乒乓球在运球的过程中会与桌面发生一次碰撞交互形成第二段运动,所以需要绘制两条贝塞尔曲线来描述乒乓球的整个运球路线,第二条贝塞尔曲线的起点即为第一条曲线的终点,调节控制点的属性属性如表2所示。

在图3的基础上生成贝塞尔曲线,其曲线用红色线条绘制,可以对比使用刚体形成的运动轨迹曲线,如图4所示。

4.3  实验结果分析

(1)通过图4的对比可以看到使用贝塞尔曲线生成的运动轨迹和使用刚体的物理学控制形成的运动轨迹几乎重合,可以看出贝塞尔曲线已经可以绘制三维物体,模拟真实的物理运动。

(2)从表1和表2的对比来看,使用刚体中的物理属性控制物体运动时,需要同时考虑到重力加速度、物体质量、物体初速度、物体初速度向量等比较多的系数,这样使得后期调整物体运动轨迹的时候调试步骤繁杂,调试成本高。而使用贝塞尔曲线控制物体的运动轨迹时,只需要考虑控制对应线段的控制点,即可方便快捷的修改运动曲线,后期维护成本较低。

(3)对于物体做一些比较特殊的运动,或者是不受重力和其他物理因素影响的运动这些情况,使用贝塞尔曲线来生成和配置物体的运动路径相当简单高效。

5  结束语

使用物理公式的方法绘制物体运动轨迹往往参数较多,后期想要调整轨迹需要繁杂的计算和验证,而使用贝塞尔曲线则只需调节少量的中间控制点就可以快速调整条轨迹路线。在Unity中使用贝塞尔曲线可以提前计算出路径,进而使用适当的运动方法沿路径进行移动,绘制的路径固定且运动轨迹稳定。本文提出一种基于Unity的灵活绘制N阶贝塞尔曲线的方法来控制三维物体的运动轨迹。该方法设计了一种可以降阶的插值计算函数来实现自定义控制点数的N阶贝塞尔曲线。对比实验结果表明该方法有效且简化了三维物体的运动轨迹的参数定义,为应用贝塞尔曲线来控制三维物体的运动轨迹提供了方法参考。

参考文献

[1]唐实, 任淑霞, 王佳欣, 等. 基于虚拟VR技术的心脏医疗辅助系统的设计与应用[J]. 软件, 2018, 39(6): 23-25.

[2]吴晓亮, 黄襄念. Unity中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机(专业版), 2016(07): 57-59.

[3]胡学峰, 朱家明, 刘雅倩等. 基于贝赛尔曲线位图矢量化方法的研究[J]. 西昌学院学报(自然科学版), 2015, 29(02): 72-75.

[4]张祖媛. 贝塞尔曲线的几何构型[J]. 四川工业学院学报, 1998(04): 33-36+45.

[5]张少林, 景奉水, 王硕. 基于球面贝塞尔的姿态过渡与插补方法[J]. 华中科技大学学报(自然科学版), 2017, 45(10): 75-79.

[6]张金炜, 王文扬, 郭蓬等. 基于蚁群四次贝塞尔曲線的无人车路径规划[J]. 现代电子技术, 2019, 42(13): 113-116.

[7]牛岩军, 王进杰, 曹国华等. 基于高阶贝塞尔曲线的提升机钢丝绳层间过渡平稳性研究[J]. 矿山械, 2015, 43(12): 53-58.

[8]张文静, 加云岗, 王伟. 基于Bezier曲线的移动模型研究[J]. 计算机应用研究, 2015, 32(06): 1830-1834.

[9]韩浩, 王舜燕. 基于混合贝塞尔曲线模型的车道检测算法[J]. 计算机工程与计, 2018, 39(03): 732-737.

[10]张志毅, 杨溪. A级贝塞尔曲线的交互式控制生成方法[J]. 计算机应用与件, 2014, 31(02): 103-105+194.

[11]徐梁, 高宏力, 宋兴国. 贝塞尔曲线融合ACO的移动机器人路径规划[J]. 机械设计与造, 2020(01): 263-266.

[12]刘成志, 李军成, 杨炼. 基于三次Bézier 曲线逼近的边缘亚像素定位方法[J]. 软件, 2015, 36(7): 31-35.

[13]何洪亮, 赵珂, 王子群, 等. 基于层次分析与多元曲线拟合法的众包任务定价模型研究[J]. 软件, 2018, 39(10): 139-144.

[14]谭振, 李军成. 一种平面正则 C-Bézier 曲线的广义偏距曲线构造方法[J]. 软件, 2018, 39(11): 07-10.

[15]卢超, 黄蔚, 胡国超. 基于图形数据结构的复杂对象建模设计[J]. 软件, 2015, 36(12): 220-223.