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
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 #}
向量插值
向量类型 Vector2
和 Vector3
提供了函数 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
,然后配置参数即可实时看到生成效果。