lerp 线性插值

GDSciprt中的 lerp 公式

func lerp(a, b, t):
    return (1 - t) * a + t * b

在此公式中,a和b代表两个值,t是插值量,通常表示为0(返回a)和1(返回b)之间的值。该函数查找给定数量的值例如

x = lerp(0, 1, 0.75)  # x is 0.75
x = lerp(0, 100, 0.5)  # x is 50
x = lerp(10, 75, 0.3)  # x is 29.5
x = lerp(30, 2, 0.75)  # x is 9

线性差值概念参照 wiki wiki_zh

demo

使用 lerp 设置节点 Sprite 的缩放属性 scale 和 透明属性 modulate.a, 利用 delta (帧间隔) 特性,获取 a,b 的插值,平稳的改变属性,使节点从小到大, 从显示到透明,

extends Sprite

var time = 0 # 计次(帧)
var duration = 2  # 特效长度

func _process(delta): # 每帧执行,lerp 获取插值,从而得到线性的变动的值
    if time < duration:
        time += delta
        modulate.a = lerp(1, 0, time / duration) # 从 1 到 0(透明) 
        scale = Vector2.ONE * lerp(1, 5, time / duration) # 从 1 倍到 5 倍

{# /images/lerp.gif #} lerp

向量插值

向量类型 Vector2Vector3 提供了函数 linear_interpolate() 获取插值。

比如 向投个目标逼近处理,每帧移动 10%。

extends Sprite

var target

func _input(event):
    if event is InputEventMouseButton and event.pressed:
        target = event.position

func _process(delta):
    if target:
        position = position.linear_interpolate(target, 0.1)

lerp 也是支持 Vector2 等类型参数。

另外在godot 中使用 Tween 补间动画处理也可以达到同样的效果。

# 设置透明度从半透明到透明
$Tween.interpolate_property(self,"modulate", Color(1,1,1,0.6), Color(1,1,1,0),0.35, Tween.TRANS_SINE, Tween.EASE_IN)
$Tween.start()

Noise 噪声发生器

Godot 提供类库 OpenSimplexNoise 基于 Simplex Noise Open Simplex 噪声生成器。

下面配置一个噪声发生器,然后获取位置和尺寸。

# 创建噪声发生器
var noise = OpenSimplexNoise.new()

# 配置
noise.seed = randi()
noise.octaves = 4
noise.period = 20.0
noise.persistence = 0.8

# 获取噪点值
print("Values:")
# get_noise_2d(x, y)
print(noise.get_noise_2d(1.0, 1.0))
# get_noise_3d(x, y, z)
print(noise.get_noise_3d(0.5, 3.0, 15.0))
# get_noise_4d(x, y, z, w)
print(noise.get_noise_4d(0.5, 1.9, 4.7, 0.0))

参数:

  • seed - 用于生成随机值的种子,默认为0.
  • period - 越低的值生成较高频率的噪点(相同距离内会产生更多变化)默认为 64。
  • octaves - 八度音阶层 默认3
  • lacunarity - 八度层之间的间隙,默认为2。
  • persistence - 持续性,每个八度音阶层(octaves) 对噪音的生成量。

也可以 创建建 Sprite 精灵节点,配置纹理 Texture 属性为 NoiseTexture , 并设置 Noise 为 新建OpenSimplexNoise,然后配置参数即可实时看到生成效果。

noiseTexture

http://kidscancode.org/godot_recipes/math/interpolation/