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()
するとコストがかかると思いますが、それを改善するには、角度で重み付けされた法線の代わりを見つける必要があります。