类似问题:沿样条曲线弯曲网格
我想创建一个 Godot 顶点着色器,它沿着
Path3D
弯曲网格,类似于 Blender 中“曲线”修改器的工作方式。
这是一个例子:
我制作了这个着色器。
void vertex() {
vec3 vertex_norm = vec3(
VERTEX.x / curve_length,
VERTEX.y / curve_length,
VERTEX.z / curve_length
);
vec3 curve_position = texture(positions, vec2(vertex_norm.y, 0.0)).xyz;
vec3 curve_normal = texture(normals, vec2(vertex_norm.y, 0.0)).xyz;
vec3 curve_binormal = texture(binormals, vec2(vertex_norm.y, 0.0)).xyz;
curve_normal *= VERTEX.z;
curve_binormal *= VERTEX.x;
vec3 offset = curve_normal + curve_binormal;
VERTEX = curve_position + offset;
}
以下是它在幕后的工作原理:
Path3D
获得的,并按照预定义的次数进行采样。 (在for
循环中)curve.sample_baked_with_rotation(offset)
,为我们提供曲线每个样本的位置、法线和副法线。FORMAT_RGBF
Image
- 每个都包含以 rgb 值编码的位置、法线和副法线。纹理的宽度是样本数量,高度是 1px。
ImageTexture
并与曲线的总长度一起传递到着色器。 (
curve_length
变量)
y 值而发生的,但我不确定。 |
y 坐标固定到 (0.0, 1.0) 但没有帮助。 |
如何解决这些问题并使这个 Godot 着色器的行为就像 Blender 中的“曲线”修改器一样?
我猜测 Blender 的曲线修改器在添加额外顶点时没有问题,尽管顶点着色器可能会出现问题?
对于第二个问题,这不就是简单地将
curve_position.y
缩放为
mesh_length / curve_length
吗?我想你需要在着色器之外计算
mesh_length
并将其传递进去......