# 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` 即可看到放样几何体的线框。