【发布时间】:2016-01-31 09:18:56
【问题描述】:
所以我正在尝试使用行进立方体算法生成地形。此时我正在实现漫反射照明(片段着色器)。我计算了每个顶点的法线并得到了这个: 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);
}
更新:vcs
【问题讨论】:
-
是不是故意在循环中不使用
t? -
@4386427 是的,我正在使用宏,抱歉我没有发布它
#define triangle all_triangles[t] -
get_normal()和add_normal(...)的作用是什么?能否提供这些方法的代码。 -
@GuillaumeGris:
get_normal()返回顶点的法线 (return this->normal;),add_normal(QVector3D n)这样做:this->normal += n; -
您是否在算法之前将法线初始化为零?
标签: c++ qt opengl lighting marching-cubes