Saya mempertimbangkan untuk memposting di Stack Overflow, tetapi pertanyaan itu menurut saya terlalu subyektif karena saya tidak bisa memikirkan penjelasan teknis yang masuk akal untuk pilihan Microsoft dalam hal ini. Tetapi pertanyaan ini telah menyadap saya begitu lama dan masalah terus muncul di salah satu proyek saya, dan saya belum pernah benar-benar melihat upaya untuk menjelaskan hal ini:
OpenGL menggunakan sistem koordinat tangan kanan, di mana + Z bagian dari sistem koordinat dunia meluas ke arah penonton.
DirectX menggunakan sistem kidal di mana + Z bagian dari koordinat dunia meluas ke layar, jauh dari penonton.
Saya tidak pernah menggunakan Glide API , jadi saya tidak tahu cara kerjanya, tetapi dari apa yang bisa saya kumpulkan, ia menggunakan sistem kidal juga.
Apakah ada alasan teknis untuk ini? Dan jika tidak, apakah ada beberapa keuntungan konseptual dari kemampuan sistem koordinat tertentu? Mengapa satu memilih satu dari yang lainnya?
Jawaban:
Saya tahu ini adalah posting lama, tetapi saya melihat posting ini dirujuk dan tidak menyukai nada jawaban yang dipilih.
Jadi saya melakukan sedikit penyelidikan!
Dari sini, saya dapat berspekulasi tentang beberapa hal:
Oleh karena itu, kesimpulan saya adalah:
Ketika mereka harus memilih, mereka tidak tahu standarnya, memilih sistem 'lain', dan semua orang hanya ikut dalam perjalanan. Bukan bisnis yang teduh, hanya keputusan disayangkan yang dilakukan karena kompatibilitas adalah nama permainan Microsoft.
sumber
Saya terkejut tidak ada yang menyebutkan sesuatu: OpenGL bekerja di sistem koordinat kidal juga. Paling tidak, itu terjadi ketika Anda bekerja dengan shader dan menggunakan rentang kedalaman default.
Setelah Anda membuang pipa fungsi tetap, Anda berurusan langsung dengan "ruang klip". Spesifikasi OpenGL mendefinisikan ruang klip sebagai sistem koordinat homogen 4D. Ketika Anda mengikuti transformasi melalui koordinat perangkat yang dinormalisasi, dan turun ke ruang jendela, Anda menemukan ini.
Ruang jendela berada dalam ruang piksel jendela. Asalnya di sudut kiri bawah, dengan + Y naik dan + X ke kanan. Kedengarannya sangat mirip sistem koordinat tangan kanan. Tapi bagaimana dengan Z?
Kisaran kedalaman default (glDepthRange) menetapkan nilai Z dekat ke 0 dan nilai Z jauh ke satu . Jadi + Z akan menjauh dari pemirsa.
Itu sistem koordinat kidal. Ya, Anda dapat mengubah tes kedalaman dari GL_LESS ke GL_GREATER dan mengubah glDepthRange dari [0, 1] menjadi [1, 0]. Tetapi keadaan default OpenGL adalah bekerja dalam sistem koordinat kidal . Dan tidak ada transformasi yang diperlukan untuk mendapatkan ruang jendela dari ruang klip meniadakan Z. Jadi ruang klip, output dari vertex (atau geometri) shader adalah ruang kidal (agak. Ini adalah ruang homogen 4D, jadi sulit untuk dijabarkan kidal).
Dalam pipa fungsi-tetap, matriks proyeksi standar (diproduksi oleh glOrtho, glFrustum, dan sejenisnya) semuanya berubah dari ruang tangan kanan menjadi ruang tangan kiri . Mereka membalikkan makna Z; cukup periksa matriks yang mereka hasilkan. Di ruang mata, + Z bergerak menuju pemirsa; di ruang pasca-proyeksi, ia bergerak menjauh.
Saya menduga Microsoft (dan GLide) tidak peduli untuk melakukan negasi dalam matriks proyeksi mereka.
sumber
Itu murni sejarah. Pada zaman dahulu para programmer gua-grafik awal menganggap permukaan monitor (teletype? Stonetype?) Sebagai kertas grafik dua dimensi. Dalam matematika dan rekayasa, konvensi umum untuk memplot poin data pada kertas grafik adalah: x = benar, y = naik. Lalu suatu hari, sekitar satu minggu setelah penemuan roda silikon, seseorang memikirkan grafik 3D. Ketika bola lampu ide ini berkedip di atas kepala mereka, untuk alasan apa pun, mereka memilih untuk menambahkan Z = jauh dari pemirsa. (Aduh, tangan kananku sakit hanya membayangkan itu.)
Mereka tidak tahu bahwa suatu hari nanti keturunan jauh mereka akan menjadi insinyur, ilmuwan, seniman baik, seniman komersial, animator, desainer produk dll dan menemukan grafik 3D bermanfaat. Semua orang modern yang baik ini menggunakan sistem koordinat tangan kanan agar konsisten satu sama lain dan teks matematika dan konvensi fisika yang lebih mapan.
Sungguh bodoh mendasarkan sistem koordinat 3D pada permukaan tampilan. Ini adalah model yang diperhitungkan - segitiga dan poligon dan pesawat yang menggambarkan sebuah rumah, kursi, raksasa hijau raksasa atau galaksi. Saat ini kita semua merancang dan memodelkan hal-hal dalam sistem XYZ tangan kanan, dan melakukannya dalam hal dunia model, bahkan sebelum berpikir bagaimana itu akan diberikan. Kamera ditambahkan pada beberapa titik, mungkin dibuat untuk terbang dengan cara yang gila, dan itu adalah infrastruktur yang tidak terlihat yang mengubah model menjadi piksel yang dalam perutnya harus berputar-putar dengan transformasi sistem terkoordinasi.
Hanya untuk menambah kebingungan, beberapa perpustakaan grafis mengenali bahwa CRT memindai gambar dari atas ke bawah, dan begitu juga Y = turun. Ini digunakan bahkan hari ini di semua sistem windowing dan manajer windows - X11, fvwm, gtk +, Win31 API, dll. Bagaimana sistem GUI 3D baru-suka seperti Clutter, Beryl dll berurusan dengan Z, adalah masalah terpisah dari pemodelan grafis 3D. Ini perlu perhatian hanya pemrogram aplikasi dan desainer GUI.
sumber
Keduanya pada dasarnya setara, karena yang satu dapat dengan mudah diubah menjadi yang lain. Satu-satunya keuntungan yang dapat saya temukan untuk sistem kidal adalah: karena objek lebih jauh dari pengamat, ke segala arah (x, y, atau z), jarak adalah nilai yang lebih tinggi. Tetapi saya tidak tahu apakah ini sebabnya Microsoft memilih satu dari yang lain.
POV-Ray juga menggunakan sistem koridor tangan kiri.
sumber
Pengembang utama DirectX (dan Direct3D) Alex St. John baru-baru ini mengomentari itu. Dalam sebuah artikel tentang sejarah Direct3D ia menulis:
Sumber: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/
sumber
Yang perlu dipahami adalah bahwa sejumlah besar waktu programmer telah terbuang untuk mengkonversi antara sistem koordinat kidal dan tangan kanan, dan bahkan lebih banyak waktu programmer telah terbuang untuk mengingat sistem mana yang dibutuhkan pada saat tertentu.
Semua itu hilang ketika sistem koordinat tangan kanan menjadi standar industri.
Sudah cukup banyak sistem koordinat yang digunakan secara umum, tanpa menggandakan jumlahnya dengan mengajukan pertanyaan kidal. Lihat Minkler & Minkler, "Sistem dan Transformasi Koordinat Dirgantara" . Jika Anda berada dalam bisnis koordinat aerospace, melakukan misalnya simulasi penerbangan, Anda MEMBUTUHKAN buku itu.
Dugaan saya adalah bahwa Microsoft tidak memiliki SIAPA PUN di proyek DirectX yang tahu apa-apa tentang standar industri, tidak menyadari bahwa ada standar industri, dan menganggap itu tidak masalah.
Kemungkinan lain, bahwa mereka tahu sistem tangan kanan adalah standar industri, dan mereka sengaja membuat DirectX kidal, sehingga menjadikannya SULIT bagi orang-orang untuk mengonversi kode yang menggunakan DirectX sebagai gantinya menggunakan OpenGL, tidak memihak. Jika saya mengetahui bahwa memang itulah masalahnya, saya akan merasa perlu untuk memulai karier baru yang mungkin berumur pendek sebagai pembunuh kapak di Redmond.
sumber
Bagi semua orang yang berpikir tidak ada keuntungan dari tangan kanan atau kidal, Anda sama sekali salah. Keterbatasan sistem koordinasi kartesius berasal dari definisi produk lintas vektor. Untuk XYZ dasar vektor
u
,v
danw
,w = u X v
.Definisi ini sangat mendasar untuk matematika vektor, vektor kalkulus dan banyak fisika. Misalkan Anda mencoba mensimulasikan interaksi elektromagnetik. Anda memiliki vektor medan magnet,,
M
dan partikel bermuatan bergerak di bidang itu dengan kecepatanv
. Dengan cara mana biaya dipercepat? Mudah - ke arahM X v
. Kecuali beberapa orang idiot berpikir itu akan menyenangkan untuk membuat sistem tampilan Anda kidal, sehingga mempercepat ke arah-M X v
.Pada dasarnya setiap interaksi fisik antara dua besaran vektor didefinisikan sebagai tangan kanan, dan setiap kali Anda perlu mensimulasikan interaksi itu, Anda sebaiknya berharap sistem grafis Anda menggunakan tangan kanan atau Anda harus ingat untuk membawa tanda-tanda negatif di semua matematika kamu.
sumber
0,0,1
sebagai maju dan itu kidal jadi1,0,0 X 0,1,0
make0,0,1
adalah tangan kiriM X v
tetapi medan magnetM
dianggap menunjuk ke arah yang berlawanan karena merupakan pseudovektor. Anda dapat menggunakan persamaan yang sama di kedua sistem: satu-satunya hal yang berubah adalah interpretasi Anda tentang "titik" pseudovektor. Vektor yang tepat seperti akselerasi akan selalu bekerja sama di kedua sistem koordinat. en.wikipedia.org/wiki/Pseudovector#The_right-hand_ruleJawaban nyata untuk kidal Direct3D awal adalah jauh lebih jahat daripada beberapa dari Anda berspekulasi. DirectX memulai ketika Microsoft membeli RenderMorphics pada 1995.
Pada saat itu teks grafik standar yang digunakan di kantor RenderMorphics adalah "Prinsip-prinsip Grafik Komputer Interaktif" oleh Newmann dan Sproul yang melakukan semuanya menggunakan koordinat tangan kiri. Itu buku yang sama yang saya gunakan di perguruan tinggi. Melihat kode D3D Anda bahkan bisa melihatnya menggunakan nama variabel yang cocok dengan persamaan dalam buku.
Ini bukan konspirasi Microsoft. Keputusan dibuat sebelum Microsoft bahkan datang ke dalam gambar.
sumber
Tidak ada yang pada akhirnya lebih baik daripada yang lain - Anda memetakan koordinat 3D ke permukaan 2D, sehingga dimensi ketiga (yang benar-benar membuat benda-benda 3D) dapat dipilih secara sewenang-wenang, menunjuk pada penonton atau ke layar. Anda akan memasukkan semuanya melalui matriks 4x4, jadi tidak ada alasan teknis untuk memilih satu dari yang lain. Secara fungsional, seseorang dapat berdebat:
Kesimpulan : Ada beberapa konsensus untuk sumbu X, tetapi untuk dua lainnya, kedua arah dapat diperdebatkan, menghasilkan dua konfigurasi tangan kanan dan dua tangan kiri, dan semuanya masuk akal.
sumber
Fakta yang menarik.
Direct3D (bukan DirectX - DirectX juga mencakup input, suara, dll) sebenarnya tidak memiliki sistem koordinat kidal.
Ini sangat mampu mendukung sistem RH dan LH. Jika Anda melihat dalam dokumentasi SDK Anda akan melihat fungsi-fungsi seperti D3DXMatrixPerspectiveFovLH dan D3DXMatrixPerspectiveFovRH. Keduanya berfungsi, dan keduanya menghasilkan matriks proyeksi yang dapat digunakan dengan sukses dengan sistem pilihan koordinasi Anda. Sial, Anda bahkan dapat menggunakan kolom-jurusan di Direct3D jika Anda mau; itu hanya perpustakaan matriks perangkat lunak dan Anda tidak diharuskan untuk menggunakannya. Di sisi lain, jika Anda ingin menggunakannya dengan OpenGL Anda akan menemukan bahwa itu juga bekerja dengan sangat baik dengan OpenGL juga (yang mungkin merupakan bukti pasti dari independensi perpustakaan matriks dari Direct3D itu sendiri).
Jadi jika Anda ingin menggunakan sistem Kesehatan Reproduksi dalam program Anda, cukup gunakan versi -RH dari fungsi tersebut. Jika Anda ingin menggunakan sistem LH, gunakan versi -LH. Direct3D tidak peduli. Demikian juga, jika Anda ingin menggunakan sistem LH di OpenGL - cukup glLoadMatrix sebuah matriks proyeksi LH. Tidak satu pun dari hal-hal ini yang penting dan itu tidak mendekati masalah besar yang kadang-kadang Anda lihat dibuat.
sumber
Tidak ada keuntungan teknis untuk kedua tangan, itu sepenuhnya sewenang-wenang. Keduanya bekerja dengan baik selama Anda konsisten.
Karena keuntungan dari konsistensi, idealnya seseorang harus "menggunakan apa yang orang lain gunakan" —tapi itu cukup sulit dalam banyak kasus, karena tidak ada konvensi yang sangat "disukai" dalam praktiknya: kedua kidal digunakan secara luas. Paling-paling, ada beberapa konsistensi dalam komunitas tertentu (misalnya OpenGL).
Jadi saya pikir jawaban dasar untuk pertanyaan ini adalah: Mereka memilih apa yang mereka pilih karena rasanya benar (tidak diragukan mereka memiliki pengalaman sebelumnya dengan kesewenang-wenangan itu) dan ada sedikit alasan untuk tidak melakukannya.
Pada akhirnya tidak ada bedanya — siapa pun yang serius ingin bertukar aset / kode dengan sistem / komunitas lain harus siap untuk berurusan dengan konversi wenangan, karena itu adalah fakta kehidupan dalam grafik 3D.
sumber
Memberikan ini sebagai bahan pelengkap untuk jawaban saya sebelumnya di sini. Dari spesifikasi OpenGL lama dari tahun 1990-an:
(sumber: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).
Jadi, karena baik D3D maupun OpenGL tidak memaksakan kesewenang-wenangan, pertanyaan sebenarnya adalah: mengapa orang melihat ini sebagai masalah besar?
sumber
Aku benci mengatakannya padamu, tetapi 'tangan' dari set koordinat sebenarnya subyektif - itu tergantung pada cara Anda membayangkan Anda melihat sesuatu. Contoh, dari spec peta kubus OpenGL: jika Anda membayangkan berada di dalam kubus melihat keluar, sistem koordinat adalah kidal, jika Anda berpikir untuk melihat dari luar itu adalah tangan kanan. Fakta sederhana ini menyebabkan kesedihan yang tak berkesudahan, karena untuk mendapatkan jawaban yang benar secara numerik, semua asumsi Anda harus konsisten, meskipun secara lokal tidak masalah asumsi mana yang Anda buat.
Spesifikasi OpenGL secara resmi "kidal netral" dan berusaha keras untuk menghindari masalah ini - yaitu, menundanya ke programmer. Namun ada "perubahan tangan" antara koordinat mata dan koordinat klip: dalam model dan ruang mata yang kita cari, dalam ruang klip dan perangkat yang kita cari. Saya selalu berjuang dengan konsekuensi dari komplikasi yang tidak disengaja ini.
Produk silang adalah teman kami, karena memungkinkan Anda menghasilkan sistem koordinat 3D tangan kanan atau kiri dari sepasang vektor. Tapi tangan mana itu tergantung pada vektor mana yang Anda sebut "X".
sumber
Saya dapat mengatakan bahwa standar industri salah sejak awal
Standar industri koordinat sebenarnya berasal dari koordinat meja, ketika orang menggambar semuanya di atas meja, yaitu bidang horizontal. X adalah kiri / kanan dan Y adalah depan / belakang, jadi itu membuat Z menjadi ke atas dan lahirlah Sistem Koordinat Tangan Kanan
Tapi Anda tahu, Kami sekarang menggunakan layar monitor. Ini adalah bidang vertikal. X masih kiri / kanan tetapi Y adalah atas dan bawah sebagai gantinya
Jadi apa yang akan menyebabkan Sistem Koordinasi Tangan Kanan? Itu membuat + Z mundur dan -Z maju. Apa-apaan ini? Atas adalah + dan Bawah adalah - Kanan adalah + dan Kiri adalah - TAPI Maju adalah - dan Mundur adalah + ??? Sangat bodoh jika kita membuat game yang karakternya berjalan di dunia 3D tetapi kita perlu minus z untuk maju. Karena itulah programmer game paling menghargai DirectX
Untuk mengambil standar yang datang dari meja dan menggunakannya pada monitor sangat salah di banyak tingkat dari tempat pertama. Dan sekarang kita harus mengakui bahwa mereka, OpenGL dan Industri, salah. Mereka hanya menggunakan apa yang mereka pikir akan membuat mereka nyaman tetapi mereka salah dan Sistem Koordinasi Tangan Kanan hanyalah warisan sampah yang harus dibuang secepat mungkin
sumber