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 映射中的uv通道。

  • vTile:r=1.0 – 沿样条线宽度缩放纹理,例如:

    vTile:r=1.0

    vTile:r=2.0

    vTile:r=0.5


  • uSize:r=10.0 – 沿样条长度的纹理缩放。

    uSizevTile 的比率直接受 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 中的加载时间过长(长达几分钟)。

  • roadBehavior:b=0 – 启用 road behavior (道路行为) 块。如果禁用,则放样将直接放置在地形网格上。很少需要此设置(95% 的情况)。

  • htTestStep:r=100 – 样条控件点之间的点数,其中将检查 followHillsfollowHollows 的条件。不能为零(可能会使 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).

  • 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 米,并与样条的控制点垂直对齐(请参见屏幕截图)。vTileuSize 的比率为 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=yesplaceAtVeryEnd: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.

该工具旨在促进将多边形几何体转换为可用于放样的格式,从而更顺畅地将自定义形状集成到基于样条的工作流程中。


要在编辑器中直观地显示放样几何体并调整参数:

  1. 打开 *.mat.blk 文件并设置 render_landmesh_combined=0render_landmesh_combined=1

  2. 打开 *.spline.blk文件,按下 Ctrl+S 将修改应用到*.mat.blk

然后按F3 即可看到放样几何体的线框。