🧣 样条曲线(Spline)#

#bs.spline:help

从控制点创建和操作平滑曲线。

../../_images/spline.png

“不要循着已有的路走,而要去没有路的地方并留下自己的足迹。”

—拉尔夫·沃尔多·爱默生(Ralph Waldo Emerson)

支持的维度

这些函数仅支持一维、二维和三维样条曲线。如果需要处理更多维度,可以为每个轴或分量并行运行多个一维样条曲线。

可变点数

本模块中的所有样条曲线函数都接受可变数量的点。你不受限于只使用四个或任何固定数量的点。样条曲线通过组合多个曲线段构建而成,因此你可以根据需要定义任意数量的点。


🔧 函数#

你可以在下方找到此模块中的所有可用函数。


求值#

#bs.spline:evaluate_bezier

计算由单个或多个片段组成的贝塞尔样条曲线。每个片段由四个连续的控制点定义,且相邻片段共享端点,即前片段的终点作为后片段的起点。

输入:

命令存储 bs:in spline.evaluate_bezier

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • time: 在0到曲线段数量间的归一化位置。整数部分决定曲线段的序号,小数部分代表当前分段内的插值位置。

输出:

命令存储 bs:out spline.evaluate_bezier: 样条曲线在给定时间点的插值点(一维、二维或三维)。

示例:在二维空间中求值贝塞尔曲线中间的点(可视化曲线):

data modify storage bs:in spline.evaluate_bezier set value {points:[[0,0],[1,2],[2,-1],[3,1]],time:0.5}
function #bs.spline:evaluate_bezier
data get storage bs:out spline.evaluate_bezier
#bs.spline:evaluate_bspline

计算由单个或多个片段构成的B样条曲线。每个片段由四个连续控制点定义,且每段末三位控制点将被复用为下一段的前三位控制点,从而实现平滑过渡。

输入:

命令存储 bs:in spline.evaluate_bspline

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • time: 在0到曲线段数量间的归一化位置。整数部分决定曲线段的序号,小数部分代表当前分段内的插值位置。

输出:

命令存储 bs:out spline.evaluate_bspline: 样条曲线在给定时间点的插值点(一维、二维或三维)。

示例:在二维空间中求值B样条曲线中间的点(可视化曲线):

data modify storage bs:in spline.evaluate_bspline set value {points:[[0,0],[1,2],[2,-1],[3,1]],time:0.5}
function #bs.spline:evaluate_bspline
data get storage bs:out spline.evaluate_bspline
#bs.spline:evaluate_catmull_rom

计算由一个或多个片段组成的Catmull-Rom样条曲线。每个片段由四个连续控制点定义,且每段末三位控制点将被复用为下一段的前三位控制点,从而实现平滑过渡。

输入:

命令存储 bs:in spline.evaluate_catmull_rom

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • time: 在0到曲线段数量间的归一化位置。整数部分决定曲线段的序号,小数部分代表当前分段内的插值位置。

输出:

命令存储 bs:out spline.evaluate_catmull_rom: 样条曲线在给定时间点的插值点(一维、二维或三维)。

示例:在二维空间中求值Catmull-Rom曲线中间的点(可视化曲线):

data modify storage bs:in spline.evaluate_catmull_rom set value {points:[[0,0],[1,2],[2,-1],[3,1]],time:0.5}
function #bs.spline:evaluate_catmull_rom
data get storage bs:out spline.evaluate_catmull_rom
#bs.spline:evaluate_hermite

计算由单个或多个片段构成的 Hermite 样条曲线。每个片段需定义起始点位置及其切向量(一阶导数),且当前片段的终点位置与切向量将自动复用为下一个片段的起点位置与切向量。所有坐标与切向量均基于绝对坐标系(非相对值)。

输入:

命令存储 bs:in spline.evaluate_hermite

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • time: 在0到曲线段数量间的归一化位置。整数部分决定曲线段的序号,小数部分代表当前分段内的插值位置。

输出:

命令存储 bs:out spline.evaluate_hermite: 样条曲线在给定时间点的插值点(一维、二维或三维)。

示例:在二维空间中求值Hermite曲线中间的点(可视化曲线):

data modify storage bs:in spline.evaluate_hermite set value {points:[[0,0],[1,2],[2,-1],[3,1]],time:0.5}
function #bs.spline:evaluate_hermite
data get storage bs:out spline.evaluate_hermite
#bs.spline:evaluate_linear

计算线性样条曲线,该曲线将每对连续点以直线段连接。无曲率调节,插值处理为分段线性。

输入:

命令存储 bs:in spline.evaluate_linear

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每对连续点定义一个直线段。

    • time: 在0到曲线段数量间的归一化位置。整数部分决定曲线段的序号,小数部分代表当前分段内的插值位置。

输出:

命令存储 bs:out spline.evaluate_linear: 样条曲线在给定时间点的插值点(1维、2维或3维)。

示例:计算二维空间中两点之间的中点:

data modify storage bs:in spline.evaluate_linear set value {points:[[0,0],[4,2],[6,5]],time:0.5}
function #bs.spline:evaluate_linear
data get storage bs:out spline.evaluate_linear

制作人员:Aksiome

采样#

#bs.spline:sample_bezier

采样由单个或多个片段组成的贝塞尔样条曲线。每个片段由四个连续的控制点定义,且相邻片段共享端点,即前片段的终点作为后片段的起点。

输入:

命令存储 bs:in spline.sample_bezier

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

输出:

命令存储 bs:out spline.sample_bezier: 样条曲线上的采样点。

示例:在二维空间中采样贝塞尔曲线上的10个点(可视化曲线):

data modify storage bs:in spline.sample_bezier set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1}
function #bs.spline:sample_bezier
data get storage bs:out spline.sample_bezier
#bs.spline:sample_bspline

采样由一个或多个片段组成的B样条曲线。每个片段由四个连续的控制点定义,其中一个片段的三个点被重用以确保平滑混合。

输入:

命令存储 bs:in spline.sample_bspline

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

输出:

命令存储 bs:out spline.sample_bspline: 样条曲线上的采样点。

示例:在二维空间中采样B样条曲线上的10个点(可视化曲线):

data modify storage bs:in spline.sample_bspline set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1}
function #bs.spline:sample_bspline
data get storage bs:out spline.sample_bspline
#bs.spline:sample_catmull_rom

采样由一个或多个片段组成的Catmull-Rom样条曲线。每个片段由四个连续的控制点定义,其中一个片段的三个点被重用以确保平滑混合。

输入:

命令存储 bs:in spline.sample_catmull_rom

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

输出:

命令存储 bs:out spline.sample_catmull_rom: 样条曲线上的采样点。

示例:在二维空间中采样Catmull-Rom曲线上的10个点(可视化曲线):

data modify storage bs:in spline.sample_catmull_rom set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1}
function #bs.spline:sample_catmull_rom
data get storage bs:out spline.sample_catmull_rom
#bs.spline:sample_hermite

采样由一个或多个片段组成的Hermite样条曲线。每个片段由两个位置及其相关切线定义,其中两个点(第二个位置及其切线)被重用作下一个片段的第一个点。所有坐标和切线都是绝对值。

输入:

命令存储 bs:in spline.sample_hermite

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

输出:

命令存储 bs:out spline.sample_hermite: 样条曲线上的采样点。

示例:在二维空间中采样Hermite曲线上的10个点(可视化曲线):

data modify storage bs:in spline.sample_hermite set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1}
function #bs.spline:sample_hermite
data get storage bs:out spline.sample_hermite
#bs.spline:sample_linear

Sample a linear spline, which connects each pair of consecutive points with a straight segment.

输入:

命令存储 bs:in spline.sample_linear

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每对连续点定义一个直线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

输出:

命令存储 bs:out spline.sample_linear: 样条曲线上的采样点。

示例:在二维空间中的折线上均匀采样点:

data modify storage bs:in spline.sample_linear set value {points:[[0,0],[4,2],[6,5]],step:0.25}
function #bs.spline:sample_linear
data get storage bs:out spline.sample_linear

制作人员:Aksiome

流式处理#

#bs.spline:stream_bezier

流式处理由一个或多个片段组成的贝塞尔样条曲线。每个片段由四个连续的控制点定义,其中一个片段的最后一个点被重用作下一个片段的第一个点。此函数在多个时间步内处理每一步。

输入:

命令存储 bs:in spline.stream_bezier

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

    • run: 在采样过程每个步骤执行的命令。每个步骤可使用以下命令存储:

      • bs:lambda spline.point: 当前的点坐标。

示例:在二维空间中流式处理贝塞尔曲线上的10个点,并在每一步执行一个命令(可视化曲线):

data modify storage bs:in spline.stream_bezier set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1,run:'tellraw @a {"storage":"bs:lambda","nbt":"spline.point"}'}
function #bs.spline:stream_bezier
#bs.spline:stream_bspline

流式处理由一个或多个片段组成的B样条曲线。每个片段由四个连续的控制点定义,其中一个片段的三个点被重用以确保平滑混合。此函数在多个时间步内处理每一步。

输入:

命令存储 bs:in spline.stream_bspline

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

    • run: 在采样过程每个步骤执行的命令。每个步骤可使用以下命令存储:

      • bs:lambda spline.point: 当前的点坐标。

示例:在二维空间中流式处理B样条曲线上的10个点,并在每一步执行一个命令(可视化曲线):

data modify storage bs:in spline.stream_bspline set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1,run:'tellraw @a {"storage":"bs:lambda","nbt":"spline.point"}'}
function #bs.spline:stream_bspline
#bs.spline:stream_catmull_rom

流式处理由一个或多个片段组成的Catmull-Rom样条曲线。每个片段由四个连续的控制点定义,其中一个片段的三个点被重用以确保平滑混合。此函数在多个时间步内处理每一步。

输入:

命令存储 bs:in spline.stream_catmull_rom

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

    • run: 在采样过程每个步骤执行的命令。每个步骤可使用以下命令存储:

      • bs:lambda spline.point: 当前的点坐标。

示例:在二维空间中流式处理Catmull-Rom曲线上的10个点,并在每一步执行一个命令(可视化曲线):

data modify storage bs:in spline.stream_catmull_rom set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1,run:'tellraw @a {"storage":"bs:lambda","nbt":"spline.point"}'}
function #bs.spline:stream_catmull_rom
#bs.spline:stream_hermite

流式处理由一个或多个片段组成的Hermite样条曲线。每个片段由两个位置及其相关切线定义,其中两个点(第二个位置及其切线)被重用作下一个片段的第一个点。所有坐标和切线都是绝对值。此函数在多个时间步内处理每一步。

输入:

命令存储 bs:in spline.stream_hermite

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每4个连续的点定义一个曲线段。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

    • run: 在采样过程每个步骤执行的命令。每个步骤可使用以下命令存储:

      • bs:lambda spline.point: 当前的点坐标。

示例:在二维空间中流式处理Hermite曲线上的10个点,并在每一步执行一个命令(可视化曲线):

data modify storage bs:in spline.stream_hermite set value {points:[[0,0],[1,2],[2,-1],[3,1]],step:0.1,run:'tellraw @a {"storage":"bs:lambda","nbt":"spline.point"}'}
function #bs.spline:stream_hermite
#bs.spline:stream_linear

流式处理由多个线段组成的线性样条曲线。每个分段通过直线连接两个连续控制点。此函数会在多个游戏刻内分步处理每个点。

输入:

命令存储 bs:in spline.stream_linear

  • 参数

    • points: 坐标点列表(1维、2维或3维)。每两个连续点表示一个线段的两端。

    • step: 样条曲线采样点的生成间隔。值越小,生成的点越密集。

    • run: 在采样过程每个步骤执行的命令。每个步骤可使用以下命令存储:

      • bs:lambda spline.point: 当前的点坐标。

示例:在二维空间的线性路径上流式处理10个点,并在每一步执行命令:

data modify storage bs:in spline.stream_linear set value {points:[[0,0],[1,2],[3,0]],step:0.1,run:'tellraw @a {"storage":"bs:lambda","nbt":"spline.point"}'}
function #bs.spline:stream_linear

制作人员:Aksiome


🎓 关于样条曲线#

通过这些可视化示例了解这些曲线的行为。有关样条曲线的更深入见解,请观看此视频


贝塞尔曲线

B样条曲线

Catmull-Rom样条曲线

Hermite样条曲线


💬 这对你有帮助吗?

欢迎在下方留下你的问题和反馈!