Ketika membaca tentang komputer grafis, Anda selalu lari ke datatype menyebutkan Matrix. Biasanya, ini adalah matriks 4x4 floating-point nilai, digunakan untuk melakukan transformasi afin untuk grafis (scaling, rotasi, terjemahan, kadang-kadang geser).
Namun, ada setidaknya dua konvensi yang berbeda untuk bagaimana menerapkan matriks ke vektor (simpul dan normals) yang membentuk blok bangunan grafis 3D. Sebuah titik diperpanjang untuk 4 - vektor dengan memaku pada "1" (terjemahan ini memungkinkan untuk bekerja); normal diperluas ke vektor 4-by memaku pada "0" (ini berarti bahwa hanya bagian non-terjemahan akan berlaku). Sejauh ini, begitu baik. Tapi apakah itu 4-vektor vektor baris atau vektor kolom? (Dan itu akan lebih baik bila matriks disimpan dalam memori).
Pertimbangkan dua kasus:
M11 M12 M13 M14 x M21 M22 M23 M24 y M31 m32 m33 m34 z M41 M42 M43 M44 1Kasus 1: vektor kolom di kanan
M11 M12 M13 M14 M21 M22 M23 M24 xyz 1 M31 m32 m33 m34 M41 M42 M43 M44Kasus 2: vektor baris di kiri
Dalam kasus pertama, kolom vektor di sebelah kanan, terjemahan operasi hidup dalam elemen matriks M14, M24 dan m34. Namun, dalam kasus kedua, terjemahan hidup dalam elemen M41, M42 dan M43. Jadi, ketika Anda melihat matriks ditulis, Anda harus mengambil waktu untuk mempertimbangkan di mana orientasi Anda seharusnya membacanya. Sayangnya, kertas dan dokumentasi yang menulis tentang matriks jarang mempertimbangkan bahwa ada dua konvensi, dan cenderung hanya berasumsi bahwa Anda tahu yang mana yang Anda maksud.
Matematika tradisional, dan OpenGL, cenderung untuk memilih vektor Colum. Sementara itu, warisan tertentu lainnya komputer grafis, serta DirectX, cenderung memilih vektor baris, di sebelah kiri. Kebingungan mendapatkan bahkan lebih lengkap ketika Anda mulai berbicara tentang "pra-mengalikan" dan "pasca-mengalikan" matriks. Pra-mengalikan bisa berarti mengalikannya di sebelah kiri (jika Anda tipe vektor baris), atau mungkin berarti mengalikannya di sebelah kanan (jika Anda tipe OpenGL) - jika dengan "pra" Anda berarti bahwa pra-operasi dikalikan terjadi sebelum operasi matriks sasaran. Jika bukan Anda maksud, dengan pra-multplying, bahwa matriks Anda pra-mengalikan berjalan di sebelah kiri, maka itu berarti bahwa hal itu terjadi setelah dalam notasi OpenGL, tetapi masih berarti bahwa hal itu terjadi sebelumnya dalam notasi DirectX.
Bingung belum?
Jadi, kita datang ke matriks menyimpan dalam memori. Tentu saja ada dua cara untuk menyimpan matriks - mereka dapat disimpan dalam urutan M11 M12 M13 M14 M21 ..., atau mereka dapat disimpan dalam urutan M11 M21 M31 M41 M12 ... Versi pertama disebut "baris utama" karena Anda dapat melihat itu sebagai menyimpan satu baris pada suatu waktu. Versi kedua disebut "kolom besar" karena Anda dapat melihat itu sebagai menyimpan satu kolom pada suatu waktu.
Jadi, jika Anda diberi matriks sebagai array mengapung dalam memori, atau sebagai urutan mengapung pada halaman web, Anda perlu tahu baik yang konvensi vektor diasumsikan untuk matriks, DAN format penyimpanan yang digunakan untuk matriks . Namun, seperti nasib itu, kesalahan dalam satu, akan membatalkan kesalahan dalam lainnya. Sebuah matriks baris-utama ditujukan untuk vektor-vektor baris akan bekerja, seperti apa adanya dalam memori, hanya sebagai baik untuk vektor kolom jika Anda hanya menganggap itu disimpan dalam kolom-besar pesanan.
Dan, coba tebak? OpenGL mengasumsikan matriks utama Colum; DirectX mengasumsikan matriks-matriks baris utama. Ini berarti bahwa terjemahan, dalam matriks dilihat sebagai array float, akan selalu dalam elemen pada indeks 12, 13 dan 14 dalam matriks dalam memori (dimana indeks berada dalam kisaran 0 .. 15), baik OpenGL atau DirectX . Lokasi-lokasi peta untuk M41, M42 dan M43 dalam konvensi DirectX, dan M14, M24, m34 di konvensi OpenGL. Wah! Anda mungkin benar-benar memiliki sesuatu yang salah dalam kode Anda, tetapi karena Anda telah salah-memahami konvensi, kesalahan interpretasi tambahan meniadakan kesalahan pertama, dan semuanya bekerja keluar.
Kiri-Kanan dan tangan matriks
Ada rumor ini terus-menerus bahwa ada "kidal" dan "tangan kanan" matriks. Itu tidak benar. Dalam sistem koordinat kidal, rotasi dari vektor X 90 derajat sekitar proyek sumbu Z untuk vektor Y. Dalam sistem koordinat tangan kanan, rotasi dari vektor X 90 derajat sekitar proyek sumbu Z untuk vektor Y. Matematika adalah sama; matriks adalah sama. Satu-satunya perbedaan adalah interpretasi dari data sekali Anda mendapatkannya keluar - Z lebih besar berarti lebih dekat dengan pemirsa di Y-up, X-kanan-kanan sistem koordinat, namun lebih jauh ke layar dalam sistem koordinat kidal . Jika matriks Anda mencoba untuk beberapa-bagaimana sesuatu yang berbeda untuk menggunakan kanan dan kiri tangan, baik itu akan berakhir berputar dalam arah yang berlawanan dari apa yang Anda harapkan, atau akan berakhir mirroring seluruh geometri. Jika Anda memiliki tangan kanan data, dan ingin menampilkan dalam sebuah sistem koordinat kidal, itulah apa yang Anda inginkan, tetapi Anda harus menyatakan bahwa sebagai matriks cermin eksplisit bahwa baik meniadakan satu baris (atau kolom :-), atau membalik dua baris (atau kolom) dari matriks identitas.Matriks di perpustakaan ODE
Para ODE fisika perpustakaan adalah yang paling baik didukung sumber kaku membuka tubuh dinamika paket Anda dapat menemukan, sejauh yang saya tahu. Karena Anda dapat beberapa hal data dalam (kotak, pesawat, bola, segitiga dll jerat), koefisien ditetapkan, dan membuatnya "pergi", itu populer di kalangan mereka yang berusaha untuk menciptakan berbagai jenis permainan. Namun, setelah Anda melakukan simulasi, Anda harus mengambil data keluar, dan menampilkannya.Dokumentasi ODE tidak banyak menggunakan vektor atau matriks dalam mencetak sama sekali, jadi sulit untuk mengatakan apakah itu bermaksud untuk menggunakan vektor baris atau vektor kolom. Namun, penyimpanan matriks rotasi seperti itu, bahwa terjemahan (harus itu dalam matriks), akan tinggal di offset 3, 7 dan 11. (ODE tidak benar-benar melihat nilai-nilai ini, itu membuat mereka un-menyentuh karena alasan keselarasan). Ini berarti bahwa Anda harus transpos matriks Anda keluar dari ODE, jika Anda ingin menempatkan kembali ke OpenGL atau DirectX, karena kombinasi konvensi dan penyimpanan untuk ODE bekerja untuk menjadi kebalikan dari itu kombinasi yang sama untuk dua yang terakhir .
Sementara itu, ODE juga menyimpan quaternions unit (lain representasi dari bagian murni rotasi matriks) dalam urutan WXYZ, yang merupakan konvensi yang lebih tua, sedangkan perpustakaan yang paling modern menggunakan quaternions dalam rangka XYZW. Goes untuk menunjukkan bahwa di mana pun ada standar, ada lagi standar yang tidak dengan cara lain sekitar - memilih satu dan klaim Anda sesuai standar! Hanya, mohon, secara eksplisit negara yang standar yang Anda pilih.
kita juga punya nih artikel mengenai OpenGL, silahkan dikunjungi dan dibaca untuk menambah wawasan, berikut linknya
BalasHapushttp://repository.gunadarma.ac.id/bitstream/123456789/2325/1/Texture%20Mapping%20for%20Solar%20System%20Simulation(OpenGL%20Implementation).pdf
trimakasih
kita juga punya nih artikel mengenai 'OpenGL', silahkan dikunjungi dan dibaca , berikut linknya
BalasHapushttp://repository.gunadarma.ac.id/bitstream/123456789/2293/1/Differences%20Of%20Cube%20Mapping%20and%20Dynamic%20Cube%20Mapping.pdf
terimakasih