Tepe noktalarından normalin hesaplanması, vektör çapraz ürünü kullanılarak oldukça basittir.
Çapraz ürün iki vektörün ve (not , ya da bazen bir vektör diktir) ve , uzunluğu , ile ve arasındaki açı . Vektörün yönü çarpımın sırasına bağlı olacaktır: , (düzleme dik iki yön) tersidir .uvu×vu∧vuv||u×v||=||u||⋅||v||sin(θ)θuvu×vv×u
Çapraz ürüne aşina değilseniz, sizi bu konuda okumaya ve rahatlamaya davet ediyorum. Normaller daha sonra basit görünecektir.
Düz gölgeleme normalleri
üçgeniniz varsa , , üçgene dik ve uzunluğu ile orantılı bir vektördür. Normal, üçgenin düzlemine dik olan birim vektör olduğundan, normal olanı aşağıdakilerle alabilirsiniz:ABCAB×AC
N=AB×AC||AB×AC||
Kod olarak, bu n = normalize(cross(b-a, c-a))örneğin gibi görünecektir . Bunu tüm yüzlerinize uygulayın ve normalde yüzünüze sahip olun.
For each triangle ABC
n := normalize(cross(B-A, C-A))
A.n := n
B.n := n
C.n := n
Bunun köşelerin üçgenler arasında paylaşılmadığını varsaydığını unutmayın. Kinect API'sine aşina değilim; paylaşılmaları oldukça olasıdır, bu durumda bunları çoğaltmanız veya bir sonraki çözüme geçmeniz gerekir:
Pürüzsüz gölgeleme normalleri
Yukarıdaki gibi hesaplanan normallerle aydınlatıldıktan sonra üçgen kenarların belirgin olduğunu göreceksiniz. Bu istenmiyorsa, aynı tepe noktasını paylaşan tüm yüzleri dikkate alarak pürüzsüz normalleri hesaplayabilirsiniz.
Fikir, eğer aynı tepe noktası üç , ve üçgeni tarafından paylaşılıyorsa , normal , ve ortalaması . Ayrıca, eğer büyük bir üçgen ve küçücük biridir, muhtemelen istiyorum diğer faktörlerden etkilenir edilecek tarafından daha .T1T2T3NN1N2N3T1T2NN1N2
Çapraz ürünün alanla nasıl orantılı olduğunu hatırlıyor musunuz? Çapraz ürünleri toplarsanız, toplamı normalleştirirseniz, tam olarak istediğimiz ağırlıklı toplamı yapar. Böylece algoritma şöyle olur:
For each vertex
vertex.n := (0, 0, 0)
For each triangle ABC
// compute the cross product and add it to each vertex
p := cross(B-A, C-A)
A.n += p
B.n += p
C.n += p
For each vertex
vertex.n := normalize(vertex.n)
Bu teknik Iñigo Quilez tarafından bu makalede daha ayrıntılı olarak açıklanmıştır: bir ağın akıllı normalizasyonu .
Normaller hakkında daha fazla bilgi için ayrıca bkz:
xçapraz