2

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

图片的左侧显示法线(每个顶点和三角形)和线框,右侧是来自相同相机角度的照明景观。

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

我这样计算法线:

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

    }

更新:vcs

位桶源

4

3 回答 3

2

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

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

通用 MC: 在此处输入图像描述

最简单的优化: 在此处输入图像描述

SnapMC 类似:

在此处输入图像描述

于 2016-03-29T09:36:54.437 回答
1

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

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

另请分享您的着色代码。

于 2016-01-31T09:47:52.603 回答
0

一些事情要尝试:

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

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

(3) 只是模糊它。对于每个顶点,按边添加所有相邻的法线,然后平均。

我想你想要(2)。尤其是对于地形。

于 2016-03-29T09:57:35.490 回答