行军的立方体,非常小的三角形

所以我试图用行进立方体算法来生成地形。 在这一点上,我正在实现散射照明(片段着色器)。 我计算了每个顶点的法线并得到了这个结果

图片的左侧显示法线(对于每个顶点和三角形)和线框,右侧是来自相同摄像机角度的点亮风景。

所以,我很好奇,我做错了什么?

我这样计算法线:

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

    }

upd:vcs

bitbucket源码


你的数学是正确的。 你的法线看起来很好,但很难100%理解你的照片。

调试此类问题的常用方法是: - 平面着色(无法平滑) - 使用三角形/顶点法线作为颜色来显示法线

也请分享您的底纹代码。


这是正常的行军立方体。 这是一个知识问题的algorythm与一些技术名称像冗余三角形。 有一个非常简单的调整,如果你需要更少的三角形,并且不介意为每个顶点添加一条比较等值线,修正是将iso值捕捉到立方体的角落,如果它们距离它们超过95%。 MC优化非常酷,最好的方法是使用立方体进行八叉树检测,并根据该区域表面的复杂性或平面度调整立方体大小。 关于这个话题有很棒的论文。

这里是一个快速修复的例子,如果边缘与拐角的交点接近5%或95%以上,可调整,可以尝试90%,如果你想要的话,只需将值捕捉到拐角即可。

通用MC: 在这里输入图像描述

最简单的优化: 在这里输入图像描述

SnapMC类似:

在这里输入图像描述


有些事情要尝试:

(1)衡量你的法线。 add_normal(normal.normalized()* weight),其中weight可以是很多东西,比如三角形的面积,或者内角

(2)从你的领域计算一个正常值。 你得到一个f(x,y,z)= 0的曲面。 评估到f(x-eps,y,z)-f(x + eps,y,z)以得到正常的x,对于y,z也是如此。

(3)模糊它。 对于每个顶点按边添加所有相邻的法线,以及平均值。

我想你想要(2)。 特别是对于地形。

链接地址: http://www.djcxy.com/p/37247.html

上一篇: marching cubes, very small triangles

下一篇: Marching Cubes Performance (2d)