所以我正在尝试使用行进立方体算法生成地形。此时我正在实现漫射照明(片段着色器)。我计算了每个顶点的法线并得到了这个: result
图片的左侧显示法线(对于每个顶点和三角形)和线框,右侧是从相同相机角度拍摄的光照景观。
所以,我很好奇,我做错了什么?
我这样计算法线:
for (int t = 0; t < all_triangles.size(); t++) {
Vertex v0 = all_vertices[triangle.get_vertex(0)];
Vertex v1 = all_vertices[triangle.get_vertex(1)];
Vertex v2 = all_vertices[triangle.get_vertex(2)];
QVector3D edge1 = v1 - v0;
QVector3D edge2 = v2 - v0;
QVector3D normal = QVector3D::crossProduct(edge1, edge2);
// triangle.set_normal(normal.normalized());
for (int v = 0; v < 3; v++) {
all_vertices[triangle.get_vertex(v)].add_normal(normal.normalized());
}
}
for (int v = 0; v < all_vertices.size(); v++) {
auto normal = all_vertices[v].get_normal();
normal.normalize();
all_vertices[v].set_normal(normal);
}
更新:风投
最佳答案
这对于行进立方体来说是正常的。这是算法的一个已知问题,具有一些技术名称,如冗余三角形。如果您需要较少的三角形并且不介意为每个顶点添加一条比较等值线,则有一个非常简单的调整,解决方法是将 iso 值捕捉到立方体的角上,如果它们离它们的距离超过 95%。 MC 优化非常酷,最好是八叉树感知使用的立方体,并根据该区域表面的复杂性或平坦度调整立方体的大小。关于这个主题有很多很棒的论文。
这是一个快速修复的演示,如果边缘与拐角的相交接近度低于 5% 或超过 95%,则可以将值捕捉到拐角,可调,如果需要可以尝试 90%。
SnapMC 类似:
关于c++ - 行进立方体,非常小的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112181/