Assimp

Şimdiye kadar tüm sahnelerde küçük konteynerlerle yoğun bir şekilde oynadık, ancak zamanla en iyi arkadaşlarımız bile biraz sıkıcı olabilir. Daha büyük grafik uygulamalarında, genellikle statik bir konteynerden çok daha güzel birçok karmaşık ve ilginç model vardır. Bununla birlikte, konteyner nesnesinin aksine, evler, araçlar veya insan benzeri karakterler gibi karmaşık şekillerin tüm köşelerini, normallerini ve doku koordinatlarını gerçekten el ile tanımlayamayız. Bunun yerine yapmak istediğimiz şey, bu modelleri uygulamaya aktarmak; Blender, 3DS Max veya Maya gibi araçlarda 3B sanatçılar tarafından özenle tasarlanmış modeller.

Bu 3B modelleme araçları, sanatçıların karmaşık şekiller oluşturmasına ve uv-eşleme adı verilen bir işlem aracılığıyla dokuları bunlara uygulamasına olanak tanır. Araçlar daha sonra tüm köşe koordinatlarını, köşe normallerini ve doku koordinatlarını kullanabileceğimiz bir model dosyası formatına aktarırken otomatik olarak oluşturur. Bu şekilde, sanatçılar, teknik ayrıntılara çok fazla dikkat etmek zorunda kalmadan yüksek kaliteli modeller oluşturmak için kapsamlı bir araç setine sahip olurlar. Dışa aktarılan model dosyasında tüm teknik hususlar gizlidir. Grafik programcıları olarak bizler bu teknik ayrıntıları önemsemeliyiz.

Dışa aktarılan bu model dosyalarını ayrıştırmak ve ilgili tüm bilgileri ayıklamak bizim işimizdir, böylece onları OpenGL' in anlayacağı bir formatta saklayabiliriz. Yaygın bir sorun, her birinin model verilerini kendi benzersiz şekilde dışa aktardığı düzinelerce farklı dosya biçiminin olmasıdır. Wavefront .obj gibi model biçimleri yalnızca model renkleri ve dağınık/ düzgün eşlemeler gibi küçük malzeme bilgilerine sahip model verilerini içerirken, XML tabanlı Collada dosya biçimi gibi model biçimleri ise son derece kapsamlıdır ve modeller, ışıklar, birçok malzeme türü, animasyon verileri, kameralar, eksiksiz sahne bilgileri ve çok daha fazlasını içerir. Wavefront nesne formatı genellikle ayrıştırması kolay bir model formatı olarak kabul edilir. Böyle bir dosya formatındaki verilerin nasıl yapılandırıldığını görmek için Wavefront'un wiki sayfasını en az bir kez ziyaret etmeniz önerilir. Bu size model dosya formatlarının genel olarak nasıl yapılandırıldığına dair temel bir algı sunacaktır.

Sonuç olarak, aralarında ortak bir yapının genellikle bulunmadığı birçok farklı dosya biçimi vardır. Dolayısıyla, bu dosya biçimlerinden bir model içe aktarmak istiyorsak, içe aktarmak istediğimiz her dosya biçimi için bir içe aktarıcı yazmamız gerekir. Neyse ki bizim için bunu yapan bir kütüphane var.

Bir model yükleme kütüphanesi

Çok popüler bir kütüphane içe aktarma modeli olan, Açık Varlık İçe Aktarma Kitaplığı (ing. Open Asset Import Library) anlamına gelen Assimp kullanılmaktadır. Assimp, modelin tüm verilerini Assimp' in genelleştirilmiş veri yapılarına yükleyerek düzinelerce farklı model dosya formatını içe aktarabilir (ve bazılarına da dışa aktarabilir). Assimp modeli yüklediği anda, ihtiyaç duyduğumuz tüm verileri Assimp' in veri yapılarından geri alabiliriz. Assimp' in veri yapısı aynı kaldığından, içe aktardığımız dosya biçiminin türü ne olursa olsun, bizi oradaki tüm farklı dosya biçimlerinden soyutlar.

Assimp aracılığıyla bir model içe aktarılırken, tüm modeli içe aktarılan modelin/ sahnenin tüm verilerini içeren bir sahne nesnesine yükler. Assimp, daha sonra, her düğümün, her düğümün herhangi bir sayıda çocuğa sahip olabileceği sahne nesnesinde depolanan verilere yönelik indisleri içerdiği bir düğüm koleksiyonuna sahiptir. Assimp'in yapısının (basit) bir modeli aşağıda gösterilmiştir:

  • Sahne/ modelin tüm verileri, tüm materyaller ve ağ (ing. mesh) gibi Scene nesnesinde bulunur. Ayrıca, sahnenin kök düğümüne bir referans içerir.

  • Sahnenin Kök düğümü, alt düğümler içerebilir (diğer tüm düğümler gibi) ve sahne nesnesinin mMeshes dizisindeki örgü verilerine işaret eden bir dizi indis içerebilir. Sahnenin mMeshes dizisi gerçek Mesh nesnelerini içerir, bir düğümün mMeshes dizisindeki değerler yalnızca sahnenin mesh dizisi için indekslerdir.

  • Bir Mesh nesnesinin kendisi, oluşturma için gereken tüm ilgili verileri içerir, köşe konumlarını, normal vektörleri, doku koordinatlarını, yüzleri ve nesnenin malzemesini düşünün.

  • Bir kafes birkaç yüz içerir. Yüz, nesnenin ilkel oluşturmasını temsil eder (üçgenler, kareler, noktalar). Bir yüz, bir ilkel oluşturan köşelerin indislerini içerir. Köşeler ve indisler ayrıldığından, bu bizim için bir indeks tamponu aracılığıyla oluşturmamızı kolaylaştırır (bkz. Merhaba Üçgen).

  • Son olarak bir ağ, bir nesnenin malzeme özelliklerini almak için çeşitli işlevleri barındıran bir Material nesnesine de bağlanır. Renkleri ve / veya doku haritalarını düşünün (dağınık ve aynasal haritalar gibi).

Yapmak istediğimiz şey: önce bir nesneyi bir Scene nesnesine yüklemek, ilgili Mesh nesnelerini her bir düğümden özyinelemeli olarak almak (her bir düğümün çocuklarını özyinelemeli olarak aratıyoruz) ve her bir Mesh nesnesini köşe verilerini, indisleri ve materyal özellikleri. Sonuç, tek bir Model nesnesinde içe aktarmak istediğimiz bir ağ verisi topluluğudur.

Sanatçılar, modelleme araç setlerinde nesneleri modellerken genellikle tek bir şekilden bütün bir model oluşturmazlar. Genellikle her modelin oluşturduğu birkaç alt model/ şekil vardır. Bu tekil şekillerin her birine adı verilir. İnsan benzeri bir karakter düşünün: Sanatçılar genellikle başı, uzuvları, kıyafetleri ve silahları ayrı bileşenler olarak modeller ve tüm bu ağların birleşik sonucu nihai modeli temsil eder. Tek bir ağ, OpenGL' de bir nesneyi çizmek için ihtiyaç duyduğumuz şeyin minimum temsilidir (köşe verileri, indisler ve materyal özellikleri). Bir model (genellikle) birkaç ağdan oluşur.

Sonraki bölümlerde, az önce anlattığımız yapıyı kullanarak içe aktarılan modelleri yükleyen ve depolayan kendi Model\color {red} Model ve Mesh\color {red} Mesh sınıfımızı oluşturacağız. Daha sonra bir model çizmek istersek, modeli bir bütün olarak oluşturmayıp, sadece modelin oluşturduğu tüm bağımsız ağları oluşturacağız. Ancak, modelleri içe aktarmaya başlamadan önce, projemize Assimp' i dahil etmemiz gerekiyor.

Assimp' i inşaa etme

Assimp'i indirme sayfasından indirebilir ve ilgili sürümü seçebilirsiniz. Bu yazı için kullanılan Assimp versiyonu 3.1.1 versiyonuydu. Önceden derlenmiş kitaplıkları her zaman tüm sistemlerde çalışmadığından, kitaplıkları kendi kendinize derlemeniz önerilir. Bir kitaplığı CMake aracılığıyla kendi başınıza nasıl derleyeceğinizi unuttuysanız Pencere oluşturma bölümünü gözden geçirin.

Assimp'i inşa ederken birkaç sorun ortaya çıkabilir, bu nedenle, herhangi birinizin aynı hataları alması durumunda çözümleriyle birlikte buraya not edeceğim:

  • Cmake, eksik DirectX kütüphaneleriyle ilgili yapılandırma listesini alırken sürekli olarak hatalar verir:

    Could not locate DirectX
    CMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):
    Required library DirectX not found! Install the library (including dev packages) 
    and try again. If the library is already installed, set the missing variables 
    manually in cmake.

    Buradaki çözüm, daha önce yüklememiş olmanız durumunda DirectX SDK' yı kurmaktır. SDK' yı buradan indirebilirsiniz.

  • DirectX SDK'yı kurarken, olası birs1023hata kodu açılabilir. Bu durumda, SDK' yı kurmadan önce ilk olarak C ++ Yeniden Dağıtılabilir paketlerini kaldırmak gerekir.

Yapılandırma tamamlandıktan sonra, bir çözüm dosyası oluşturabilir, açabilir ve kütüphaneleri derleyebilirsiniz (bir release sürümü veya bir hata ayıklama sürümü olarak, nasıl istiyorsanız öyle olsun). Tüm LearnOpenGL kodu 64 bit olduğundan onu 64-bit için derlediğinizden emin olun.

Varsayılan yapılandırma, Assimp' i dinamik bir kütüphane olarak oluşturur, bu nedenle sonuçta ortaya çıkanassimp.dll adlı DLL' i (veya bazı son düzeltmelerle) uygulamanın ikili dosyalarının yanına eklememiz gerekir. DLL' i uygulamanızın yürütülebilir dosyasının bulunduğu klasöre kopyalayabilirsiniz.

Oluşturulan çözümü derledikten sonra, ortaya çıkan kütüphane ve DLL dosyası,code/Debug veyacode/Release klasöründe bulunur. Ardından, lib ve DLL' i uygun konumlarına taşıyın, bunları çözümünüz ile bağlayın ve Assimp' in başlıklarını dahil etme dizininize kopyaladığınızdan emin olun (başlık dosyaları, Assimp' ten indirilen dosyalardaki include klasöründe bulunur).

Şimdiye kadar Assimp'i derlemiş ve uygulamanıza bağlamış olmalısın. Halen bildirilmemiş bir hata aldıysanız, yorumlarda yardım istemekten çekinmeyin.

Orijinal Kaynak: Assimp

Çeviri: Nezihe Sözen

Last updated