我正在尝试使用行进立方体算法渲染带有Gouraud着色的3D模型(来自volvis.org)。到目前为止,我有每个顶点的法线:
GetNormalForVertex(vertex &b, vertex &a, vertex &c) {
u.X = a.X - b.X;
u.Y = a.Y - b.Y;
u.Z = a.Z - b.Z;
v.X = c.X - b.X;
v.Y = c.Y - b.Y;
v.Z = c.Z - b.Z;
return Cross(u,v);
}
渲染时我可以看到漂亮的平面阴影。 现在,据我所知,我需要插入这些顶点法线以在交叉点找到法线以获得Gouraud阴影。我怎么能插入顶点法线?
答案 0 :(得分:10)
首先,您不是计算顶点法线。您正在计算 face normals 。这是计算顶点法线的过程中的第1步。
下一步不是插值任何东西。你所做的是计算附着在顶点上的每个面的(非标准化)面法线。然后将它们全部加在一起并将结果标准化。这是顶点法线。
如何确定哪些面附着到顶点是另一回事。在您的情况下,因为您通过行进立方体来构建此数据,所以从相邻立方体生成或检索三角形不应该太难。但是,如果您通过生成步骤并且只有一袋三角形,那么您将需要适当的网状拓扑数据结构。 Winged-edge或Quad-edge都是不错的选择。
答案 1 :(得分:5)
什么是a,b和c?
如果它们是三角形的顶点,则计算三角形的法线,而不是任何特定顶点。在这种情况下的假设是整个三角形是平坦的。这称为平面着色。
另一方面,如果你希望在三角形内部插入曲面法线(用于 Gouraud着色),那么你需要在三个不同的法线上三个以开头的顶点。这有点不那么琐碎,但仍然很容易。一种方法是平均共享顶点的所有三角形的法线,以获得该顶点处的法线。这显然需要连接信息(或者你需要以某种方式提取它)。
一旦你有三个不同的法线(比如na,nb,nc),那么任何内点的法线都可以通过重心坐标计算。设顶点为va,vb,vc,内点的重心坐标为α和β。然后,内部点v及其法线n由下式给出:
v = α*va + β*vb + (1 - α - β)*vc
n = α*na + β*nb + (1 - α - β)*nc
此插值法线(n)应用于Gouraud着色。