当前位置:   article > 正文

【Unity】Obi插件系列(六)——Obi Rope

obi rope

Rope/rod blueprints

  • Rope: Ropes是通过使用距离和弯曲约束将粒子链起来建立的。由于常规粒子没有方向性(只有位置),因此无法模拟扭转效应,而且绳索无法保持其静止形状。然而,与Rod不同,绳索可以被撕裂/分裂,并且其长度可以在运行时改变。

  • Rods: Rods是通过使用拉伸/剪切和弯曲/扭转约束将定向粒子链起来建立的。它们比Ropes复杂得多,可以模拟扭转影响,并保持其静止形状。然而,它们的长度在运行时不能改变,也不能被撕裂/分割。Rods是模拟弹簧、粗棒、天线等的理想选择。
    在这里插入图片描述

  • Rods(蓝色)和Rope(红色),两者的静止形状相同。杆子能够保持它的静止形状,绳子不能。

  • 与Rope不同的是,Rods不能被撕裂或调整尺寸。这里总结了Rope和Rods的主要区别。
    特征 | ObiRope | ObiRod
    保持静止形状 | N | Y
    扭转阻力 | N | Y
    可调整尺寸 | Y | Y
    可撕裂 | Y | Y

  • 要生成一个基本的绳索/杆状蓝图,请到Assets->Create->Obi->Rope/Rod blueprint,或者右键单击项目文件夹,选择 Create->Obi->Rope/Rod blueprint。绳索和杆状物蓝图有以下参数。

    1. Thickness:用于生成绳/棒的颗粒半径。
    2. Resolution:每个长度单位的粒子密度。值为1将产生颗粒,使它们重叠。0.5的值将生成颗粒,使它们几乎不接触对方。低于0.5的值将在粒子之间留下空隙,这可能不利于碰撞检测的稳健性,但对性能有利。
    3. Pooled particles:(Ropes only).撕开或调整绳索大小时分配给你的额外粒子。如果你不打算在运行时撕开或调整绳索的大小,你可以将这个值设置为零,因为除了初始粒子外,不需要额外的粒子。
    4. Keep initial shape:(Rods only).如果你想让杆子保持它的初始形状作为它的静止形状,请启用它。禁用此功能会使杆的静止形状完全为直线
  • 在较低分辨率的绳索中,可以看到弯曲和距离的约束是微弱的紫色和绿色线条。
  • Resolution: 1在这里插入图片描述
  • Resolution: 0.5在这里插入图片描述
  • Resolution: 0.1在这里插入图片描述
  • 要编辑绳索或杆件蓝图,请将其分配到绳索或杆件演员的蓝图槽中。然后,点击编辑路径按钮,进入路径编辑模式。在这里插入图片描述
  • Path editor
  • 路径编辑模式,选择一个控制点(白色小球),显示其厚度手柄(橙色圆盘)和两个切线手柄(两边正方形)。在这里插入图片描述
  • 形成的绳索,使用挤出渲染器
    在这里插入图片描述
  • 绳/棒蓝图中的粒子是沿着路径生成的,路径是经过几个控制点的曲线形状。在路径编辑器中,可以添加/删除控制点,移动/旋转/缩放现有的控制点,并设置每个控制点的属性,这些属性将被插值到绳索粒子上。在编辑路径时,将有即时的反馈,了解最终的绳索/杆子的样子。有时,在编辑路径时使用ObiParticleRenderer组件是很有用的,可以清楚地看到路径是如何转化为粒子的。
  • 当编辑路径时,将修改绳索的蓝图。修改将被应用到所有共享同一蓝图的绳索/绳索上。这可以大大加快工作流程,但如果不小心的话,也会破坏之前的工作! 如果你想使用一个现有的蓝图作为基础来创建一个新的蓝图,请务必复制。
  • Add control points tool在这里插入图片描述
    此选项使工具能够将控制点可视化地添加到样条上。鼠标光标和样条中最近的点之间会出现一条绿色的虚线。点击将在该位置的曲线上插入一个新的控制点。
  • Remove control points tool在这里插入图片描述
    此选项使工具能够从样条中移除控制点。鼠标指针和样条中最近的点之间会出现一条红色虚线。点击将删除曲线中最近的控制点。
  • Open/close path在这里插入图片描述
    路径可以是开放的(两端独立),也可以是封闭的(曲线遵循封闭的路径,两端共享同一位置和切线)。
  • Orientation tool (rods only)在这里插入图片描述
    这个工具可以让你定义每个控制点的方向。这可以让你指定Rod的静止扭转。
  • 拨动切线手柄在这里插入图片描述
    拨动切线手柄的开/关。
  • Toggle thickness handles在这里插入图片描述
    打开/关闭厚度手柄。
  • Editing control points
    • 你可以通过按住 "shift "一次选择多个控制点,或者你可以使用 "ctrl "拖动一个选择框。平移、旋转和缩放小工具的工作方式与普通GameObjects的工作方式相同,枢轴和变换空间的切换也是如此。
    • 每个切线手柄有三种操作模式,每个手柄可以设置。自由,对齐,或镜像。
      1. Free 每一半的手柄都可以自由地独立移动。这允许创建尖锐的角落或突然变化的曲率。
      2. Aligned 两个半边将被迫位于控制点的切线上,但它们的长度可以独立设置。
      3. Mirrored 两半将被强制要求在方向和长度上都相同。
    • 除了切线模式,每个控制点都有几个属性,这些属性会被传递给粒子(通过插值)。
      1. Thickness 该点的绳索厚度。内插到粒子上,用于碰撞检测和渲染。
      2. Mass 粒子的质量:决定了粒子在受到任何约束(碰撞、距离、弯曲…)时的表现。决定了当粒子与另一个粒子或刚体发生任何约束(碰撞、距离、弯曲…)时,粒子的行为。
      3. Phase 粒子相位,用于确定何时应忽略与刚体和其他粒子的碰撞。深入的解释,见碰撞。
      4. Color 控制点的颜色,插值到粒子上。当使用ObiRopeExtrudedRenderer时,这个颜色会被传递给网格顶点颜色。
      5. Name Obi将为每个控制点自动创建一个粒子组,包含最接近该控制点的粒子。你可以在这里设置组的名称。

Obi Rope Rendering Modes

  • 在每一帧结束时,在进行了绳索模拟后,会进行渲染。有几种渲染组件可供选择,有不同的外观和性能特点。它们中的大多数并不直接使用基于原始粒子的绳索表示。取而代之的是一个名为ObiPathSmoother的附加组件,它生成了一个基于帧的绳索中间表示法(可选择减去、平滑或扭曲),渲染器将其作为输入。
  • 你永远不需要手动添加ObiPathSmoother组件,所有需要的渲染器都会自己添加。
  • ObiPathSmoother
    • Decimation
      • 阈值用于根据其曲率自适应地减少绳架的数量。在内部,它使用了Ramer-Douglas-Peucker减法算法的迭代变体。将decimation设置为零不会进行任何减少。较高的值会从绳索的直线部分移除帧,使渲染更廉价。
      • 下面的图片展示了在线框模式下使用ObiRopeExtrudedRenderer渲染的一根绳子,可以清楚地看到减影的效果。
      • Decimation:0 绳索具有均匀致密的几何形状,无论曲率如何。在这里插入图片描述
      • Decimation:0.15. 注意,绳索的直线部分的几何形状较少。
    • Smoothing
      • 平滑迭代应用于绳索几何体的去角化后。在内部,它使用Chaikin切角算法的闭式变体。将平滑值设置为0将不会执行任何平滑。较高的值将在现有的帧之间插入额外的帧。将低的 "分辨率 "蓝图值与高的 "平滑度 "值结合起来,可以让你生成由极少的粒子组成的视觉上美观的绳索。
      • 低光滑在这里插入图片描述
      • 高光滑在这里插入图片描述
    • Section twist
      • 每个绳段的捻度。例如,如果你想做一条链子,每条链子相对于前一条链子扭曲90º,这个值应该是90。
      • 0度扭转在这里插入图片描述
      • 45度扭转在这里插入图片描述
      • 90度扭转在这里插入图片描述

    Rope renderers

    • 在路径平滑器组件生成绳索的基于帧的表示后,渲染器使用它来输出可见的几何体。绳索和杆子都支持4种不同的渲染组件。
      1. ObiRopeExtrudedRenderer 沿着绳索的主轴挤出一个ObiRopeSection资源。这是默认的渲染器。
      2. ObiRopeLineRenderer 沿着绳索的主轴生成一个面向摄像头的三角带,类似于Unity的TrailRenderer。这通常比ObiRopeExtrudedRenderer节省资源很多。
      3. ObiRopeChainRenderer 沿着绳段生成预制件。
      4. ObiRopeMeshRenderer 沿着绳索的路径对网格的多个实例进行变形。这是最通用的渲染器,但也是最昂贵的。
    • ObiRopeExtrudedRenderer 在这里插入图片描述
      -通过挤出一个ObiRopeSection,沿着构成你的绳索的颗粒生成一个平滑、连续的网格。不需要手动编辑网格或几何体。所有的都是自动生成的。在这里插入图片描述
      • 使用程序模式和默认的绳索部分渲染的绳索。这些是这个渲染器的参数:
        1. UV Anchor 沿绳索放置纹理坐标原点的点。它用归一化坐标表示。0是绳子的起点,1是绳子的终点。
        2. UV Scale 绳网中纹理坐标的缩放。
        3. Normalize V 强制V纹理坐标在绳索开始时为0,在绳索结束时为v刻度。如果你不想让你的纹理沿着绳索平铺,而是想让它拉伸,那么请启用这个功能。对于使用ObiRopeCursor改变长度的绳索特别有用。
        4. Section 用来提供网格截面的自定义形状。默认的资产是一个8段圆形,但也可以定义自己的形状。
        5. Section thickness scale 根据粒子半径来调整实际网格的厚度。值为1时,产生的网格将与粒子半径完全吻合,值越大,网格越厚,值越小,网格越薄。较大的数值会使网格比粒子表示法更厚,较小的数值会使网格更薄。
        6. Section twist 每个绳段的捻度,以度数表示。
    • ObiRopeLineRenderer在这里插入图片描述
      • 生成一个面向摄像机的三角带,类似于路径渲染。这比其他方法便宜得多,但缺点是必须为每台摄像机渲染一次绳网(而不是为所有摄像机渲染一次)。
        在这里插入图片描述
      • 使用线条模式渲染的绳索。渲染器参数:
        1. UV Anchor 沿绳索放置纹理坐标原点的点。它用归一化坐标表示。0是绳子的起点,1是绳子的终点。
        2. Section thickness scale 相对于粒子半径的实际网格厚度。值为1时,产生的网格与粒子半径完全吻合。数值越大,网格的厚度就越大,数值越小,网格就越薄。
        3. UV Scale 绳网中纹理坐标的缩放。
        4. Normalize V 强制V纹理坐标在绳索开始时为0,在绳索结束时为v刻度。如果你不想让你的纹理沿着绳索平铺,而是想让它拉伸,那么请启用这个功能。对于使用ObiRopeCursor改变长度的绳索特别有用。
    • ObiRopeChainRenderer在这里插入图片描述
      • 在粒子之间的空间中实例化自定义预制。这将导致一个由刚性链接组成的链条。你必须提供至少一个预制件作为链节。
        在这里插入图片描述
      • 绳索采用链式模式渲染,网眼呈链接状,断面扭曲度为45度。
      • 模式参数
        1. UV Anchor 绳索上预制周期开始的点。它用归一化坐标表示。0是绳索的起点,1是绳索的终点。
        2. Link scale 沿着绳索安装的预制件的规模。
        3. Randomize links 启用此功能,可以从链路列表中随机抽取每个链接。禁用此功能,则按照列表中提供的相同顺序生成链接。
        4. Chain links 用于构建链条的链接预制件清单。
        5. Section twist 每个绳段的捻度,以度数表示。
    • ObiRopeMeshRenderer在这里插入图片描述
      • 这是最灵活的渲染方法,但也是最昂贵的。它将把一个自定义的网格沿着绳索多次铺设,使其变形以跟随绳索的形状和运动。在这里插入图片描述
      • 使用自定义网格模式与Unity的默认胶囊网格渲染的绳索。
      • 参数:
        1. Mesh 参考将被绳索变形的网格。
        2. Axis 与绳索对齐的网格轴(在模型空间)。
        3. Volume scaling 控制当绳索被拉伸到超过其静止长度时,网眼会发生多大的变形以保持体积。
        4. Stretch with rope 如果启用,网眼会和绳子一起挤压/拉伸。如果禁用,当网眼长度超过/低于剩余长度时,网眼会在绳索上 “滑动”。
        5. Span entire length 如果启用,网格将跨越整个绳索的长度,即使它必须沿着绳索轴线被拉伸或压缩。如果禁用,则无论绳索长度如何,网格都将沿绳索轴线保持其大小。
        6. Instances 网片应该沿着绳子重复多少次。
        7. Instance spacing 网格实例之间的间隙大小。
        8. Offset 第一个网格实例前留下的初始间隙。
        9. Scale 缩放网格实例。
        10. Section twist 每个绳段的捻度,以度数表示。

在运行时改变绳索长度:ObiRopeCursor在这里插入图片描述

  • Obi提供了一个非常通用的组件,可以在运行时修改绳子的长度。ObiRopeCursor。当添加到一个ObiRope时,这个组件将在它的顶部放置一个光标,允许你从该点 "添加 "或 "移除 "绳子,无论哪个方向。把它想象成文本编辑应用中的常规光标:你可以把它放在文本中的任何位置,并在它的位置添加/删除字符。
  • 你只需要在运行时调用它的ChangeLength(length)方法。游标将自动处理向绳索添加/移除颗粒/约束,以获得新的长度。
  • 它有一些特性:
    1. Cursor Mu:这是光标的归一化位置,新的粒子将被添加到这里或从这里移除。0将把它放在绳子的开始,1将把它放在绳子的结束。任何介于两者之间的值都会把它放在最接近该值的粒子中。
    2. Source Mu:这是添加新粒子时,粒子将从哪里复制的归一化位置。0将把它放在绳子的开始,1将把它放在绳子的结束。任何介于两者之间的值都会把它放在最接近该值的粒子中。
    3. Direction:控制光标方向的布尔值。启用它将使光标指向绳子的末端。禁用该值将使光标指向起点。
    • 举例来说,如果你想通过复制绳索中的第一个粒子,在绳索的中间插入新的粒子,并使它向其末端生长(你可能在开始时固定/钉住了一些粒子,并希望它们保持这种方式),你会将光标μ设置为0.5f,其源μ为0,其方向为true。
    • 使用ObiRopeCursor增加绳索的长度将使用绳索的颗粒池中的颗粒。确保池子足够大(通过设置绳子的Pooled Particles属性),以达到所需的最大长度。当减少绳子的长度时,未使用的粒子将被返回到池中。
    • 在使用游标时,知道绳子的当前长度是非常有用的。使用绳子的RestLength属性来实现。下面的代码使用W和S键增加或减少绳子的长度。你也可以控制变化的速度。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Obi;

public class RopeLengthController : MonoBehaviour {

	public float speed = 1;
	ObiRopeCursor cursor;
	ObiRope rope;

	void Start () {
		cursor = GetComponentInChildren();
		rope = cursor.GetComponent();
	}

	void Update () {
		if (Input.GetKey(KeyCode.W))
			cursor.ChangeLength(rope.RestLength - speed * Time.deltaTime);

		if (Input.GetKey(KeyCode.S))
			cursor.ChangeLength(rope.RestLength + speed * Time.deltaTime);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 光标卷绳在这里插入图片描述
  • 光标放绳
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/127926
推荐阅读
相关标签
  

闽ICP备14008679号