c++ - 行进立方体,非常小的三角形

标签 c++ qt opengl lighting marching-cubes

所以我正在尝试使用行进立方体算法生成地形。此时我正在实现漫射照明(片段着色器)。我计算了每个顶点的法线并得到了这个: 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);

    }

更新:风投

bitbucket source

最佳答案

这对于行进立方体来说是正常的。这是算法的一个已知问题,具有一些技术名称,如冗余三角形。如果您需要较少的三角形并且不介意为每个顶点添加一条比较等值线,则有一个非常简单的调整,解决方法是将 iso 值捕捉到立方体的角上,如果它们离它们的距离超过 95%。 MC 优化非常酷,最好是八叉树感知使用的立方体,并根据该区域表面的复杂性或平坦度调整立方体的大小。关于这个主题有很多很棒的论文。

这是一个快速修复的演示,如果边缘与拐角的相交接近度低于 5% 或超过 95%,则可以将值捕捉到拐角,可调,如果需要可以尝试 90%。

通用 MC: enter image description here

最简单的优化: enter image description here

SnapMC 类似:

enter image description here

关于c++ - 行进立方体,非常小的三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112181/

相关文章:

c++ - clang-6 和 -std=c++17——无法调用 bind(2)

项目中的 C++ 全局常量

c++ - 静态条件中的编译器警告

C++ SFINAE 部分特化

unit-testing - QTestLib 中的单元测试 - 运行单个测试/类中的测试/所有测试

performance - 优化 GPU 到 CPU 的数据传输

java - 如何删除颜色(使其透明)从 OpenGL 中的像素获取颜色

c++ - GLSL 中曲面 segmentation 着色器的链接错误

c++ - Qt - 混合 Qt 和 std::C++ 类型

qt - 如何去掉QScrollbar滚动按钮?