You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将2D生成网格投影到3D均匀网格时的深度缺失问题求助

问题描述

我有如下2D图案化网格:
2D图案化网格

同时我有一个由3D均匀点构成的曲面网格:
3D曲面网格

尝试步骤

  • 该图案化网格由0到1的UV坐标映射得到对应数值
  • 使用**三次插值(cubic interpolation)**获取曲面网格上的点
  • 利用图案化网格的索引,得到由步骤2插值点构成的结果网格

遇到的问题

由于使用了图案化网格的2D坐标,得到的曲面网格被扁平化,缺少所需的深度,效果如下:
扁平化的结果网格

而预期的结果网格应如下所示:
预期的结果网格

实现代码

std::vector<glm::vec3> voronoi_project_to_3D(std::vector<glm::vec3> &voronoi_pnts)
{
    int i, iu, iv;
    float u, v;
    vec2 p0{}, p1{};
    vec3 p;
    vec3 c[4 * 4];
    std::vector < glm::vec3> points_3d;
    // compute BBOX of 2D voronoi
    for (i = 0; i < voronoi_pnts.size(); i++)
    {
        p = voronoi_pnts[i];
        if (!i) { p0 = p; p1 = p; }
        if (p0.x > p.x) p0.x = p.x;
        if (p1.x < p.x) p1.x = p.x;
        if (p0.y > p.y) p0.y = p.y;
        if (p1.y < p.y) p1.y = p.y;
    }
    // convert ot 3D
    p1.x = float(mesh_nu-35) / (p1.x - p0.x);
    p1.y = float(mesh_nv-35) / (p1.y - p0.y);
    for (i = 0; i < voronoi_pnts.size(); i++)
    {
        p = voronoi_pnts[i];
        u = (p.x - p0.x) * p1.x;
        v = (p.y - p0.y) * p1.y;
        iu = floor(u); u -= iu;
        iv = floor(v); v -= iv;
        cubic_surface_set_it4(c,
            mesh_pnt + iu + ((iv + 0) * mesh_nu),
            mesh_pnt + iu + ((iv + 1) * mesh_nu),
            mesh_pnt + iu + ((iv + 2) * mesh_nu),
            mesh_pnt + iu + ((iv + 3) * mesh_nu));
        points_3d.push_back(cubic_surface_get_it4(c, u, v));
    }
    return points_3d;
}

问题分析与修正方案

核心问题

当前代码的问题在于:直接将2D Voronoi点的XY坐标当作UV坐标映射到3D曲面,但没有关联Voronoi图案的深度特征——要么丢弃了Voronoi点本身的Z值信息,要么UV映射的边界计算错误,导致插值结果丢失了曲面的起伏。

具体修正方向

  1. 保留并利用Voronoi的深度信息
    如果Voronoi点的Z值对应图案的深度(比如灰度值转深度),需要将该值叠加到插值得到的3D点上,调整深度幅度:

    float depth_scale = 0.5f; // 根据需求调整深度强度
    vec3 interpolated_point = cubic_surface_get_it4(c, u, v);
    // 假设voronoi_pnts[i].z是归一化后的深度值
    interpolated_point.z += voronoi_pnts[i].z * depth_scale;
    points_3d.push_back(interpolated_point);
    
  2. 修正UV映射的边界计算
    硬编码的mesh_nu-35和mesh_nv-35会导致UV范围偏移,应直接映射到3D曲面的有效UV区间:

    p1.x = float(mesh_nu - 1) / (p1.x - p0.x);
    p1.y = float(mesh_nv - 1) / (p1.y - p0.y);
    
  3. 检查三次插值函数的完整性
    确认cubic_surface_set_it4和cubic_surface_get_it4对3D点的XYZ三个轴都进行了插值,而非仅处理XY平面坐标。

  4. 关联Voronoi拓扑与曲面深度
    如果Voronoi是纯2D无Z值的,可根据单元格的面积、距离中心的距离等拓扑特征,动态调整插值点的Z值,实现图案与曲面起伏的结合。

内容的提问来源于stack exchange,提问作者Andre Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:32:21