Prosedürel Geometri Üretimi


10

Son zamanlarda OS X için SceneKit'e bakıyordum ve geometrik şekiller oluşturmak için çeşitli fabrika yöntemleri olduğunu fark ettim:

Kutu, Kapsül, Koni, Silindir, Düzlem, Piramit, Küre, Torus ve Tüp.

Oluşturucuma böyle ilkel şekiller eklemekle ilgileniyorum, ancak prosedürel üretim anlayışını toplayabileceğim makul bir kaynak bulmakta zorlanıyorum. Teoriyi detaylandıran ancak onu desteklemek için uygun kaynak kodundan yoksun olan birkaç kaynak var.

SceneKit, bu şekillerin niteliklerini dinamik olarak ayarlamaya izin veren fabrika yöntemleri sağlar. Kutunun durumunda, her yüzün bölünmesi gereken genişlik, yükseklik ve derinlik segmentlerinin sayısı için tamsayı değerler sağlayabilirsiniz.

Teoriyi anlıyorum ama istenen etkiyi elde etmek için geometri yüzlerini alt bölümlere ayırmaya başlama bilgisinden yoksunum.

Her bir şeklin köşe noktalarını basit döngülerde oluşturmak oldukça kolaydır. Beni en çok etkileyen şey, yüzlerin nasıl oluşturulacağını bilmek, daha doğrusu her yüz için uygun doku koordinatlarını bilmek. Normaller yüz başına hesaplanabilir, bu yüzden istediğimi başarabileceğimden oldukça eminim, sadece nereden başlayacağımı biliyor.

Prosedür geometrisi hakkında herhangi bir ayrıntı verebilir mi? Gerçekten ihtiyacım olan bazı bilgileri almak için bazı kaynak kodudur. Öğreticiler için yüksek ve düşük aradım ama şimdiye kadar sadece birkaç makul site veya blog ile geldim. İyi kitaplar, eğiticiler, bloglar veya araştırma yazıları takdir edilecektir.

Yorumlara göre düzenleme

Temel şekiller için nasıl köşe oluşturacağımı bildiğimi açıklığa kavuşturmalıydım, bunların çoğu muhtemelen basit döngülerle elde edilebilir. Ne anlamadım oluşturulan köşeleri diziden yüzler oluşturmak nasıl. Görünüşte sıralanmamış bir köşe dizisinden üçgen şerit veya üçgenler nasıl oluştururum?

Bu noktayı aştığımda, her yüzden normaller yaratabileceğimi varsayıyorum. Buna henüz girmemiş olsam da, bununla ilgili birçok referans gördüm ve uygulamanın yeterince kolay olacağından eminim.

İdeal olarak, SceneKit'in sağladığı gibi belirli bir özellik kümesinden geometri oluşturabilmek istiyorum. SceneKit bunu yaptı ve Blender ve Maya vb.'de benzer şeyler yapabileceğiniz göz önüne alındığında, imkansızı uygulamaya çalışmıyorum.

Son olarak dokular uygulanacaktır. Yine, bu benim uyguladığım ama okuduğum ve gereksinimlerin farkında olduğum bir şey değil.

Buradaki asıl sorun, neyi başarmak istediğimi biliyorum, ancak yukarıda belirtilen ilkellere nasıl uygulanacağını çözmek için uğraşıyorum. Kaynak kodu ile bilginin bir kısmını bulabileceğimden umutluydum ama şimdiye kadar uygun bir şeyle karşılaşmadım.


Probleminizin geometriyi alt bölümlere ayırdığını söylüyorsunuz, ama sonra köşeleri yapmak kolay olmalı ve sonra probleminizin yüzleri nasıl oluşturacağınızı söylüyorsunuz ve sonra probleminizin doku eşlemesi olduğunu söylüyorsunuz. Senin problemin ne? Tepe konumlarını oluşturabilir misiniz? Kenarları ve yüzleri oluşturabilir misiniz? Ayrıca, doku koordinatları dokunuza ve onunla ne elde etmek istediğinize bağlıdır, bu nedenle doku koordinatları ile ilgili soru iyi değildir. Son olarak, ilkel üretim basitçe geometri ile ilgilidir ve insanlar buna rağmen nadiren "prosedürel geometri" derler.
jrsala

Küp veya düzlem gibi basit şekiller için geometriyi nasıl oluşturacağımı, anlamadığım yüzlerin yaratıldığını anlıyorum. Bir grup köşeden yüzleri nasıl oluştururum? Temel bir anlayışa sahip olmama rağmen noktaları daha karmaşık şekiller için çizmek sorunun bir parçasıdır. Hepsini bir üçgen şeride veya üçgenlere yapıştırmak, kafamı sarmak için uğraştığım şey.
CaptainRedmuff

Tamam, detaylar için teşekkürler. Açıklığa kavuşturmak için sorunuzu düzenlemek isteyebilirsiniz. Yanıtlama zamanı!
jrsala

Yanıtlar:


11

Bir kutu, bir koni ve alıntıladığınız tüm ilkel bir şeklin kenarlarını ve yüzlerini oluşturmanın yolu, köşeleri oluştururken aynı zamanda onları oluşturmaktır. Aslında, köşeleri mantıklı bir şekilde, kenarları ve yüzleri buna göre hesaplamayı kolaylaştıracak şekilde oluşturmalısınız.

Uzayda bir dizi noktayı girdi olarak alan ve üzerinde " nokta seti üçgenleme " olarak adlandırılan algoritmalar vardır , ancak nokta seti üçgenleme problemi NP-tamamlanmıştır , böylece kenarları ve yüzleri yapmak daha hızlıdır sadece köşeleri hesaplamak ve bir algoritmanın işi yapmasına izin vermektense. Sadece bu çözümün var olduğunu bilmenize izin verin.

Bu verimsiz çözümün yanı sıra, aşağıdaki örneklerde olduğu gibi ilkelleri yalnızca her durum için ele alabileceğinizi düşünüyorum.

Kafes köşeler ve yüzlerdir . Ağınız yüz oluşturmayan çizgiler içermediği sürece kenarlar yüzlerin açıklamasında bulunur. Köşeler, 3 kayan nokta koordinatının tuplesidir. Kenarlar sadece köşelere yapılan referans çiftleridir, ancak yine de kesinlikle onlara ihtiyacınız olmayacaktır. Örneğin köşelerinizin dizine alınmış bir dizide olduğunu varsayalım. Peki kenarlarınız o dizinin endeks çiftleri olabilir. Yüzler, dizinlenmiş dizi durumundaki köşelere veya dizinlerin üçlülerine yapılan başvuruların üçlüleridir .

Bu ilkel şekillerin her birini oluşturan köşeleri, kenarları ve yüzleri sayabilmelisiniz, çünkü bunları sayabilmeniz, nesneler ile bunları oluşturacağınız yöntemi tasarlamanıza, döngüler ve göreceğimiz diğer araçlar.

koni

N + 2 köşeli, 3n kenarlı ve 2n yüzlü bir koni için :

  1. İki ayrı köşe yapın.
  2. İlk iki köşe arasındaki bölüme dik bir düzlem içinde olan köşelerden birinin (temel tepe noktası) etrafında bir daire yapın. Umarım trigonometri kullanarak bir daire oluşturabilirsiniz, değil mi? Bu zaten koninin tüm köşeleri. Bu aynı zamanda tüm kenarların üçte biri ( dairede n kenar ve toplamda 3n ) var.
  3. Temel tepe noktasından daire içindeki n köşeye kadar n kenar yapın . Bunu yaparken yüzlerin yarısını (yani n yüz) yapabilirsiniz.
  4. Uç tepe noktasından daire içindeki n köşeye kadar n kenar yapın . Yüzlerin diğer yarısını (bu n yüz) yapabilirsiniz.

1) İki köşe 2) ve bir daire
3) ve yüzler
4) ve yüzler
Sonuç:sonuç

Daireyi oluşturan döngüyü çalıştırırken kenarları ve yüzleri de oluşturabilirsiniz. Aynı karmaşıklık, aynı şey. Çember üzerinde bir tepe yapın, köşeler dizinize kaydedin, istediğiniz kenarı (endeks çifti) bir dizi indeks çiftine ekleyin ve son olarak karşılık gelen yüzü dizin üçlüsü dizinize ekleyin . Bir sonraki tepe noktasına geçin.

Silindir ve tüp: aynı işi iki kez yapmamak ve dörtlü

Yine, tüp için, silindirin üst veya alt diskinin merkezi olacak bir tepe noktası ve bir daire ile başlar:

  1. Bir tepe noktası yapın.
  2. Köşenin etrafında bir daire yapın. Dairenin birbirini izleyen köşeleri arasına ve orta tepe noktası ile her daire tepe noktası arasına kenarlar ekleyin (kenarlar istiyorsanız). Orta tepe noktasından yapılan köşelerin her üçlüsü ile daire üzerinde birbirini izleyen iki köşe arasına yüzler ekleyin.
  3. Tüm bunları çoğaltın, kopyayı yeni yaptığınız tabana dikey yönde, istenen silindirin uzunluğuna çevirin.
  4. Üst ve alt kısımları birleştirin.

Üst ve alt arasında bağlantı kurmak için, birbirine bakan köşe çiftleri çiftleri arasında dörtlüler yapmanız gerekir. Öyleyse bir düşünün ve neden kendinizi dört köşeden iki üçgen yüz yapan bir işlev yapmıyorsunuz?

Bitti. Bu kez, aynı yapının (daire + merkez) bir kısayol almak için bir silindirde iki kez göründüğünü fark ediyoruz. Gerekli olan koninin aksine, tüm köşeleri, kenarları ve yüzleri elle yapmak zorunda değiliz .

Bu tembellik prensibini takiben, dairenin dörtte birini yapmak ve çoğaltmak ve tekrar, çok basit dönüşümlerle (herhangi bir daire için de koni ile de geçerlidir) tam bir daire yapmak da mümkündür, ancak bu o kadar karmaşık bir şekil değil.

Yapımlarını kolaylaştırmak için her zaman yaptığınız nesnelerin geometrik özelliklerini kullanmalısınız . Yani simetrileri ve değişmezleri .

Bir silindir için, sadece temel tepe noktasını yapmayın, sadece daireyi yapın, çoğaltın, kopyayı çevirin, dörtlü yapın, bitti.

Küre ve kapsül: karmaşıklık katmak, yine de iki kez aynı iş değil

Bir kapsül oluşturmak için, bir UV küre oluşturmak, iki yarıya bölmek, ilk yarıyı çevirmek ve daha sonra ikisini kapsüllerin kenarlarıyla bağlamak istiyoruz.

Yine kürenin sadece bir sekizinci (!!) yapmak, daha sonra çoğaltmak ve tersine çevirmek ve daha sonra 4 adımda tam bir küre elde etmek için başka bir eksen, vb. Hariç sonucu çoğaltmak ve tersine çevirmek mümkündür (sekizinci oluşturmak) , çoğaltın ve üç kez ters çevirin). Belki aşırıya kaçmak, ama daire durumunda olduğundan daha az.

Basit bir UV küresi:
küre

Aslında bunun sadece yarısını yapıyoruz (örneğin), yarısını çoğaltıyoruz, kopyayı baş aşağı çeviriyoruz ve kapsülün uzunluğuna çeviriyoruz:
yarıları

Üst ve alt yarıyı bağlarız:
kapsül

Gerçek (biraz) sıkı çalışma, bir küre yapmaya giden trigonometreden gelir. Bir UV küresine ait tüm köşelerin kümesi, formun tüm noktalarının kümesi olarak tanımlanabilir:

makas

burada R , kürenin yarıçapıdır ve belirli bir pozitif çift tam sayı N için, sabit

θ = × π / N ,

k ve n , k 0 ila 2N-1 arasında değişen ve n , -N / 2 ila + N / 2 arasında değişen tamsayılardır .

Bir yarım küre veya bir küre bir sekizinci yapmak için, k ve n tarafından alınan değer kümesini kısıtlamanız gerekir .

Eğer k tam sayılar değil, gerçek sayılar olsaydı, sadece yüzeyindeki köşeleri değil, bütün bir küreyi elde edersiniz. Burada yaptığımız ilkelin yüzey denklemini rasterleştirmektir .

Korkunç torus : gördüklerimizden sonra kolay!

Yine, daha fazla trigonometri, daha fazla köşe noktası, daha fazla dörtlü, daha fazla simetri, daha fazla değişmez ... daha fazla geometri! Bir torusun yüzeyinin denklemini bulun, düzgün bir şekilde "rasterleştirin", torusun (açık) simetrilerini kullanarak problemi basitleştirin ve son olarak, az önce tanımladığınız köşe kümeleri arasında dolaşın ve kenarları ve yüzleri istediğiniz gibi yapın Git!

Görmek? Tamamen anlaşılır.


Vay. Bu kadar ayrıntılı bir yanıt ve çok sayıda örnek için teşekkür ederiz. Bir kürenin yarısını üretme ve simetrik unsurları yansıtma fikrini düşünmemiştim. Bunu kolayca anlayabileceğim ve umarım kolaylıkla uygulayabileceğim şekilde yazmaya zaman ayırdığınız için çok teşekkürler.
CaptainRedmuff

Rica ederim! Ben hiçbir kod olsa üzgünüm.
jrsala

Metodların ana hatları, gerçekten ihtiyacım olan şeydi. En azından oradan bir eylem planı yapmaya başlayabilirim:] Pahlı kenarlı Kutular / Küpler hakkında herhangi bir bilginiz olduğunu düşünmüyorum? docs.autodesk.com/3DSMAX/15/ENU/3ds-Max-Help/images/…
CaptainRedmuff

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.