将2D生成网格投影到3D均匀网格时的深度缺失问题求助
问题描述
我有如下2D图案化网格:
同时我有一个由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映射的边界计算错误,导致插值结果丢失了曲面的起伏。
具体修正方向
保留并利用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);修正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);检查三次插值函数的完整性
确认cubic_surface_set_it4和cubic_surface_get_it4对3D点的XYZ三个轴都进行了插值,而非仅处理XY平面坐标。关联Voronoi拓扑与曲面深度
如果Voronoi是纯2D无Z值的,可根据单元格的面积、距离中心的距离等拓扑特征,动态调整插值点的Z值,实现图案与曲面起伏的结合。
内容的提问来源于stack exchange,提问作者Andre Ahmed
相关产品推荐
相关产品推荐

