插件原理:

绳索的实现是通过一些约束将粒子链接起来而构建的。由于粒子没有方向(只有位置),因此无法模拟扭转效果,并且绳索无法保持其静止形状。但是,可以将绳索撕裂/裂开,并且可以在运行时更改其长度。


一,创建绳索:

蓝图的创建及其参数设置

创建蓝图的两种方式
  • Assets-> Create-> Obi-> RopeBlueprint
  • 右键单击项目文件夹,Create-> Obi-> RopeBlueprint
蓝图参数

unity中柔软的绳子 unity模拟绳子_迭代

  • Thickness(厚度):用于生成绳索的粒子的半径。
  • Resolution(粒子解析度):每长度单位的颗粒密度。值为1会生成粒子,以便它们重叠。值为0.5时将以几乎彼此不接触的方式生成粒子。小于0.5的值将在粒子之间留下间隙,这可能对碰撞检测的不利,但对性能有利。

unity中柔软的绳子 unity模拟绳子_样条曲线_02

  • PooledParticles(合并粒子):分配额外的颗粒以用于撕裂或调整绳索尺寸。如果您不打算在运行时撕裂或调整绳索大小,则可以将此值设置为零,因为除了最初的粒子外,不需要其他粒子。(如需动态更改绳索尺寸,此项参数数值要足够大,否则分配粒子数值不够会不渲染绳索并可能造成unity闪退)

要编辑蓝图,请将其分配给 Obi Rope 组件中的 Blueprint 。然后,单击“Edit path”按钮进入路径编辑模式:

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_03


通过 路径编辑器 (Path editor) 生成绳索

控制点的组成

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_04

路径编辑模式,其中选择了一个控制点(小的白色球体),显示了其厚度控制柄(橙色圆盘)和两个切线控制柄(每边均为正方形)。

  • 蓝图中的粒子沿着一条路径生成,该路径是经过多个控制点的弯曲形状。
  • 在路径编辑器中,可以添加/删除控制点,移动/旋转/缩放现有控制点,以及设置将插入到绳索粒子的每个控制点属性。
  • 有时在编辑路径时使用ObiParticleRenderer组件很有用,以清楚地看到路径如何转换为粒子。

注意:编辑路径时,本质是修改绳索的蓝图。修改将应用于具有相同蓝图的所有绳索/杆。这样可以大大加快工作流程,也可能破坏以前的工作!如果要使用现有的蓝图作为创建新蓝图的基础,请对其进行复制。

路径编辑器的作用

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_05

通过按住“ Shift”一次选择多个控制点,也可以使用“ ctrl”拖动选择框。

开关

作用

unity中柔软的绳子 unity模拟绳子_样条曲线_06

添加控制点工具:绿色的虚线将出现在鼠标光标和样条曲线的最近点之间。单击将在该位置的曲线中插入一个新的控制点。

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_07

删除控制点工具:红色虚线将出现在鼠标光标和样条曲线的最近点之间。单击将删除曲线中最接近的控制点。

unity中柔软的绳子 unity模拟绳子_渲染器_08

打开/关闭路径开关:路径可以是开放的(两端是独立的)或封闭的(曲线遵循封闭的路径,两端共享相同的位置和切线)。

unity中柔软的绳子 unity模拟绳子_样条曲线_09

切换切线控制柄的开/关。

unity中柔软的绳子 unity模拟绳子_渲染器_10

切换厚度手柄的开/关。

控制点切线模式

作用

Aligened

对齐:两个半部将被迫位于控制点的切线处,但是它们的长度可以独立设置。

Mirrored

镜像:在方向和长度上,切线两半部分将被迫相同。

Free

自由:切线的每一半都可以自由移动。这样可以创建尖角或曲率突然变化。

控制点其他属性

作用

Thickness

绳索在该点的粗细。插值到粒子,用于碰撞检测和渲染。

Mass

粒子质量。确定与另一个粒子或刚体发生任何约束(碰撞,距离,弯曲…)时,粒子的行为。

Phase

粒子阶段,用于确定何时应与刚体和其他粒子发生碰撞。

Color

控制点的颜色,插值到粒子。使用 ObiRopeExtrudedRenderer 时,此颜色将传递给网格顶点颜色。

Name

Obi将为每个控制点自动创建一个粒子组,其中包含最接近该控制点的粒子。您可以在此处设置组的名称。


二,绳索渲染

在每帧的末尾,执行了绳索模拟后,将进行渲染。有几种渲染组件可用,它们具有不同的外观和性能特征。他们中的大多数人并不直接使用基于原始粒子的绳索表示。相反,名为ObiPathSmoother的附加组件会生成渲染器将其作为输入的绳索的基于帧的中间表示形式(可选地进行抽取,平滑或扭曲)。

路径平滑器组件 ObiPathSmoother

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_11


Decimation

  • 抽取:基于Ramer-Douglas-Peucker抽取算法,根据其曲率自适应减少绳架数量的阈值。数值设置为0时不进行抽取,更平滑。数值设置越大,越趋近于折线,更加节省效率。

Smoother

  • 平滑处理:抽取后将平滑迭代应用于绳索几何形状。在内部,这使用了Chaikin的切角算法的封闭形式。将平滑设置为0将不会执行任何平滑操作。平滑设置的越高效果越好,越耗费性能。

    Twist
  • 截面扭曲:施加到每个绳索部分的度数扭曲。例如,如果要制作一条链,其中每个链节相对于前一个链节扭曲90º,则此值应为90。

绳索渲染器

路径平滑器组件生成绳索的基于帧的表示后,渲染器使用它来输出可见的几何体。

默认渲染器(后续更新)

通过挤压ObiRopeSection沿构成绳索的粒子生成平滑,连续的网格。不需要手动创建的网格或几何。全部自动生成。

unity中柔软的绳子 unity模拟绳子_样条曲线_12

链条渲染器

在粒子之间的空间中实例化定制的预制件。这导致链条由刚性链节制成。必须提供至少1个预制件才能用作链环。

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_13


(P.S.实际使用过程中可能会出现链条角度不正常问题,我这里的建议是连环模型添加父层级,调整好角度拖成预制。)

动态更改绳索长度

unity中柔软的绳子 unity模拟绳子_unity中柔软的绳子_14

属性

作用

Cursor Mu

光标标准化位置,在此位置进行添加/删除粒子。0将其放置在绳索的开头,1将其放置在绳索的末尾。介于两者之间的任何值都会将其放置在最接近该值的粒子中。

Source Mu

起始点:添加新粒子时从最接近该值中的粒子复制粒子的标准化位置。0将其放置在绳索的开头,1将其放置在绳索的末尾。介于两者之间的任何值都会将其放置在最接近该值的粒子中。

Direction

方向:布尔值,控制光标的方向。启用它会使光标指向绳索的末端。禁用它会使它指向开始。

使用ObiRopeCursor增加绳索的长度将使用绳索的粒子池中的粒子。确保池(蓝图中的PooledParticles值)足够大,以达到所需的最大长度。当减小绳索的长度时,未使用的颗粒将返回到池中。

动态更改长度关键代码:

ObiRope rope;
 ObiRopeCursor cursor;
 float speed=1;
 void Start()
    {
        cursor = GetComponent<ObiRopeCursor>();
        rope = GetComponent<ObiRope>();
    }
    
 void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.Alpha9))
        {
        //关键代码
           cursor.ChangeLength(rope.restLength + speed* Time.deltaTime);
        }
    }

三,绳索效果

上述两点说得是,如何创建并渲染一条绳子,但此时的绳子可能存在弹力比较大,质量比较重,摩擦力不够等等问题,以至于并不能满足你的项目需要。文章开头我们说,这个插件实现绳索的原理是通过一些约束将粒子链接起来而构建的。所以想要这条绳子达到一个你满意的效果,我们可以去调节ObiSolver(解算器)中的约束参数。

unity中柔软的绳子 unity模拟绳子_迭代_15


博主在实际项目中绳索常需要调节的是

  • Gravity.y (重力)
  • Damping(阻尼)
  • SleepThreshold(停止模拟计算,数值越大停的越快)
  • 以及最重要的Constraints(约束)

约束子步骤特点:可以禁用不必要的约束子步骤来减少计算。

约束子步骤

作用

Distance

距离,Iterations(迭代)数值越大,绳子弹力越小

Bending

弯曲

Particle Collision

粒子间碰撞

Particle Friction

粒子间摩擦

Collision

与外界碰撞

Friction

与外界摩擦

Skin

皮肤

Volume

体积

Shape Matching

形状匹配

Tether

栓绳

Pin

固定

Stitch

缝合*

Density

密度

Stretch Shear

撕裂

Bend Twist

弯曲旋转

Chain

链条

Obi系列插件(绳子、布料、流体、柔体、弹簧)都用这个结算器。所以实际项目中不是所有子步骤都会用到,禁用不需要的子步骤可以减少计算提升效率,但需要的必须要勾选。(P.S. 博主就因为没勾选Stitch缝合子步骤,导致绳子连接问题研究方向跑偏了浪费了两周.)