380 likes | 625 Views
Grafik İçin Veri Yapıları. İnönü Üniversitesi Bilgisayar Mühendisliği Bölümü. Sahne Çizgesi. 3B sahnelerin gösterimi için sıklıkla kullanılan bir yapıdır. Ayrıca karmaşık yapıdaki 3B nesneler için de kullanılır.
E N D
Grafik İçin Veri Yapıları İnönü Üniversitesi Bilgisayar Mühendisliği Bölümü
Sahne Çizgesi • 3B sahnelerin gösterimi için sıklıkla kullanılan bir yapıdır. • Ayrıca karmaşık yapıdaki 3B nesneler için de kullanılır. • Sahne çizgesi (scenegraph) bir döngüsüz yönlü çizgedir.(directedacyclicgraph) • Genelde bir sahne çizgesinde; • Nesneler (küp, küre, koni vb.) düğüm olarak • Özellikler (renk, doku haritası vb.) ayrı düğümler olarak • Dönüşümler düğüm olarak bulunur. • Sahne çizgesi oluşturmak için çeşitli kütüphaneler mevcuttur. • WPF (Windows Presentation Foundation) • Open SceneGraph • Java3D • X3D™
Örnek (XML) <?xmlversion="1.0"?> <scenegraphname="scene_tree"> <branchname="branch_tree"> <translationname="translate_tree"x="200.0"y="0.0"z="-100.0"><translationname="translate_base"x="0.0"y="5.0"z="0.0"> <scalename="scale_base"x="5.0"y="5.0"z="5.0"> <shapename="cylinder_base"type="cylinder"color="brown"/></scale></translation> <translationname="translate_crown"x="0.0"y="15.0"z="0.0"> <scalename="scale_crown"x="15.0"y="15.0"z="15.0"> <shapename="cone_crown"type="cone"color="green"/></scale></translation></translation> <rotationname="rotation_ground"ray_x="1"ray_y="0"ray_z="0"angle="90"><scalename="scale_ground"x="1000.0"y="1000.0"z="1000.0"> <shapename="plane_ground"type="plane"color="gray"/></scale></rotation><directional_light_sourcename="light"x="20.0"y="300.0"z="20.0"/></branch><cameraname="camera"cop_x="0"cop_y="0"cop_z="0"vrp_x="20"vrp_y="150"vrp_z="20"vuv_x="0"vuv_y="1"vuv_z="0"/> </scenegraph>
Sahne Çizgesi ve Dönüşümler Sahne Çizgesi ROBOT Üst kısım Alt kısım ayak taban kafa gövde kol • Bir robot modeli oluştururken sahne çizgesi ve dönüşümler birlikte kullanılabilir. • Çeşitli dönüşümler her yaprağa (nesnenin temel bileşenlerine) uygulanır. • Daha sonra ek dönüşümler nesne gruplarına (robot uzuvlarına) uygulanır. • Bunlarla birlikte bu dönüşüm hiyerarşisi robot modelini bir bütün olarak oluşturur.
Sahne Çizgesi ve Dönüşümler • Bir nesne için bir dönüşüm tanımlarken bulunduğu düğümden köke doğru çıkıldıkça eklenerek artan dönüşüm matrisi (cumulativetransformationmatrix) oluşturulabilir. • Mesela: • 1. nesne için (o1), CTM = M1 • 2. nesne için (o2), CTM = M2 M3 • 3. nesne için (o3), CTM = M2M4 M5 • 3. nesnedeki bir v köşesinin dünya koordinat sistemindeki konumu (M2 M4M5)v şeklinde belirtilebilir. Nesne düğümleri Dönüşüm düğümleri Grup düğümleri
Sahne Çizgesi ve Dönüşümler grup3 kök grup1 obj4 obj3 obj1 grup3 grup2 obj2 grup3 • Eğer daha önceden tanımlanmışlarsa, nesne gruplarını tekrar kullanmak pekala mümkündür. • Bu örnekte 3. grup iki kez kullanılmaktadır. • 3. grup içerisinde tanımlanan dönüşümler değişmez, 3. grubun bir bütün olarak her kullanımı için farklı eklenerek artan dönüşüm matrisleri mevcuttur.
Sınırlayıcı Hacimler • Karmaşık nesneleri çevreleyerek ışın izleme, çarpışma tespiti vb. durumlarda işlem kolaylığı sağlayabilecek bir yapıdır. • Bu kuşatıcı hacimler içindeki nesnelere göre daha basit ifade edilebilen geometrik şekillerdir. • İçerideki nesnelerin görünebilmesi için bu hacimlerin de görünür ve içini gösterir (transparan vb.) nitelikte olması gerekir. • Kodlanması oldukça kolaydır. • Örneğin eksen hizalı sınırlayıcı kutular, her kenarı x, y ya da z eksenine paralel küplerdir. Şeklin her köşesinin en küçük ve en büyük x, y, z değerleri bulunarak oluşturulabilir.
Sınırlayıcı Hacim Hiyerarşisi • Bütün bir modelin yönetiminde bir yöntem olarak kullanılabilir. • Sınırlayıcı hacimler ağaç yapısı oluşturacak şekilde diğer sınırlayıcı hacimlerin içine konur. • Bu şekilde ağaç yapısı aşağıdan yukarıya doğru oluşturulur. • Bütün sahne kuşatılana kadar yakınlardaki diğer nesneler de sınırlayıcı hacimlerle gruplandırılır. • Birbirine yakın nesneleri bulmak O(n2) güçlüğünde olabilir. Sıralama ile O(n logn) seviyesine indirilebiilir. • Sahne çizgesi şeklinde bir ağaç hiyerarşisi oluşturulursa sınırlayıcı hacimler düğüm noktaları ve bu düğümlerin birleşimi ile üst seviyeler elde edilir. • Böyle bir sahne çizgesi mantıklı bir şekilde tertiplidir, ancak mekansal bir tertip içermeyebilir.
Sınırlayıcı Hacim Hiyerarşisi • Bu hiyerarşi sahnelerin bir alt kümesi için oldukça işe yarar ve kodlanması kolaydır. • İlave kullanıcı girdileri ile (userinput) büyük oranda performans artışı sağlanabilir. • Nesneleri gruplamada sahnenin durumuna göre davranmak daha makuldür. • Sahneler önceden bilindiğinden bilgisayar oyunlarında oldukça işe yaramaktadır. • Rastgele sahnelerde çok düşük performans nedeniyle pek işe yaramamaktadır. • Çok detaylı çokgen örgülerinin yakın gösteriminde • Ağaç ve çimenlerle kaplı bir manzara görüntüsünde
Uzay Bölümleme • Nesneleri alttan üste doğru sınırlamak yerine, uzayı düzgün aralıklı hücrelere bölme mantığıdır. • Canlandırmalı sahneler için kolayca ve hızlıca oluşturulabilir. • Böyle bir yapıda gezinmek için doğru tarama (scanconversion) algoritmaları kullanılabilir.
Uzay Bölümleme • Uzayı bölümlerken, ızgara yapısından kaynaklanan verimlilik/yeterlik dengesini de göz önünde bulundurmak gerekir. • Küçük hücre kullanımında içi boş çok sayıda hücre oluşabileceği gibi, bunların hepsini kontrol etmek de kaynak israfına yol açar. • Büyük hücre kullanımında ise bazı hücreler aşırı miktarda nesne içerebilir., • Bazı bölgeler için daha ince bir ızgara oluşturmak gezinme esnasında çok sayıda atlama işlemine (dolayısıyla daha uzun süreye) yol açabilir ancak oluşturma zamanından tasarruf sağlar. • Canlandırmalı sahnelerde kullanışlıdır. • Fakat böyle bir yapıda hiyerarşi yoktur, bu yüzden daha akıllıca çözümler gerekir.
Uyarlamalı Ağaç Yapısı - Octree • Octree ağaçları, sınırlayıcı hacim hiyerarşisi ve ızgaraların avantajla yanlarını içerir. • Aynı boyutta olması zorunlu olmayan voxel (3B hücreler) haricinde ızgara yapısına benzer niteliktedir. Quadtree de denilen 2B örnek ağaç bölümlemesi
Octree Oluşturmak • Üstten alta doğru ilerlenerek oluşturulur. • Bütün sahnenin sınırlayıcı kutusu bulunur. Bu kutu ağacın köküdür ve bütün temel bileşenleri içerir. • Her iterasyonda mevcut düğüm, sekizlik (octant) bölümlere ayrılır. • Mevcut düğümdeki temel bileşenler sekizliklere ayrılır. • Eğer bir düğüm bir bölünmede iki tarafı da kapsıyorsa, iki sekizlik parçaya da konur. • Yeni düğümlerde ayırma tekrarlanır. • Bir voksein yeterince küçük temel bileşeni olana kadar veya maksimum bir derinlikte işlem sonlandırılır.
Octree Üzerinde Gezinme • Kök düğümden başlanır. • Eğer bir düğüm yaprak ise bütün çocukları üzerinde kesişim yapılır. • Değilse düğümün çocukları üzerinde ilerlenerek ışın ve çocuğun sınırlayıcı kutusu arasındaki kesişimler hesaplanır. • Kesişim varsa çocuk üzerinde özyineleme yapılır.
Avantaj ve Dezavantajları • Octreeler ile rastgele sahneler iyi bir başarımla yönetilebilir. • Işın başına O(log n) zamanda çalışabilir. • Temel bileşenlerin çok düzensiz bir şekilde dağıldığı sahnelerde octreeler çok kötüdür. • Böyle sahnelere de sıklıkla rastlanılmaktadır. • Octree algoritması karmaşık geometri üzerinde çalışırken alanı çok fazla sayıda alt kısımlara ayırarak, daha derin ve verimsiz ağaçlar oluşturabilmektedir.
kd Ağaçları • Düğümlerin boyutlarını belirlerken daha akıllıca davranmak için; düğümlerle kesişimleri tespit zamanı (derin ağaç) ile sahne temel bileşenleriyle kesişimleri (sığ ağaç) tespit zamanının dengesini ayarlamak gerekir. • Yüksek karmaşıklığa sahip alanları izole ederek geniş boşluklar oluşturarak gezinme çabuklaştırılabilir. • Bunun için k boyutlu, eksenlerle hizalı ikili bir ağaç olan kd ağacı tanımlanabilir. • Octree gibi eksenlerle aynı hizadadır, ama octree ikili bir yapıda değildir. • Her düğümde bölünme için bir eksen seçilir. • Esas sıkıntı (hangi eksen boyunca bölündüğü de) verilen bir düğümde bölünmüş düzlemin nerede konumlandırılacağıdır. • Nesnelerin konumlarını yansıtmak için bölünebilir. • Bozulmuş bir kd ağacı, muadili octree ile denktir.
kd Ağaçları • Aşağıdaki örnekte gezinme sırasında ışın eşit şansla sol yada sağ yandan girebilir. Fakat sağ yandan girmenin maliyeti çok daha fazladır. y=1 0 x=1
kd Ağaçları y=1 • Bu durumda gezinme sırasında her tarafa giriş maliyeti; -muhtemel kesişim testleri türünden- yaklaşık olarak birbirine eşittir. • Fakat bir ışının sol tarafa girmesi çok daha muhtemeldir, zira alan çok daha büyüktür. 0 x=1
kd Ağaçları y=1 • Bu durumda bir düğüme girme maliyetini o düğüme girme ihtimali ile dengelemeye çalışılmaktadır. • Geometrik karmaşıklığı hızlıca izole etmekte, gezinme esnasında kolayca elenecek geniş ve boş düğümler oluşturmaktadır. 0 x=1
kd Ağaçları y=1 • Sol tarafı daha fazla bölmeye gerek yoktur. Sağ tarafı da kabaca ortadan bölmek mantıklıdır. Sağ taraf için bu aşamadan sonra ilave bölümlemeler octree gibi olacaktır. • Buradaki fark; sol taraftaki tek şekil, bir bölünme ile diğerlerinden ayrıştırılarak kolayca erişilebilir hale gelmiştir. Octree kullanılsaydı bu şekle daha derin bir ağaç yapısının en altında erişilerek verimsiz bir bölünme yapılacaktı. 0 x=1
kdAğaçlarını Oluşturma • Verilen mevcut düğümün eksen hizalı bir kutusu ve L sayıdaki temel bileşen için eğer çok az temel bileşen varsa yaprak düğümü oluştur ve geri dön değilse Bir bölünme ekseni seç Bu eksen etrafında bir bölünme düzlemi seç L’ deki hangi temel bileşenlerin sol ve sağ çocukla kesiştiklerini belirle Sol çocuğa özyineleme uygula Sağ çocuğa özyineleme uygula • Yüksek performans için iyi bir ayırma düzlemi seçmek çok önemlidir. • Maliyet açısından en hesaplı kd ağacını oluşturma problemi NP-complete karmaşıklığındadır. • Verilen bir düğüm ile yerelde sezgisel yüzey alan araması yapılarak (greedysurfaceareaheuristic) yaklaşık bir çözüm bulunabilir.
Sezgisel Yüzey Arama • Verilen mevcut düğümün eksen hizalı bir kutusu ve L sayıdaki temel bileşen için Her muhtemel bölme pozisyonu için maliyet= olasısol* maliyet sağ+ olasısağ* maliyet sol Bu maliyeti minimize eden ayırma düzlemini kullan • Olasılık hesaplamasında ışınların uzay boyunca eşit olarak dağılacağı kabul edilir. • olasıçocuk = bir alt kutunun yüzey alanının üstteki kutunun yüzey alanına oranı • maliyetçocuk = çocuktaki temel bileşen sayısı • olasıçocuk * maliyetçocuk = Çocuk düğüme girmenin öngörülen maliyeti
Sezgisel Yüzey Arama • Muhtemel bölme konumları sonsuz sayıdadır. • Bunun önüne geçmek için yalnızca ayırma eksenleri boyunca yer alan temel bileşenlerin kenarlarında bölünmeler ele alınabilir. • Yüksek oluşturma maliyetinin gezinmede kazanılan avantajı etkisizleştirmemesine dikkat edilmelidir. • Doğrudan oluşturmanın maliyeti O(n2logn) olabilmektedir. • Bunun için bölünmüş eksenler boyunca temel bileşenler sıralanarak istenen koşul sağlanana kadar devam edilebilir. • Bu işlemin maliyeti O(n logn) dir.
Sezgisel Yüzey Arama 8 y 0 10 x 6
kd Ağaçlarında Gezinme • Octree için kullanılan bir gezinme algoritması ile yapılabilir. • Burada iki çocuğu gezerken rastgele sıra yerine ışına ilk çarpan çocuk seçilir. Bu çocuğa «ön yüz çocuğu» denir. Diğerine de «arka yüz çocuğu» denir. • Eğer ön yüz çocuğunda arka yüz çocuğunun sınırlayıcı kutusundan daha önce bir kesişim olursa, arka yüz çocuğuna gitmeye gerek yoktur. • Bu teknik, önceki veri yapıları için de kullanılabilir. • Burada ışın G’ den önce F’ ye girmektedir. F’ yi gezerken ışın yeşil üçgenle kesişmektedir ama gezinme sonlandırılmaz çünkü sınırlayıcı kutuların için t değerlerinin kesişim t değerleri ile karşılaştırılması gerekir. • Eğer bir temel bileşen ayırma düzleminde ise bu nesne iki tarafa da konur.
Şimdiye Kadar Octree Sınırlayıcı Hacim Hiyerarşisi kd-tree Izgaralar
İkili Uzay Bölümleme Ağaçları • İngilizcesi Binary Space PartitioningTrees olan bu ağaçlar çokgenlerin görünür yüzey tespitinde kullanılır. • Hangi objelerin ilk çizdirileceğinin belirlenmesinde z arabelleğinin yerini alır. • Çarpışma testlerinde kullanılabilir. • BSP oluşturulurken uzaysal alt bölmelerle ikili bir ağaç oluşturulur. Bu ağaç kd ağacının eksene hizasız halidir. • Maliyet hesabı yoktur, bölme düzlemi rastgele seçilebilir.
İkili Uzay Bölümleme Ağaçları • İlk olarak herhangi bir çokgen alınarak üzerindeki düzlem üzerinden bölme yapılır. Lüzumu halinde çokgenler de bölünür.
İkili Uzay Bölümleme Ağaçları • Ön alt ağaca öz yineleme uygulanır.
İkili Uzay Bölümleme Ağaçları • Arka alt ağaca öz yineleme uygulanır.
İkili Uzay Bölümleme Ağaçları • Aynı sahne için 5. çokgenin kök olduğu bir BSP ağacı
İkili Uzay Bölümleme Ağaçları • kd ağacında önden arka düğümlere doğru gezinme yapılırken BSP düğümlerinde arkadan öne doğru gezinilir. Bir düğümün arka çocuğu, düğümün bakış noktasını içermeyen yüzüdür. • Quake III oyun motorunda (idTech 3) örtüşmeleri ayıklamada ve çarpışma testini hızlandırmada bu yöntem kullanılmaktadır.
BSP için Sözde Kod voidBSP_displayTree(BSP_tree* tree) { if (tree is not empty) if ( viewer is in front of root ) { BSP_displayTree(tree->backChild); displayPolygon(tree->root); BSP_displayTree(tree->frontChild); } else { BSP_displayTree(tree->frontChild); // ignore next line if back-face // culling desired displayPolygon(tree->root); BSP_displayTree(tree->backChild); } } } BSP uygulaması için: http://symbolcraft.com/graphics/bsp/index.html
Avantaj ve Dezavantajları • Herhangi bir bakış noktası için tek ağaç yeterli olmaktadır. • Oluşturması oldukça kolaydır. • Ayırıcı düzlem bir nesnenin içinden geçiyorsa nesneyi ikiye bölüp her alt düğüme bir parçası verilir. Bu durumda çok sayıda nesne varsa O(n3) kadar nesne ortaya çıkabilir.
İleri Düzey Teknikler • Çeşitli grafik uygulamalarında kapalı mekanlar genellikle koridorlar ve kapılarla birbirine bağlı odalardır. • Eğer kapı kapalı ise diğer odanın çizdirilmesinin gereği yoktur. Eğer açık bir kapı veya geçit varsa, sadece kapıdan görünen şekilleri çizdirmek daha mantıklıdır. • Manzara içeren sahnelerde bu yöntem pek işe yaramaz. • Örnekler için: http://www.cs.virginia.edu/~luebke/publications/portals.html
İleri Düzey Teknikler • Eğer büyük bir nesne ekranın önemli bir kısmını işgal ediyorsa, o nesnenin örttüğü geometriyi çizdirmeye gerek olmayabilir. Buna örtüşme ayıklaması (occlusionculling) da denilir. • Bunun için öncelikle görüntü hacmindeki (kesik piramit) görünebilecek bütün nesneler listelenir. Her nesne ikilileri için eğer biri diğerini örtüyorsa, diğeri görüntü hacminden çıkarılır. Ancak bu yöntem O(n2) karmaşıklığında olduğundan optimizasyon gerektirir. • Bu makalede çeşitli algoritmalar incelenmektedir: http://www.gamasutra.com/view/feature/3394/occlusion_culling_algorithms.php • Çok sayıda küçük nesnenin bulunduğu kapalı mekanlarda örtüşme ayıklaması işe yaramaz.
Örnek Primitives: 187 Spheres Render Time: 43 secs Primitives: 937 Spheres Render Time: 52 secs Primitives: 117187 Spheres Render Time: 212 secs KD Tree Build Time: 80 secs Primitives: 585937 Spheres Render Time: 14 min KD Tree Build Time: 6 min Primitives: ~3M Spheres Render Time: 18 min KD Tree Build Time: 4.5 hours Primitives: 37 Spheres Render Time: 22 secs Primitives: 23437 Spheres Render Time: 135 secs KD Tree Build Time: 6 secs Primitives: 4687 Spheres Render Time: 85 secs KD Tree Build Time: 2 secs Primitives: 7 Spheres Render Time: 16 secs