所以我尝试使用行进立方体算法生成地形。此时我实现了漫反射光照(片段着色器)。我计算了每个顶点的法线并得到了这个: 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);
}
upd:vcs
答案 0 :(得分:1)
你的数学是正确的。 你的法线看起来很好,但很难100%理解你的图片。
解决此类问题的常用方法是: - 平面阴影(无正常平滑) - 使用三角形/顶点法线作为颜色来显示法线
另请分享您的着色代码。
答案 1 :(得分:1)
行进立方体的正常情况。这是一个知道问题的algorythm,有一些技术名称,如冗余三角形。有一个非常简单的调整,如果你需要更少的三角形,不介意为每个顶点添加一个比较等于线,修复是将iso值捕捉到立方体的角上,如果它们离它们的距离超过95%。 MC优化是非常酷的,最佳的是八角形感应使用的立方体并相对于该区域的表面的复杂性或平坦度调整立方体的大小。有关于这个主题的很棒的论文。
这是一个快速修复的演示,只是通过将角度捕捉到角落,如果边角交点接近角落低于5%或超过95%,可调,如果你想要可以尝试90%。
SnapMC类似:
答案 2 :(得分: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)。特别是对于地形。