bezier_derivative
2026/4/15大约 3 分钟
最后同步日期:2026-04-15 | Godot 官方原文 — bezier_derivative
bezier_derivative
定义
bezier_derivative() 计算贝塞尔曲线在指定点的导数,也就是曲线在该点的切线方向(斜率)。
贝塞尔曲线就像你用钢笔工具画的一条弧线——你先点一个起点,再拖两个"把手"控制弧度的弯曲方向,最后点一个终点。这条弧线上每个位置都有一个"前进方向",bezier_derivative() 就是告诉你:在弧线的某个位置上,曲线正朝哪个方向走。
函数签名
C#
public static float Mathf.BezierDerivative(float start, float control1, float control2, float end, float t)GDScript
func bezier_derivative(start: float, control_1: float, control_2: float, end: float, t: float) -> float参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
start | float | 是 | 起始点的值(贝塞尔曲线的左端点) |
control_1 | float | 是 | 第一个控制点的值(影响曲线靠近起点位置的弯曲程度) |
control_2 | float | 是 | 第二个控制点的值(影响曲线靠近终点位置的弯曲程度) |
end | float | 是 | 终止点的值(贝塞尔曲线的右端点) |
t | float | 是 | 曲线上的位置参数,范围 0.0 ~ 1.0。0.0 表示起点,1.0 表示终点,0.5 表示中间 |
返回值
float —— 贝塞尔曲线在参数 t 处的导数值(切线斜率)。正值表示曲线在该点向上走,负值表示向下走,0 表示曲线在该点水平(处于拐点)。
代码示例
C#
using Godot;
public partial class CurveExample : Node
{
public override void _Ready()
{
// 定义一条贝塞尔曲线的四个点
float start = 0.0f; // 起点:0
float control1 = 1.0f; // 控制点1:向上拉
float control2 = -1.0f; // 控制点2:向下拉
float end = 0.0f; // 终点:0
// 查看曲线在 t=0.5 处的切线方向
float derivative = Mathf.BezierDerivative(start, control1, control2, end, 0.5f);
GD.Print($"t=0.5 处的导数(切线斜率): {derivative}");
// 对比不同位置的切线方向
for (int i = 0; i <= 10; i++)
{
float t = i / 10.0f;
float d = Mathf.BezierDerivative(start, control1, control2, end, t);
GD.Print($"t={t}: 导数 = {d}");
}
}
}GDScript
extends Node
func _ready():
# 定义一条贝塞尔曲线的四个点
var start = 0.0 # 起点:0
var control1 = 1.0 # 控制点1:向上拉
var control2 = -1.0 # 控制点2:向下拉
var end = 0.0 # 终点:0
# 查看曲线在 t=0.5 处的切线方向
var derivative = bezier_derivative(start, control1, control2, end, 0.5)
print("t=0.5 处的导数(切线斜率): ", derivative)
# 对比不同位置的切线方向
for i in range(11):
var t = i / 10.0
var d = bezier_derivative(start, control1, control2, end, t)
print("t=%s: 导数 = %s" % [t, d])注意事项
t参数的值会被自动限制在 0.0 ~ 1.0 之间(超出范围会被 clamp),所以不用担心传入的值越界。- 导数通常用于动画缓动效果——通过导数你可以知道动画在某一帧的速度变化,实现更自然的运动。
- 此函数是
bezier_interpolate()的"配套函数":bezier_interpolate()告诉你曲线上某个位置的值是多少,bezier_derivative()告诉你那个位置的切线方向是什么。 - 如果四个控制点在同一条直线上(控制点没有产生弯曲效果),那么导数就是一个常数值——曲线完全是一条直线。
