float pts[N][4]={{x1,y1,z1,v1},{x2,y2,z2,v2},...,{xN,yN,zN,vN}};
//in viewsight(0,0)-(w,h);
//N==w*h
//if pts[n][3]==0 then pts[n] is invalid
如何计算每个有效点的法向量?
pts是点云数据中的点,在(w,h)大小的视景中可见;
像这样的:
p11,p12,p13...p1w,
p21,p22,p23...p2w,
...
...
ph1,ph2,ph3...phw,
每一个点都是由它们的邻居联合起来的,并共同生成一个曲面给我们。
点一行一列排列紧密。我们的任务是找到一种方法,尽可能精确地计算出朝向我们视线的每个点的法向量。
我正在尝试实时地做这件事,因为pts是实时生成的。例如,一次计数1024x1024个点。以前有人发表过决议吗?
最佳答案
通常,曲面上顶点的法线计算为相邻多边形的法线向量的平均值。见:http://www.opengl-redbook.com/appendices/AppH.pdf
在这种情况下,对于具有以下邻居的顶点p55:
p44 p45 p46
p54 p55 p56
p64 p65 p66
你可以找到每个三角形的法线,
n1 = (p55 - p44) x (p55 - p45)
n2 = (p55 - p45) x (p55 - p46)
...
确保保持向量的方向,以便所有法线指向同一方向(朝向查看器)。从那里你只需要规范化所有的向量,然后取它们的平均值。