7

我正在努力重现一个名为“patchnormal”的 MATLAB 算法,它首先计算所有面的法线向量,然后根据面的角度加权的面法线计算顶点法线。(见下图)

在面向此类数学用途的 WPF C# 中似乎没有可用于 3D 网格的免费库。或者有吗?

所以问题是: 如何为我的所有顶点计算这个(红色)向量?是否可以对其进行优化以用于实时仿真?

PatchNormal 插图图像
(来源:hostingpics.net

4

1 回答 1

2

您可以计算两条边之间的角度,如下所示:

given:  edge vectors E and F for a given face of your vertex,

E_normalized = normalize(E)
F_normalized = normalize(F)
cross_normal = cross(E_normalized, F_normalized)
sin_theta = length( cross_normal )
cos_theta = dot(E_normalized, F_normalized)

results:
    face normal = normalize(cross_normal)
    face angle theta = atan2(sin_theta, cos_theta)

然后,相应地加权法线:

total_vector = vec(0,0,0)
for(each face adjacent to a particular vertex):
    [compute normal and theta as above]
    total_vector += normal * theta
return normalize(total_vector)

为了实时优化,我会首先分析一下到底是什么让事情变慢了。我猜想atan2()每个顶点计算多次可能会很昂贵,但改进它确实需要找到一些替代角度加权法线的方法。

于 2012-09-17T19:42:20.617 回答