Bir cilt gölgelendirici için örgü eğriliği tahminine ihtiyaç duyduğumda, yerleştiğim algoritma şuydu:
İlk olarak, ağdaki her kenar için skaler bir eğrilik hesapladım. Kenarın ve normalleri eğriliğini şu şekilde tahmin ettim:n 1 , n 2p1, p2n1, n2
eğrilik = ( n2-n1) ⋅ (p2-p1)|p2-p1|2
Bu, kenar boyunca yansıtılan normallerdeki farkı, kenar uzunluğunun bir kısmı olarak hesaplar. (Bu formülü nasıl bulduğum için aşağıya bakın.)
Sonra, her köşe için ona dokunan tüm kenarların eğriliklerine baktım. Benim durumumda, sadece "ortalama eğrilik" için skaler bir tahmin istedim, bu yüzden her köşede tüm kenar eğrilerinin mutlak değerlerinin geometrik ortalamasını aldım. Sizin durumunuz için, minimum ve maksimum eğrilikleri bulabilir ve bu kenarları ana eğrilik yönleri olarak alabilirsiniz (belki de normal tepe noktasıyla ortonormalize edebilirsiniz). Bu biraz kaba, ama yapmak istediğiniz şey için yeterince iyi bir sonuç verebilir.
Bu formülün motivasyonu, bir çevreye uygulandığında 2D'de neler olduğuna bakmaktır:
Bir yarıçap olduğunu varsayalım (bu yüzden eğriliği ) ve daire üzerinde normalleriyle iki . Dairenin merkezine göre noktaların konumları, bir dairenin veya kürenin normallerinin her zaman doğrudan merkezinden işaret ettiği özellik nedeniyle ve .1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2r1 / rn1, n2p1= r n1p2= r n2
Bu nedenle yarıçapıveya. Ancak genel olarak, tepe konumları dairenin merkezine göreli olmayacaktır. çıkararak bu :
| p 2 | / | n 2 | p 2 - p 1r = | p1| / | n1|| p2|/ | n2|
p2- p1reğrilik = 1r= r n2- r n1= r ( n2- n1)= | p2- p1|| n2- n1|= | n2- n1|| p2- p1|
Sonuç sadece daireler ve küreler için kesindir. Bununla birlikte, biraz daha "toleranslı" hale getirmek için genişletebilir ve keyfi 3B kafeslerde kullanabiliriz ve makul derecede iyi çalışıyor gibi görünüyor. Önce vektörünü kenar yönüne, formülü daha "hoşgörülü" hale . Bu, bu iki vektörün tam olarak paralel olmamasına izin verir (daire durumunda olduğu gibi); paralel olmayan herhangi bir bileşeni yansıtacağız. Bunu normalleştirilmiş kenar vektörü ile :
p 2 - p 1 eğriliğin2- n1p2- p1
eğrilik= ( n2- n1) ⋅ normalleştir ( p2- p1)| p2- p1|= ( n2- n1) ⋅ ( p2- p1) / | p2- p1|| p2- p1|= ( n2- n1) ⋅ ( p2- p1)| p2- p1|2
Et voilà, bu cevabın tepesinde ortaya çıkan formül var. Bu arada, imzalı projeksiyonu (nokta ürün) kullanmanın iyi bir yan yararı , formülün daha sonra imzalı bir eğrilik vermesidir: dışbükey için pozitif ve içbükey yüzeyler için negatif.
Kullanmayı hayal edebildiğim, ancak denemediğim başka bir yaklaşım , her tepe noktasında yüzeyin ikinci temel formunu tahmin etmek olacaktır . Bu, tepe noktasında teğet bir temel oluşturarak, ardından tüm komşu köşeleri bu teğet boşluğuna dönüştürerek ve en uygun 2FF matrisini bulmak için en az kareler kullanarak yapılabilir. O zaman ana eğrilik yönleri bu matrisin özvektörleri olacaktır. Bu, herhangi bir kenarı açıkça bu yönlere işaret etmeden komşu köşeler tarafından "ima edilen" eğrilik yönlerini bulmanıza izin verebileceği için ilginç görünmektedir, ancak diğer taraftan çok daha fazla kod, daha fazla hesaplama ve belki de daha az sayısal olarak sağlamdır.
Bu yaklaşımı benimseyen bir makale, "Eğrileri ve Üçgen Ağlarda Türevlerini Tahmin Etme" Rusinkiewicz'dir . Üçgen başına en uygun 2FF matrisini tahmin ederek, ardından köşe başına matrislerin ortalamasını hesaplayarak çalışır (pürüzsüz normallerin nasıl hesaplandığına benzer).