Aracılığıyla paylaş


Projeksiyon Dönüşümü (Direct3D 9)

Projeksiyon dönüşümünün kameranın iç öğelerini kontrol etme olduğunu düşünebilirsiniz; kamera için bir lens seçmeye benzer. Bu, üç dönüştürme türünden en karmaşıkıdır. Projeksiyon dönüşümüyle ilgili bu tartışma aşağıdaki konulara göre düzenlenmiştir.

Projeksiyon matrisi genellikle bir ölçek ve perspektif projeksiyonudur. Projeksiyon dönüşümü, görüntüleme frustumunu bir küboid şekle dönüştürür. Görüntüleme frustumunun yakın ucu uzak uçtan daha küçük olduğundan, bu, kameraya yakın nesneleri genişletme etkisine sahiptir; Perspektif bu şekilde sahneye uygulanır.

görüntüleme frustum , kamera ile görüntüleme dönüştürme alanının başlangıcı arasındaki uzaklık rastgele olarak D olarak tanımlanır, bu nedenle projeksiyon matrisi aşağıdaki çizime benzer.

projeksiyon matrisiçizimi

Görüntüleme matrisi, D ile z yönünde çeviri yaparak kamerayı çıkış noktası olarak çevirir. Çeviri matrisi aşağıdaki çizim gibidir.

Çeviri matrisiçizimi

Çeviri matrisinin projeksiyon matrisi (T*P) ile çarpılması, aşağıdaki çizimde gösterildiği gibi bileşik projeksiyon matrisini verir.

Bileşik projeksiyon matrisiçizimi

Perspektif dönüşümü, görüntüleme frustumunu yeni bir koordinat alanına dönüştürür. Aşağıdaki diyagramda gösterildiği gibi frustumun cuboid olduğuna ve ayrıca sahnenin sağ üst köşesinden ortaya geçtiğine dikkat edin.

perspektif dönüşümünün görüntüleme frustumunu yeni bir koordinat alanına nasıl dönüştürdüğünü gösteren diyagramı

Perspektif dönüşümünde x ve y yönlerinin sınırları -1 ve 1'tir. Z yönünün sınırları ön düzlem için 0, arka düzlem için 1'dir.

Bu matris, nesneleri kameradan yakın kırpma düzlemine belirtilen uzaklık temelinde çevirir ve ölçeklendirir, ancak görüş alanını (fov) dikkate almaz ve uzaklıktaki nesneler için ürettiği z değerleri neredeyse aynı olabilir ve derinlik karşılaştırmaları zorlaşır. Aşağıdaki matris bu sorunları giderir ve köşeleri görünüm penceresi en boy oranını dikkate almak üzere ayarlayarak perspektif projeksiyonu için iyi bir seçimdir.

Perspektif projeksiyonuçizimi

Bu matriste Zn, yakın kırpma düzleminin z değeridir. w, h ve Q değişkenleri aşağıdaki anlamlara sahiptir. ve fovk fovk'un radyan cinsinden görünüm penceresi yatay ve dikey görünüm alanlarını temsil ettiğini unutmayın.

değişken anlamlarının denklemlerini

Uygulamanız için x ve y ölçeklendirme katsayılarını tanımlamak için görüş alanı açılarını kullanmak, görünüm penceresi yatay ve dikey boyutlarını (kamera alanında) kullanmak kadar uygun olmayabilir. Matematik işlemleri tamamlandıktan sonra, w ve h için aşağıdaki iki denklem görünüm penceresi boyutlarını kullanır ve önceki denklemlerle eşdeğerdir.

w ve h değişken anlamlarının denklemlerini

Bu formüllerde Zn, yakın kırpma düzleminin konumunu, Vw ve Vh değişkenleri kamera alanında görünüm penceresi genişliğini ve yüksekliğini temsil eder.

C++ uygulaması için bu iki boyut, D3DVIEWPORT9 yapısının Genişlik ve Yükseklik üyelerine doğrudan karşılık gelir.

Kullanmaya karar vereceğiniz formül ne olursa olsun, Zn'i mümkün olduğunca büyük bir değere ayarladığınızdan emin olun çünkü kameraya son derece yakın z değerleri çok fazla değişiklik göstermiyor. Bu, 16 bit z arabellekleri kullanarak derinlik karşılaştırmalarını biraz karmaşık hale getirir.

Dünya ve görünüm dönüşümlerinde olduğu gibi, projeksiyon dönüşümünü ayarlamak için IDirect3DDevice9::SetTransform yöntemini çağırırsınız.

Projeksiyon Matrisi Ayarlama

Aşağıdaki ProjectionMatrix örnek işlevi, ön ve arka kırpma düzlemlerinin yanı sıra görünüm açılarının yatay ve dikey alanını ayarlar. Görünüm alanları pi radyandan küçük olmalıdır.

D3DXMATRIX 
ProjectionMatrix(const float near_plane, // Distance to near clipping 
                                         // plane
                 const float far_plane,  // Distance to far clipping 
                                         // plane
                 const float fov_horiz,  // Horizontal field of view 
                                         // angle, in radians
                 const float fov_vert)   // Vertical field of view 
                                         // angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    D3DXMATRIX ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}   // End of ProjectionMatrix

Matrisi oluşturduktan sonra D3DTS_PROJECTION belirten IDirect3DDevice9::SetTransform ile ayarlayın.

D3DX yardımcı programı kitaplığı, projeksiyon matrisinizi ayarlamanıza yardımcı olmak için aşağıdaki işlevleri sağlar.

W-Friendly Projeksiyon Matrisi

Direct3D, derinlik tamponu veya sis efektlerinde derinlik tabanlı hesaplamalar yapmak için dünya, görünüm ve projeksiyon matrisleri tarafından dönüştürülmüş bir köşenin w bileşenini kullanabilir. Bunlar gibi hesaplamalar, projeksiyon matrisinizin w değerini world-space z ile eşdeğer olacak şekilde normalleştirmesini gerektirir. Kısacası, projeksiyon matrisiniz 1 olmayan bir (3,4) katsayı içeriyorsa, uygun bir matris yapmak için tüm katsayıları (3,4) katsayısının tersiyle ölçeklendirmeniz gerekir. Uyumlu bir matris sağlamazsanız, sis efektleri ve derinlik arabelleği doğru uygulanmaz.

Aşağıdaki çizimde uyumlu olmayan bir projeksiyon matrisi ve göz göreli sis etkinleştirilecek şekilde ölçeklendirilmiş aynı matris gösterilmektedir.

uyumlu olmayan projeksiyon matrisi ve göz göreli sis matrisin çizimleri

Önceki matrislerde, tüm değişkenlerin sıfır olmayan olduğu varsayılır. Gözle ilgili sis hakkında daha fazla bilgi için bkz. Eye-Relative ve Z Tabanlı Derinlik. w tabanlı derinlik arabelleğe alma hakkında bilgi için bkz. Derinlik Arabellekleri (Direct3D 9).

Direct3D, w tabanlı derinlik hesaplamalarında şu anda ayarlanmış projeksiyon matrisini kullanır. Sonuç olarak, uygulamalar dönüştürmeler için Direct3D kullanmasalar bile istenen w tabanlı özellikleri almak için uyumlu bir projeksiyon matrisi ayarlamalıdır.

Dönüşüm