OpenGL'de bir nesneyi nasıl bükebilirim?


11

Birinin silindir veya uçak gibi bir nesneyi OpenGL kullanarak bükmesinin bir yolu var mı?

Ben bir OpenGL acemi değilim (eğer önemli olsa bile, OpenGL ES 2.0 kullanıyorum, bu durumda matematik en önemli şeydir, bu yüzden bir şekilde sürümden bağımsızdır), temelleri anlıyorum: çeviri, döndürme, matris dönüşümleri, vb. Nesnelerinizin geometrisini gerçekten değiştirmenize izin veren bir teknik olup olmadığını merak ediyordum (bu durumda onları bükerek)?

Herhangi bir bağlantı, öğretici veya diğer referanslar bekliyoruz!

Yanıtlar:


11

Bir nesneyi "bükmek" için yapmanız gereken, söz konusu nesnenin köşelerinin yalnızca bazı alt kümelerine çeviri / döndürme / ölçeklemenin uygun bir kombinasyonunu uygulamaktır - muhtemelen bu dönüşümü buna göre ağırlıklandırmak.

Bunu yapmak hoş görünümlü bir moda, orijinal ağın tanımlanması için kesinlikle gerekli olandan daha fazla köşe kullanmanız gerekir. Örneğin, basit bir silindirin sadece her iki ucunda da köşeleri olabilir, ancak bu silindirin ortada bükülmesini istiyorsanız, orada da köşelere ihtiyacınız olacaktır.

İlgilendiğiniz tek şey çok basit, çok basit şekillerin (yukarıda belirtilen düzleminiz gibi) tek seferlik deformasyonları muhtemelen bunu manuel olarak yapabilirsiniz. Örneğin, düzleminiz için "bükülme ekseni" ne karar verin ve ondan olan mesafesine bağlı olarak bu bükülme ekseni hakkında uygun dönüşü elde etmek için her düzlem düzlemi noktası için uygun dönüşümleri hesaplayın ve ardından bunu geometriye uygulayın (muhtemelen CPU, en azından başlangıçta en basit olacağı gibi). Ancak böyle bir teknik iyi ölçeklenmeyecek ve çok sıkıcı olacaktır.

İstenen deformasyonu (özellikle daha pratik ve karmaşık nesneler için) elde etmek için bir sette her bir tepe noktasına bir dönüşümün nasıl ağırlıklandırılacağını doğru olarak anlamak çok zahmetli olabileceğinden, birçok oyun iskelet animasyonu adı verilen bir teknik kullanır . Yüksek seviyede bu, ayrı bir geometri setini ("iskelet") ağınızla ilişkilendirmeyi içerir. Bu geometri nesnenizin kemiklerini temsil eder ve (genellikle modelleme araçlarında) gerçek modelin köşeleri ile iskeletin kemikleri arasında bir eşleme tanımlarsınız - bu kemikler her bir tepe noktasıyla ilişkilendirilir ve kemiğin deformasyonu ne kadar etkilediğini bu tepe noktasının. Daha sonra iskelet doğrudan canlandırılır ve animasyon, kemikler ve köşeleri arasındaki ilişki yoluyla gerçek modele aktarılır.

Tipik olarak bu teknikte, iskelet ve gerçek ağ arasındaki eşleme varlık üretim zamanında tanımlanır. Animasyonlar daha sonra da oluşturulabilir veya çalışma zamanında prosedürel olarak oluşturulabilir. Animasyon dönüşümlerinin gerçek ağa uygulanması çalışma zamanında gerçekleşir. Genellikle çalışma zamanında yeni köşeler üretilmez, bu da iyi görünümlü deformasyonların aralığı, orijinal olarak oluşturulduğunda ağda örtülü olarak sabitlendiği anlamına gelir.

Teoride, animasyondaki dönüşümlerin analizine dayanarak çalışma zamanında ağa mozaikleme ve alt bölümleme de uygulanabilir ve böylece mutlaka planlanmamış bir animasyon oluşturmak için uygun köşeler üretilebilir. Bu konuyla ilgili herhangi bir makalenin farkında değilim.

Ayrıca bakınız:


9

Gerçek çarpıtma matematiği için bu çok karmaşık olabilir, neden buradan başlamıyorsunuz? .

Şimdi deformasyonlarınızı nasıl yapacağınız için zaten bir matematiğe sahip olduğunuzu varsayarak, bunu nasıl uygulayabileceğiniz hakkında konuşacağım.

2 yol:

1) Her çerçeve, silindir modelindeki her köşeyi ziyaret edin ve bir şekilde ofsetleyin.

2) Oluştururken köşe gölgeleyicisindeki köşeleri kaydırın. OpenGL ES 2.0 tepe gölgelendiricileri destekler. Yani bir şekilde şansın var.

Nesneyi yalnızca ekranda göründüğü gibi bükmek mi istiyorsunuz yoksa nesneyi, oyundaki her nesnenin deforme olduğunu bilmesi için bükmek mi istiyorsunuz?

Nesneyi köşe gölgelendiricisinde çarpıtırsanız, bu yalnızca görüntüleme / rasterleştirmeden hemen önce gerçekleşir , bu nedenle oyun nesnelerinin hiçbiri deformasyon hakkında bilgi sahibi olmayacağı anlamına gelir . Bu, sadece bir ekran koruyucu yapıyorsanız veya deformasyonlar nesnenin harmanlanabilir şekli üzerinde hiçbir etkisi olmayacak kadar küçükse iyidir.

Köşe gölgelendiricisindeki geometriyi çözdüğünüzde, modelin orijinal köşeleri aslında hareket etmez (sadece hareket ederler ).

Tepe gölgelendiricisinde deformasyon

deforme olmamış:

deforme olmamış

deforme olmuş

deforme

Bu, cg eğitiminin 6. bölümüdür (program # 14).

Bu deformasyonu üreten gölgelendirici kodu şuna benzer

// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;

// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;

// move the vertex
float4 newPosition = position + displacement * displacementDirection ;

// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;

Gördüğünüz gibi, bu ekrandan ÖNCE gerçekleşir (köşe gölgelendirici GPU'da gerçekleşir), böylece CPU kodunun dönüştürülmüş köşe konumuna erişmenin neredeyse bir yolu yoktur (GPU'dan CPU'ya (öncelikle dokular aracılığıyla) veri göndermenin yolları vardır, ancak biz oraya gitmeyecek).


8

Elde etmeye çalıştığınız şey temel olarak ağ deformasyonu konusunun bir alt kümesidir. Ama bir acemi olduğunuzdan, bu tür bilgilerin şimdilik biraz fazla garip olabileceğinden korkuyorum. Yine de temel kavramları ortaya koymaya çalışacağım.

Bunu yapmak için iki şeye ihtiyacınız olacak:

  1. Ağınızın dönüştürmeniz için yeterli köşeye sahip olması gerekir. Örneğin, bir uçaksa, deforme olmanız için birçok köşeye sahip bir tür ızgara olarak oluşturulduğundan emin olmanız gerekir. Silindir ile aynı şey. Mozaikleme ile çalışma zamanında bunu başarmak mümkün olabilir ama konu hakkında fazla bir şey bilmiyorum.
  2. Köşeleri deforme etmek için bir tepe gölgelendirici kullanmanız gerekir. Temel olarak tepe gölgelendirici, her tepe noktasının nihai dönüştürülmüş konumunu hesaplamaya özen gösterir, böylece bunlara herhangi bir deformasyon uygulama şansı elde edebilirsiniz.

Ne kadar yararlı olacağından emin değilim, ancak ihtiyacınız olan şey gibi göründüğü gibi bu OpenGL kaynağına bir göz atın:

http://www.ozone3d.net/tutorials/mesh_deformer_p3.php#part_3

Bu bağlantıdan ekran görüntüsü:

resim açıklamasını buraya girin

Düzenle

Josh'un cevabını yeni gördüm ve katılıyorum, iskelet animasyonu da bu problemi kapsüllemek için çok zarif bir yol, özellikle deformasyonlarınız matematiksel olarak temsil etmek daha karmaşık ve zorlaşmaya başladığında.

Ancak unutmayın, yukarıdaki her iki nokta da yine de geçerlidir - yalnızca köşeleri deforme edebilirsiniz, bu yüzden ilk etapta var olmaları gerekir, bu yüzden ağınızın iyi bir köşe yoğunluğuna sahip olması gerekir. Ve genellikle iskelet animasyonunu yönlendiren ve tepe harmanlama vb.

Ve bu arada, bunları CPU'da da yapabilirsiniz, ancak günümüzde bunları GPU'da yapmak daha iyi bir seçenektir, bu yüzden köşe gölgelendiricisine vurgu yapıyorum ve içine bakmalısınız. Zaten CPU'da yapmaktan ziyade programlı olarak o kadar zor değil.

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.