# spline.blk ## loft{} 模块 独立于样条线控制点的程序透明度。 - **randomOpacityMulAcross:p2=1,0.2** – 样条曲线上的随机透明度变化。 - **randomOpacityMulAlong:p2=1,0.2** – 沿样条曲线的随机透明度变化。 - 第一个数字表示样条纹理高度贴图的整体减少。 - 第二个数字表示样条纹理高度图中的增量变化。 --- --- 此功能允许为道路和人行道添加变化。例如,沙子可能会随机出现,与图块图案混合。 - **name:t="afg_road_c"** – 样条曲线的名称。 - **matName:t="afg_road_c"** – 样条曲线的材料参考。 - **loftLayerOrder:i=0** – 渲染层顺序。具有最高`i`值的样条曲线最后渲染。 - **subdivCount:i=0** – 样条曲线点之间的线性细分(值越高,过渡越平滑)。 - **shapeSubdivCount:i=0** – 放样几何体相对于样条曲线宽度的线性细分,例如:

shapeSubdivCount:i=8

shapeSubdivCount:i=0 (or 1)

--- - **flipUV:b=0** – 交换 UVW 映射中的`u` 和 `v`通道。 - **vTile:r=1.0** – 沿样条线宽度缩放纹理,例如:

vTile:r=1.0

vTile:r=2.0

vTile:r=0.5

--- - **uSize:r=10.0** – 沿样条长度的纹理缩放。 `uSize` 到 `vTile` 的比率直接受 **shape** 块中的参数影响(见下文)。 - **extrude:b=0** – 当设置为 `1` 时,放样几何体被拉伸(增加厚度) ```{note} This parameter currently has no effect. ``` - **cullcw:b=0** – 反转样条线法线。 - **offset:p2=0, 0** – 相对于样条曲线偏移放样几何体: - 第一个值相对于样条曲线宽度偏移放样。 - 第二个值相对于样条曲线垂直偏移放样:

offset:p2 = 0, 0

offset:p2 = 5.5, 0

offset:p2 = -5.5, 0

---

offset:p2 = 0, -5

--- - **placeAboveHt:r=100** – 从高度贴图到发生样条投影的样条的距离。 以下参数仅适用于放样。如果样条线仅投影纹理而未烘焙,则可以省略此部分。如果启用此块,将始终执行检查,这可能会导致 [*daEditor*](../../dagor-tools/daeditor/daeditor/daeditor.md) 中的加载时间过长(长达几分钟)。 - **roadBehavior:b=0** – 启用 road behavior (道路行为) 块。如果禁用,则放样将直接放置在地形网格上。很少需要此设置(95% 的情况)。 - **htTestStep:r=100** – 样条控件点之间的点数,其中将检查 `followHills` 和 `followHollows` 的条件。不能为零(可能会使 *daEditor* 崩溃)。 - **followHills:b=0** – 确保放样不会绘制在山丘下方(启用时抬起放样以匹配山丘高度)。 - **followHollows:b=0** – 确保放样不会在凹陷处绘制(启用时降低放样以匹配深度)。 - **maxHerr:r=1.5** – (需要澄清) - **roadTestWidth:r=4.0** – 与测试此块条件的样条中心的距离。 - **curvatureStrength:r=0** – 控制样条曲线曲率对放样几何体细分的影响。 - **minStep:r=1** – 细分之间的最小距离(以米为单位)。 - **maxStep:r=1000** – 最大细分距离,以米为单位(请参阅屏幕截图)。 **Examples:** - **curvatureStrength:r=1, minStep:r=1, maxStep:r=100** – 根据需要根据样条曲线曲率细分放样,从而减少不必要的三角形: --- - **curvatureStrength:r=0, minStep:r=1, maxStep:r=4** – 等间距放样细分,与样条曲线曲率无关。 --- - **curvatureStrength:r=0, minStep:r=1, maxStep:r=1000** – 针对具有两点和线性插值的样条曲线进行了优化。 --- - **integral_mapping_length:b=0** – 设置为`1` 时,使用积分计算电弧长度(见 [Arc length](https://en.wikipedia.org/wiki/Arc_length)). - **sweepWidth:r=200** – 删除由 **LandClasses** 生成的渲染实例(例如,与道路或河岸相交的树木或房屋)。 - **addFuzzySweepHalfWidth:r=50** – 创建“粗糙”蒙版或散布效果(不应超过 `sweepWidth` 的值)。 - **sweep2Width:r=50** – 删除渲染实例,甚至删除由 **objGen{}** 块中的此样条生成的渲染实例(对于道路交叉点很有用,例如,柏油路与绿树成荫的大道与土路相交)。 ## node_flags{} 模块 - **renderable:b=1** – 启用放样的渲染。 - **collidable:b=1** – 启用放样的碰撞。 ## shape{} 模块 - **closed:b=0** – 闭合放样的横截面。 **shape{}** 块管理 Loft 轮廓点的位置。至少需要 2 分。 **示例:** **pt:p4= -5.0, 0.0, 1.0, 0.0** 其中: - **-5.0** – 点沿样条线宽度的偏移,距中心 5 米。 - **0.0** – 点相对于样条曲线的垂直偏移(无垂直偏移)。 - **1.0** – 沿样条曲线长度的 UV 坐标移动(此参数无效)。 - **0.0** – UV 坐标沿样条线的宽度移动。 **示例:** - **pt:p4= 5.0, 0.0, 1.0, 0.0** – 此点向相反方向偏移 5 米,具有相同的垂直和 UV 设置。 最终放样的宽度为 10 米,并与样条的控制点垂直对齐(请参见屏幕截图)。**vTile** 与 **uSize** 的比率为 1:10(如上所述)。 **更复杂的弯曲轮廓示例:** - **pt:p4= -7.5, 0.0, 0.0, 0.0** - **pt:p4= -5.0, 1.0, 0.0, 0.2** - **pt:p4= 5.0, 1.0, 0.0, 0.8** - **pt:p4= 7.5, 0.0, 0.0, 1.0** 最终放样的宽度为 15 米(范围从 -7.5 米到 7.5 米),并将与样条控件控制点垂直对齐。中间部分宽 10 米,将高出样条曲线 1 米。 在上面的示例中,放样的三角形行为一致。为了区分放样中点的行为,使用了 **group{}** 块。 **示例:** ``` group{ pt:p4= -7.5, 0.0, 0.0, 0.0 } group{ pt:p4= -5.0, 1.0, 0.25, 0.25 pt:p4= 5.0, 1.0, 0.75, 0.75 } group{ pt:p4= 7.5, 0.0, 1.0, 1.0 } ``` 对放样点进行分组定义它们的不同行为。 **示例:** ``` group{ type:t="rel_to_collision" pt:p4= -7.5, 0.0, 0.0, 0.0 } group{ type:t="move_to_min" pt:p4= -5.0, 1.0, 0.25, 0.25 pt:p4= 5.0, 1.0, 0.75, 0.75 } group{ type:t="rel_to_collision" pt:p4= 7.5, 0.0, 1.0, 1.0 } ``` 生成的放样由三组组成。中间组点的垂直位置与样条控制点的最低垂直坐标 (`type:t="move_to_min"`) 匹配。两个外部组被 “放置” 到碰撞对象上(在这种情况下,高度贴图用作碰撞)。 ## colliders{} 模块 **colliders{}** 块定义样条线与之碰撞的对象。 - **use:t="HeightMap"** – 与高度贴图碰撞。 - **use:t="(srv) Prefab entities"** – 与预制件实体碰撞。 - **use:t="(filter) Generated by spline"** – 与样条线本身生成的对象碰撞。 - **use:t="SGeometry"** – 与场景几何体碰撞。 ## obj_generate{} 模块 **obj_generate{}** 块负责沿样条线放置对象。 - **rseed:i = 111** – 用于生成随机值的 random seed。为不同的 **obj_generate{}** 块使用唯一的种子是必不可少的;否则,将导致语法错误。 - **setSeedToEntities:b=yes** – 为复合对象启用随机化。 否则,将重复生成相同的随机元素,而不是每次生成不同的随机元素。 - **placeAtPoint:b=true** – 将对象放置在样条曲线点处,这对于精确放置非常有用,例如城市中的电线杆。步长值(如下所述)也将适用。 - **step:p2 = 10, 0** – 第一个值是对象之间的距离 (步长),而第二个值定义随机变化的范围。例如: - **step:p2 = 10, 0** – 物体正好相距 10 米。 - **step:p2 = 10, 2** – 在 10 米的步长中添加(或减去)一个介于 0 和 2 米之间的随机值,从而在对象之间创建不同的距离。 使用 **genTag** 系统时,步骤必须大于最宽对象的宽度。否则,对象之间的距离将由 **step** 决定,而不是对象的 **width**。 - **offset:p2 = 0.0, 0.0** – 第一个值沿样条线移动对象的位置,第二个值定义随机变化的范围。 - **placeAboveHt:r=100** – 对象将投影到 100 米距离内的地面上。 - **startPadding:r=3.5; endPadding:r=3.5** – 这些参数定义样条曲线起点和终点的排除区域,不会在其中生成任何对象。 - **orientation:t="normal"** – 控制放置过程中对象的方向。可能的值包括: - **orientation:t="normal"** – 对象未对齐;它们的倾斜度取决于其下方的表面法线。 --- - **orientation:t="fence"** – 对象沿样条线对齐,没有倾斜。 --- - **orientation:t="fence_normal"** – 对象沿样条线对齐,其倾斜度取决于表面的法线。 --- - **tightFenceOrient:b=yes** – 沿和弦对齐对象。顾名思义,这对栅栏很有用。它们不是将对象放置在样条曲线本身上,而是放置在由对象宽度定义的弦上。沿样条曲线生成弦,直到它们适合其长度。如果最后一个和弦短于对象的 **width**,则不会生成该对象,并留下间隙。为避免间隙,您可以通过设置 **integral_end_entity:b=yes** 来使用 “filler” 对象。 --- - **tightFenceIntegral:t="spline"** – 使和弦忽略样条线节点。 - **tightFenceIntegral:t="segment"** – 将样条曲线的每个线段视为单独的样条曲线。用于沿不规则等值线生成围栅。 - **tightFenceIntegral:t="corner"** – 填充对象仅放置在角处。 - **placeAtVeryStart:b=yes** 和 **placeAtVeryEnd:b=yes** – 确保将对象放置在样条曲线的起点或终点,而不管其频率或填充如何。 要在样条曲线的起点或终点添加唯一对象(不沿中间重复),请使用零步长: **step:p2 = 0, 0**。 ### object{} 模块 这些参数与对象本身相关,如 **object{}** 块中所定义。 **示例:** ``` object{ genTag:t="a" width:r=17 name:t="modern_siding_suburb_building_a" weight:r=1 rot_x:p2=0, 0 rot_y:p2=0, 0 rot_z:p2=0, 0 offset_x:p2= 0, 0 offset_y:p2= 0, 0 offset_z:p2= 12, 0 scale:p2=1.0, 0.0 yScale:p2=1.0, 0 } ``` 其中: - **genTagSeq:t="a"** – 用于放置的对象的顺序 (图案)。 - **genTagSeq:t="a"** – 只会放置具有 **genTag:t="a"** 的对象。如果有多个具有相同标签的物体,它们将被随机选择,它们的选择频率由 **weight** 控制。如果序列包含多个相同的标签(例如,**genTagSeq:t="aaaaaaa"** 或 **genTagSeq:t="a"**),则结果是相同的。 - **genTagSeq:t="ab"** – 在具有 **genTag:t="a"** 和 **genTag:t="b"** 的对象之间交替。 - **genTagSeq:t="abbccaccabcca"** – 在具有四个不同 **genTags** 的对象之间交替。 **示例:** - **genTagSeq:t="a"** --- - **genTagSeq:t="ab"** --- - **genTagSeq:t="abc"** --- - **width:r=17** – 当前类型的连续对象之间的距离(在本例中为 17 米)。 - **name:t="modern_siding_suburb_building_a"** – 对对象的引用。 - **weight:r=1** – 从具有相同 **genTag** 的一组对象中随机选择此对象的概率(频率)。 - **rot_x, rot_y, rot_z** – 对象在三个平面中的随机值旋转。 - **offset_x, offset_y, offset_z** – 沿三个轴的随机偏移。 - **scale:p2** – 具有随机值的 Uniform scale。 - **yScale:p2** – 具有随机值的垂直缩放。 - **integral_end_entity:b=yes** – 在使用 **tightFenceOrient** 时将对象标记为 “filler”。此对象将被缩放或拉伸以适合剩余的样条长度。此参数仅影响序列中的最后一个对象。 标有 **integral_end_entity** 的对象可能无法生成(如果其 **genTag** 未在 **genTagSeq**中使用),但仍将用作样条末端的填充物。 为了正确作并避免过度扭曲,建议创建多个填充对象。通常,除了主对象之外,您还应该有四分之三、二分之二和四分之一长度的版本。要允许缩放,请在 **xzScale:p2** 参数中指定值。 --- ## 形状到放样 HDA 此脚本将多边形形状转换为放样点的坐标,允许将这些值替换为样条类: [**dgr_shape_to_loft.hda**](./_images/dgr_shape_to_loft.hda). 该工具旨在促进将多边形几何体转换为可用于放样的格式,从而更顺畅地将自定义形状集成到基于样条的工作流程中。 --- 要在编辑器中直观地显示放样几何体并调整参数: 1. 打开 `*.mat.blk` 文件并设置 **render_landmesh_combined=0** 到 **render_landmesh_combined=1**。 2. 打开 `*.spline.blk`文件,按下 Ctrl+S 将修改应用到`*.mat.blk`。 然后按`F3` 即可看到放样几何体的线框。