Godot 顶点着色器,用于沿路径弯曲网格(类似于 Blender 的“曲线”修改器)

Godot vertex shader to bend a mesh along a path (similar to the Blender's "Curve" modifier)

提问人:reptofrog 提问时间:11/15/2023 最后编辑:reptofrog 更新时间:11/18/2023 访问量:96

问:

赏金将在 4 天后到期。这个问题的答案有资格获得 +50 声望赏金。Reptofrog希望引起人们对这个问题的更多关注

类似问题:沿样条弯曲网格

相关新闻: 如何使用几何节点折弯几何图形

相关新闻: Unity Curve Modifier


我想做什么:

我想创建一个 Godot 顶点着色器,它沿着类似于 Blender 中“曲线”修改器的工作方式弯曲网格。Path3D

下面是一个示例:


到目前为止,我做了什么:

我制作了这个着色器。

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;
}

以下是它在幕后的工作原理:

  1. 曲线是从 获得的,并对预定义的次数进行采样。(循环)Path3Dfor
  2. 对于每个样本被调用,为我们提供了曲线中每个样本的位置、法线和双法线。curve.sample_baked_with_rotation(offset)
  3. 创建三个 s - 每个 s 都包含以 RGB 值编码的位置、法线和双法线。纹理的宽度是样本量,高度为 1px。FORMAT_RGBFImage
    • 例如,如果我们使用 128 个样本,则图像的宽度为 128px。
  4. 然后,这些图像被转换为 s,并与曲线的总长度一起传递到着色器。(变量)ImageTexturecurve_length

什么不起作用:

破损的顶点
有些顶点会做这种奇怪的事情,我不确定如何准确描述它。我想这可能是因为负值而发生的,但我不确定。y
我试过将顶点的坐标夹紧,但没有帮助。y(0.0, 1.0)
曲线的方向打破了阴影
曲线的方向会影响阴影,并且会中断。在屏幕截图中,太阳实际上是从另一个方向照射进来的。

所以问题是......

如何解决这些问题并使这个 Godot 着色器的行为就像 Blender 的“曲线”修改器一样?


此外,是否可以使网格在曲线短于网格时永远不会被截断?(见下面的截图)

曲线比网格长 曲线比网格短,但网格不会被截断

谢谢!

3d 顶点着色器 godot-shader-language

评论

1赞 Rabbid76 11/18/2023
Blender 的“曲线”修改器可能使用 Morphing
0赞 reptofrog 11/21/2023
我已经解决了第一个问题。(奇怪的扭曲)我需要将旗帜添加到制服上。repeat_disablesampler2d

答:

1赞 Biggles 11/18/2023 #1

在我看来,示例视频在网格的底部使用了一些“特殊情况”逻辑,在弯曲外侧“拉伸”的一侧添加顶点,并且仅将“压缩”侧的顶点“夹紧”到一定角度,之后允许它们在底部下方“变负”(尽管请注意,在极端角度下,底部的那一侧有一点曲率的网格)

我猜 Blender 的曲线修改器在那里添加额外的顶点没有问题,尽管顶点着色器可能会?

对于第二个问题,这难道不就是一个简单的按比例缩放的情况吗?我想你需要在着色器之外进行计算并传入它......curve_position.ymesh_length / curve_lengthmesh_length

评论

0赞 reptofrog 11/18/2023
我不确定是否有任何特殊逻辑 - 没有添加新的顶点。(我检查过)至于第二个问题,谢谢你的提示,我会尝试一下。