Unity中使用贝塞尔曲线对三维物体弯曲
三维物体在三维制作软件中进行弯曲.是很常见的。但是当导出模型到游戏引擎后就无法再改变形状.而现在一些虚拟现实的软件中.经常需要对三维物体进行实时的弯曲.如管道等。要想在游戏引擎中对三维物体进行变形。就只有通过算法编程进行实现。而管道等这些长条型物体.可以看成一条粗的线.只不过这条线主要靠的是网格.而形成网格的基础就是网格点,通过使用贝塞尔曲线控制网格点.就可以控制三维物体的形状,达到弯曲变形的目的。
贝塞尔曲线
贝塞尔曲线是一种应用于二维图形应用程序的数学曲线。贝塞尔曲线由线段与节点组成。节点是可拖动的支点,线段像可伸缩的皮筋。通过拖动节点,可以改变线段的弯曲程度和弯曲方向 贝塞尔曲线有线性公式、二次方公式、三次方公式和一般参数公式,分别对应两个节点、三个节点、四个节点和任意节点的贝塞尔曲线。由于这里只会用到四个节点.所以只叙述三次方公式。
贝塞尔曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。
如下图,定义四个顶点P0、Pl、P2、P3,曲线从P0走向P3,并不会经P1、P2两点。这两个点只是在那里提供方向信息。P0和P1之间的间距,决定了曲线在趋进P3之前,走向P2方向的长度有多长。
贝塞尔曲线公式:
上述公式中.参数t可看做是线段百分比所在的位置.如下图所示:
弯曲的实现
三维物体的形成,主要靠的就是网格.而网格的形成则需要网格顶点。在建模的时候,都会看见模型上有着
密密麻麻的网格,在网格的边相交的地方就是网格顶点.通过改变这些网格顶点的位置,相应的网格就会
发生形状变化,从而让模型的形状发生改变。
再unity中,模型导入之后就会固定,达不到弯曲变形的效果,要想在unity中对模型实时操作变形,就必须用算法来实现。
Unity中的网格信息是通过GameObject的MeshFilter组件中的mesh属性获取的。想要对网格进行操作,就必须为物体添加MeshFilter组件。而MeshFilter组件中的mesh属性包含了法线、UV坐标、三角形、vertices顶点数组属性,三角形属性通过顶点数组间接保存。每个三角形都是三个点为一组,前三个元素定义第一个三角形,后三个元素定义第二个三角形,以此类推。
要对三维物体变形,只需要获取顶点数组,将每个顶点的位置通过贝塞尔算法进行计算,重新定位即可,算法步骤如下:
(1)将三维物体导入unity并为其条件MeshFilter组件,通过组件获取mesh属性,再通过mesh获取网格顶点vertices属性。
(2)为物体创造一条贝塞尔曲线。在三维物体的两端加入两个子物体,对应好位置,通过unity提供的InverseTransformPoint函数将两个子物体的坐标转化为三维物体的本地坐标点,并将此两点作为三阶贝塞尔曲线的两个端点。再在此两点之间任意取两个点作为贝塞尔曲线的锚点,有了这四个点就可以根据贝塞尔曲线公式计算出一条适用于三维物体的曲线。
(3)将获取到的mesh属性的vertices数组取出,根据自己的物体要弯曲的轴向,选择相应的x、y、z轴,并找出相对应的轴的最大值和最小值,相减获得物体的总长,再将每个点对应的值和最小值相减并处以总长,得到每一个网格顶点在物体中的百分比。
(4)将百分比值传递给贝塞尔曲线,计算出贝塞尔曲线对应的百分比所在点,并计算出百分比对应的前一个点和后一个点
(5)通过叉乘计算出这个百分比再贝塞尔曲线上的切线方向和垂直方向的偏移量。
(6)将此切线偏移量和垂直偏移量和三维物体的vertices属性中对应的百分比的点相加,得到新的网格顶点。 (7)重复上述3到6的步骤,计算出每个网格顶点的值。如此得到一个新的网格顶点数组,将此数组赋给vertices,得到新的vertices顶点属性,就改变了三维物体的网格顶点,使物体发生变形。
相关推荐: