Oluşturulan bir şekil için normalleri hesaplamanın üç yolunu görüyorum.
Analitik normaller
Bazı durumlarda, normalleri üretmek için yüzey hakkında yeterli bilgiye sahip olabilirsiniz. Örneğin, bir küre üzerindeki herhangi bir noktanın normal değeri hesaplamak önemsizdir. Basitçe söylemek gerekirse, fonksiyonun türevini bildiğinizde, normali de bilirsiniz.
Durumunuz analitik normalleri kullanmanıza izin verecek kadar darsa, muhtemelen hassasiyet açısından en iyi sonucu verecektir. Yine de teknik çok iyi ölçeklenmiyor: Analitik normalleri kullanamayacağınız vakaları da ele almanız gerekiyorsa, genel durumu ele alan ve analitiği tamamen düşüren tekniği tutmak daha kolay olabilir.
Köşe normalleri
İki vektörün çapraz çarpımı ait oldukları düzleme dik bir vektör verir. Yani bir üçgenin normalini almak basittir:
vec3 computeNormal(vec3 a, vec3 b, vec3 c)
{
return normalize(crossProduct(b - a, c - a));
}
Ayrıca, yukarıdaki örnekte, çapraz ürünün uzunluğu, abc içindeki alanla orantılıdır . Böylece, birkaç üçgenle paylaşılan bir tepe noktasında düzeltilmiş normal, çapraz ürünlerin toplanması ve son adım olarak normalleştirilmesi, böylece her üçgenin alanı ile ağırlıklandırılmasıyla hesaplanabilir.
vec3 computeNormal(vertex a)
{
vec3 sum = vec3(0, 0, 0);
list<vertex> adjacentVertices = getAdjacentVertices(a);
for (int i = 1; i < adjacentVertices; ++i)
{
vec3 b = adjacentVertices[i - 1];
vec3 c = adjacentVertices[i];
sum += crossProduct(b - a, c - a);
}
if (norm(sum) == 0)
{
// Degenerate case
return sum;
}
return normalize(sum);
}
Dörtlülerle çalışıyorsanız, kullanabileceğiniz güzel bir hile vardır: bir dörtlü abcd için kullanın crossProduct(c - a, d - b)
ve dörtlü aslında bir üçgen olan güzel durumları ele alacaktır.
: Iñigo QUILEZ konu üzerine birkaç kısa makaleler yazdı zeki bir örgü normalleşmesini ve normal ve n alan poligonları taraflı .
Kısmi türevlerden normaller
Kısmi türevlerden fragman gölgesinde normaller hesaplanabilir. Arkasındaki matematik aynıdır, ancak bu süre ekran alanında yapılır. Angelo Pesce'nin bu makalesi tekniği açıklar: Normalsiz normaller .