Programlı olarak tepe normalleri oluşturma


11

Kinect face api ile çalışıyorum, yüz görüntüsünü yapmak için oluşturulacak üçgenler için bir dizi köşe ve indeks sağlar.

Köşe noktalarının ve dizideki sıralarının yanı sıra kinect tarafından verilen endeksler her zaman sabittir.

Bununla birlikte, api UV verisi ve tepe normalleri hakkında hiçbir bilgi vermez.

Uygulama, 3d uzaydaki konumları yüz hareketine göre değiştiği için kinect tarafından verilen tepe sırasını korumamı gerektiriyor, böylece bir 3d düzenleme yazılımında uv ve normaller üretmek söz konusu değil.

Aynı düzlemde çok az köşe olduğu için tepe konumlarını bir 2D düzlem üzerine yansıtarak UV üretmeyi başardım.

Bununla birlikte, kafes için köşe normalleri nasıl oluşturulacağını bilmiyorum, tepe normal olmadan, yüz ağı, tepe konumları doğru olduğundan siluet görünür olsa da, yüz ağı özelliklerinin derinliği olmadan çekim yapar.

Tepe normallerinin olmaması nedeniyle aydınlatmanın üzerinde düzgün bir şekilde çalışmadığını ve bu nedenle şu anda soluk özelliksiz ağın göründüğünü anlıyorum.

öyleyse sahip olduğum tek şey köşe pozisyonu ve üçgen yapmak için köşe indeksi olduğunda köşe normalleri nasıl oluştururum?


n = (v1 - v0) x (v2 - v0); burada v0, v1 ve v2, söz konusu (üçgen) yüzün köşe noktalarıdır. Sipariş önemlidir. Gerçekten ihtiyacınız varsa normalleştirin. (ve xçapraz
çarpımdır

Yanıtlar:


14

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×vuvuv||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:


Bunu en kısa zamanda yapacağım ve sonuçlarla geri döneceğim
Allahjane

Çalıştı
Tonn


@Allahjane: iyi çalıştığını duyduğuma sevindim. :)
Julien Guertault
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.