Aracılığıyla paylaş


Dönüşümler (Direct3D 9)

Direct3D'nin sabit işlevli geometri işlem hattı üzerinden geometriyi iten kısmı dönüşüm altyapısıdır. Dünyadaki modeli ve görüntüleyiciyi bulur, ekranda görüntülenmek üzere köşeleri projeler ve görünüm penceresine köşeleri klipler. Dönüşüm altyapısı ayrıca her köşedeki dağınıklığı ve belirtik bileşenleri belirlemek için aydınlatma hesaplamaları gerçekleştirir.

Geometri işlem hattı giriş olarak köşeleri alır. Dönüşüm altyapısı dünyayı, görünümü ve projeksiyonu köşelere uygular, sonucu klipler ve her şeyi rasterleştiriciye geçirir.

İşlem hattının başında, modelin köşeleri yerel koordinat sistemine göre bildirilir. Bu, yerel bir kaynak ve yönlendirmedir. Koordinatların bu yönü genellikle model alanı olarak adlandırılır ve tek tek koordinatlar model koordinatları olarak adlandırılır.

Geometri işlem hattının ilk aşaması, modelin köşelerini yerel koordinat sisteminden bir sahnedeki tüm nesneler tarafından kullanılan koordinat sistemine dönüştürür. Köşeleri yeniden boyutlandırma işlemine dünya dönüşümü denir. Bu yeni yönlendirme genellikle dünya uzayı olarak adlandırılır ve dünya uzayı içindeki her köşe dünya koordinatları kullanılarak bildirilir.

Sonraki aşamada, 3B dünyanızı tanımlayan köşeler bir kameraya göre yönlendirilir. Yani, uygulamanız sahne için bir bakış açısı seçer ve dünya uzay koordinatları yeniden konumlandırılır ve kameranın görünümü etrafında döndürülür ve dünya alanını kamera alanına dönüştürür. Bu, görünüm dönüşümüdür.

Sonraki aşama projeksiyon dönüşümüdür. İşlem hattının bu bölümünde, nesneler genellikle bir sahnenin derinlik yanılsamasını sağlamak için görüntüleyiciden uzaklıklarıyla ilişkili olarak ölçeklendirilir; yakın nesneler uzak nesnelerden daha büyük görünecek şekilde yapılır ve bu şekilde devam eder. Kolaylık olması için, bu belge projeksiyon dönüşümünden sonra projeksiyon alanı olarak köşelerin bulunduğu alanı ifade eder. Bazı grafik kitapları projeksiyon alanını post-perspektif homojen boşluk olarak adlandırabilir. Tüm projeksiyon dönüşümleri, bir sahnedeki nesnelerin boyutunu ölçeklendirmez. Bunun gibi bir projeksiyon bazen afin veya ortogonal projeksiyon olarak adlandırılır.

İşlem hattının son bölümünde, ekranda görünmeyecek tüm köşeler kaldırılır, böylece rasterleştiricinin renkleri ve gölgelendirmeyi asla görünmeyecek bir şey için hesaplaması zaman almaz. Bu işleme kırpma adı verilir. Kırpmadan sonra kalan köşeler görünüm penceresi parametrelerine göre ölçeklendirilir ve ekran koordinatlarına dönüştürülür. Sahne rasterleştirildiğinde ekranda görülen sonuçta elde edilen köşeler, ekran alanında bulunur.

Dönüşümler, nesne geometrisini bir koordinat alanından diğerine dönüştürmek için kullanılır. Direct3D, 3B dönüşümler gerçekleştirmek için matrisleri kullanır. Bu bölümde matrislerin 3B dönüşümleri nasıl oluşturduğu açıklanır, dönüşümler için bazı yaygın kullanımlar açıklanır ve birden çok dönüşümü kapsayan tek bir matris oluşturmak için matrisleri nasıl birleştirebileceğiniz açıklanır.

Matris Dönüşümleri

3B grafiklerle çalışan uygulamalarda, aşağıdakileri yapmak için geometrik dönüşümleri kullanabilirsiniz:

  • Bir nesnenin konumunu başka bir nesneye göre ifade edin.
  • Nesneleri döndürme ve boyutlandırma.
  • Görüntüleme konumlarını, yol tariflerini ve perspektifleri değiştirin.

Aşağıdaki denklemde gösterildiği gibi 4x4 matrisi kullanarak herhangi bir noktayı (x,y,z) başka bir noktaya (x', y', z') dönüştürebilirsiniz.

Herhangi bir noktayı başka bir noktaya dönüştürme denklemini

Noktayı (x', y', z') oluşturmak için (x, y, z) ve matris üzerinde aşağıdaki denklemleri gerçekleştirin.

Yeni nokta

En yaygın dönüşümler çeviri, döndürme ve ölçeklendirmedir. Aynı anda birkaç dönüşümü hesaplamak için bu efektleri oluşturan matrisleri tek bir matriste birleştirebilirsiniz. Örneğin, bir dizi noktayı çevirmek ve döndürmek için tek bir matris oluşturabilirsiniz.

Matrisler satır-sütun sırasına göre yazılır. Tekdüzen ölçeklendirme olarak bilinen her eksendeki köşeleri eşit olarak ölçeklendirerek matematiksel gösterimi kullanan matris aşağıdaki matrisle temsil edilir.

Tekdüzen ölçeklendirmedenklemi

C++ dilinde Direct3D, D3DMATRIX yapısını kullanarak matrisleri iki boyutlu bir dizi olarak bildirir. Aşağıdaki örnekte, tekdüzen ölçeklendirme matrisi olarak hareket etmek için D3DMATRIX yapısının nasıl başlatılması gösterilmektedir.

// In this example, s is a variable of type float.

D3DMATRIX scale = {
    s,               0.0f,            0.0f,            0.0f,
    0.0f,            s,               0.0f,            0.0f,
    0.0f,            0.0f,            s,               0.0f,
    0.0f,            0.0f,            0.0f,            1.0f
};

Çevir

Aşağıdaki denklem, noktayı (x, y, z) yeni bir noktaya (x', y', z') çevirir.

Yeni bir nokta

C++ dilinde el ile bir çeviri matrisi oluşturabilirsiniz. Aşağıdaki örnekte köşeleri çevirmek için matris oluşturan bir işlevin kaynak kodu gösterilmektedir.

D3DXMATRIX Translate(const float dx, const float dy, const float dz) {
    D3DXMATRIX ret;

    D3DXMatrixIdentity(&ret);
    ret(3, 0) = dx;
    ret(3, 1) = dy;
    ret(3, 2) = dz;
    return ret;
}    // End of Translate

Kolaylık sağlamak için D3DX yardımcı programı kitaplığı D3DXMatrixTranslationişlevinisağlar.

Ölçeklemek

Aşağıdaki denklem, noktayı (x, y, z) x-, y ve z yönlerindeki rastgele değerlere göre yeni bir noktaya (x', y', z') ölçeklendirir.

Yeni bir nokta

Döndürmek

Burada açıklanan dönüşümler solak koordinat sistemleri içindir ve bu nedenle başka bir yerde gördüğünüz dönüşüm matrislerinden farklı olabilir.

Aşağıdaki denklem, noktayı (x, y, z) x ekseni çevresinde döndürerek yeni bir nokta (x', y', z') oluşturur.

Yeni bir nokta

Aşağıdaki denklem, noktayı y ekseni etrafında döndürür.

Yeni bir nokta

Aşağıdaki denklem, noktayı z ekseni etrafında döndürür.

Yeni bir nokta

Bu örnek matrislerde, Yunanca teta harfi radyan cinsinden döndürme açısını ifade eder. Dönüş ekseni boyunca çıkış noktası boyunca bakılırken açılar saat yönünde ölçülür.

C++ uygulamasında D3DXMatrixRotationX, D3DXMatrixRotationYve D3DX yardımcı programı kitaplığı tarafından sağlanan D3DXMatrixRotationZ işlevlerini kullanarak döndürme matrisleri oluşturun. Aşağıda D3DXMatrixRotationX işlevinin kodu yer alır.

D3DXMATRIX* WINAPI D3DXMatrixRotationX
    ( D3DXMATRIX *pOut, float angle )
{
#if DBG
    if(!pOut)
        return NULL;
#endif

    float sin, cos;
    sincosf(angle, &sin, &cos);  // Determine sin and cos of angle

    pOut->_11 = 1.0f; pOut->_12 =  0.0f;   pOut->_13 = 0.0f; pOut->_14 = 0.0f;
    pOut->_21 = 0.0f; pOut->_22 =  cos;    pOut->_23 = sin;  pOut->_24 = 0.0f;
    pOut->_31 = 0.0f; pOut->_32 = -sin;    pOut->_33 = cos;  pOut->_34 = 0.0f;
    pOut->_41 = 0.0f; pOut->_42 =  0.0f;   pOut->_43 = 0.0f; pOut->_44 = 1.0f;

    return pOut;
}

Matrisleri Birleştirme

Matrisleri kullanmanın bir avantajı, iki veya daha fazla matrisin etkilerini çarparak birleştirebilmenizdir. Başka bir deyişle, bir modeli döndürmek ve ardından bir konuma çevirmek için iki matris uygulamanız gerekmez. Bunun yerine, döndürme ve çeviri matrislerini çarparak tüm etkilerini içeren bir bileşik matris oluşturursunuz. Matris birleştirme olarak adlandırılan bu işlem aşağıdaki denklemle yazılabilir.

Matris birleştirme

Bu denklemde C, oluşturulan bileşik matristir ve Mn aracılığıyla M₁ tek tek matrislerdir. Çoğu durumda, yalnızca iki veya üç matris birleştirilir, ancak sınır yoktur.

Matris çarpmasını gerçekleştirmek için D3DXMatrixMultiply işlevini kullanın.

Matris çarpmasının gerçekleştirildiği sıra çok önemlidir. Yukarıdaki formül, matris birleştirmenin soldan sağa kuralını yansıtır. Yani, bileşik matris oluşturmak için kullandığınız matrislerin görünür etkileri soldan sağa sırada gerçekleşir. Aşağıdaki örnekte tipik bir dünya matrisi gösterilmiştir. Stereotipik uçan daire için dünya matrisi oluşturduğunuzu düşünün. Uçan daireyi muhtemelen merkezinde (model alanının y ekseni) döndürmek ve sahnenizdeki başka bir konuma çevirmek istersiniz. Bu etkiyi gerçekleştirmek için önce bir döndürme matrisi oluşturur ve ardından aşağıdaki denklemde gösterildiği gibi bunu bir çeviri matrisi ile çarpabilirsiniz.

Döndürme matrisi ve çeviri matrisi

Bu formülde Ry y ekseniyle ilgili döndürme matrisidir ve Tw, dünya koordinatlarındaki bazı konumlara yönelik bir çeviridir.

matrisleri çarpma sırası önemlidir, çünkü iki skaler değeri çarpmaktan farklı olarak matris çarpması değişmez değildir. Matrislerin ters sırada çarpılması, uçan daireyi dünya uzay konumuna çevirmenin ve ardından dünya kökeni çevresinde döndürmenin görsel etkisine sahiptir.

Ne tür bir matris oluşturursanız oluşturun, beklenen etkilere ulaşmanızı sağlamak için soldan sağa kuralını unutmayın.

Başlarken