Üçgen bitişiklik verileri oluşturma


9

Üçgen indekslerin bir listesi verildiğinde, bir geometri gölgelendiricisinin bitişiğindeki bir indeks listesine nasıl dönüştürülür?

Burada kesinlikle endekslerden bahsettiğimizi unutmayın - köşeler var, ancak yalnızca endekslere odaklanacağız, çünkü bunları kayan nokta karşılaştırmaları ve epsilonslarına girmek zorunda kalmadan yinelenen köşeleri eşleştirmek için kullanabiliriz - bu iş zaten yapıldı.

Listedeki herhangi bir üçgen için {0, 1}, {1, 2} ve {2, 0} (veya {n, n + 1}, {n + 1, n + 2}, { n + 2, n} isterseniz) kenarlarından oluşturur; endeks listesi iyi biçimlendirilmiştir ve sarım sırasına düzgün bir şekilde uyar.

Böyle bir kenar için, tüm listeyi bu endekslerden ikisini kullanan başka bir üçgen için arayabileceğimizi ve bu üçgenin üçüncü dizininin o kenar için bitişik üçgeni tamamlamak için kullanılacak olan olduğunu biliyorum.

Bitişik listede her orijinal üçgenin 6 indeksle temsil edildiğini, orijinal indekslerin 0, 2, 4 yuvalarına girdiğini biliyorum; bitişikliği tamamlamak için yeni indeksler 1, 3, 5 numaralı yuvalara gider. {0, 1} kenarı için tamamlanacak dizin yuva 1'e, {1, 2} kenarı için tamamlanacak dizin yuva 3'e gider, endeks {2, 1} kenarı için tamamlamak yuva 5'e gider.

Ne denedim?

Kaba zorlamayı denedim ve evet, bu işe yarayacak, ama daha zarif bir yaklaşım peşindeyim.

Eric Lengyel'in kenar listesi oluşturucusunu denedim, ancak (1) orijinal üçgen düzenine saygı duymuyor, (2) sargı düzenine saygı duymuyor, (3) nereye gidileceği çamur kadar net sonra kenar listesini oluşturduktan sonra, ve (4) Ben "üçgenIndex" karşı "faceIndex" gibi bariz göze çarpan hataları olan bir örnek kod şüphesi var - yazar bile kodu derlemek mi, doğrula?

Peki - buradan herhangi bir öneri veya işaretçi var mı?


Jimmy, gölge hacimlerle ilgili şeyleri düzenledim ve başlığı değiştirdim, çünkü ilgili görünmüyordu ve potansiyel olarak kafa karıştırıcıydı - soru aslında bitişik veri oluşturmakla ilgili, nihai amacınız gölge hacimleri için kullanmak olsa bile.
Nathan Reed

Yanıtlar:


11

Bunun için bir karma tablo (örneğin, std::unordered_mapC ++ iseniz) kullanmayı deneyin . Yarım kenardan (sırasıyla bir çift indeks olarak ifade edilir) yarım kenarın ait olduğu üçgenin üçüncü dizinine eşleyen bir karma tablo oluşturun.

Bu, üçgen listesinin tekrarı yapılarak ve her üçgenin üç yarım kenarının karma tablosuna eklenmesiyle oluşturulabilir. İlk dizin listenizde bir çift bitişik üçgen varsa (0, 1, 2, 2, 1, 3), aşağıdakileri içeren bir karma tablo ile sonuçlanırsınız:

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

Kenarların (1, 2) ve (2, 1) her ikisinin de tabloda göründüğünü, kenarın iki tarafını temsil ettiğini ve iki üçgenin her birinin üçüncü tepe noktasına işaret ettiğini unutmayın.

Daha sonra, bitişik verileri oluşturmak için tek yapmanız gereken üçgen listesinin üzerinde tekrarlamak ve her üçgenin kenarlarını karşı sargı ile sorgulamaktır. Üçgeni (0, 1, 2) işlerken kenarları (1, 0), (2, 1) ve (0, 2) sorgulayabilirsiniz. Bu, varsa, her bir kenarın zıt tepe noktasını bulacaktır.


1
Havalı, zıt sıralı kenarları aramak , eksik bilgilerin önemli bir parçasıydı; şampiyon çalışır; +1 ve kabul edildi.
Maximus Minimus

2

Bak yarım kenar veri yapısı .

Fikir kabaca yarım kenarların listesini , örneğin belirli bir yüzün belirli bir yüze iliştirilmiş yarısını saklamanızdır . Bu yapı daha sonra bitişik yüz için karşılık gelen yarım kenar hakkında bilgi depolar.

Veri yapısı, bağlantı, bitişiklik vb. Sorguları çok verimli hale getirir. Verileri verimli bir şekilde üretmek için algoritmalar vardır, ancak mutlaka "oyun çalışma zamanı" verimli bir şekilde değildir (muhtemelen bunu varlık hattınızda çevrimdışı yapmak istersiniz).

Ayrıca bu blog yayınlarına bakın . Yapının ve algoritmaların da Gerçek Zamanlı Çarpışma Tespiti'nde olduğuna inanıyorum, ancak kesin olarak hatırlamıyorum ve ofiste bir kopyası yok.


-1, üzgünüm, ama bu zaten sahip olmadığım herhangi bir bilgi vermedi ve bir GS'de kullanım için bitişik bir liste oluşturmak yerine CPU'da kullanım amaçlıydı.
Maximus Minimus
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.