it-swarm-id.com

Mengapa DirectX menggunakan sistem koordinat kidal?

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 dalam layar, jauh dari penampil .

Saya tidak pernah menggunakan Glide API , jadi saya tidak tahu cara kerjanya, tetapi dari apa yang saya dapat kumpulkan, ia menggunakan sistem kidal juga.

Apakah ada alasan teknis untuk ini? Dan jika tidak, apakah ada beberapa keuntungan konseptual terhadap kemampuan sistem koordinat tertentu? Mengapa satu memilih satu dari yang lain?

52
greyfade

Saya tahu ini adalah posting lama, tetapi saya melihat posting ini dirujuk dan tidak menyukai nada jawaban yang dipilih.

Jadi saya melakukan sedikit penyelidikan!

  1. DirectX adalah old. Ini pertama kali dirilis pada tahun 1995, ketika dunia memiliki lebih dari Nvidia dan ATI , DirectX vs OpenGL. Itu lebih dari 15 tahun, kawan.
  2. dfx Interactive's Glide (salah satu pesaing DirectX saat itu. OpenGL tidak dimaksudkan untuk bermain game saat itu) menggunakan sistem koordinat kidal.
  3. POV-Ray dan RenderMan (perangkat lunak render Pixar), juga menggunakan sistem koordinat kidal.
  4. DirectX 9+ dapat bekerja dengan kedua sistem koordinat.
  5. Keduanya WPF dan XNA (yang bekerja dengan DirectX di bawah layar) menggunakan hak - Sistem koordinat tangan.

Dari sini, saya dapat berspekulasi tentang beberapa hal:

  • Standar industri tidak standar seperti yang orang suka.
  • Direct3D dibangun dalam waktu semua orang melakukan sesuatu dengan caranya sendiri, dan para pengembang mungkin tidak tahu yang lebih baik.
  • Kidal adalah opsional, tetapi biasa di dunia DirectX.
  • Karena konvensi menjadi sulit, semua orang berpikir DirectX hanya dapat bekerja dengan kidal.
  • Microsoft akhirnya belajar, dan mengikuti standar dalam setiap API baru yang mereka buat.

Oleh karena itu, kesimpulan saya adalah:

Ketika mereka harus memilih, mereka tidak tahu standar, 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.

64
Kyte

Saya terkejut tidak ada yang menyebutkan sesuatu: OpenGL bekerja di sistem koordinat kidal juga. Setidaknya, 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. The Origin berada di sudut kiri bawah, dengan + Y naik dan + X ke kanan. Itu terdengar 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 sat. Jadi + Z akan berjalan jauh 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 default keadaan OpenGL adalah untuk bekerja dalam kidal sistem koordinasi. 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 kidal satu. Mereka membalikkan makna Z; cukup periksa matriks yang mereka hasilkan. Di ruang mata, + Z bergerak ke arah penonton; di ruang pasca-proyeksi, ia bergerak menjauh.

Saya menduga Microsoft (dan GLide) tidak peduli untuk melakukan negasi dalam matriks proyeksi mereka.

37
Nicol Bolas

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 = menjauh 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, perancang 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 gila, dan itu adalah infrastruktur tak 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 windows manajer - 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.

11
DarenW

Keduanya pada dasarnya setara, karena yang satu dapat dengan mudah diubah ke 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.

10
tcrosley

pengembang utama dari DirectX (dan Direct3D) Alex St. John baru-baru ini mengomentari itu. Dalam sebuah artikel tentang sejarah Direct3D ia menulis:

Saya [...] diminta untuk memilih wewenang untuk Direct3D API. Saya memilih sistem koordinat tangan kiri, sebagian dari preferensi pribadi . [...] itu adalah pilihan sewenang-wenang .

Sumber: http://www.alexstjohn.com/WP/2013/07/22/the-evolution-of-direct3d/

10
Daniel Rikowski

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 Aerospace" . Jika Anda berada dalam bisnis koordinat kedirgantaraan, lakukan mis. simulasi penerbangan, Anda [~ # ~] perlu [~ # ~] 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 dengan 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.

5
John R. Strohm

Jawaban 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. Ini buku yang sama yang saya gunakan di kampus. 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.

5
Stephen Coy

Bagi semua orang yang berpikir tidak ada keuntungan dari tangan kanan atau kidal, Anda sama sekali salah. Keterbatasan sistem koordinat Cartesian berasal dari definisi produk lintas vektor. Untuk vektor basis XYZ u, v dan w, w = u X v.

Definisi ini mendasar untuk matematika vektor, vektor kalkulus dan banyak fisika. Misalkan Anda mencoba mensimulasikan interaksi elektromagnetik. Anda memiliki vektor medan magnet, M, dan partikel bermuatan yang bergerak di bidang itu dengan kecepatan v. Dengan cara mana biaya dipercepat? Mudah - ke arah M X v. Kecuali beberapa orang bodoh 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.

5
Tom

Tidak ada yang pada akhirnya lebih baik dari 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 lainnya. Secara fungsional, seseorang dapat berdebat:

  • Ada konsensus yang cukup luas dalam bidang komputasi dan bidang lainnya untuk menjalankan sumbu X dari kiri ke kanan (aviasi tampaknya menjadi pengecualian yang menonjol).
  • Dalam matematika, sumbu Y mengarah ke atas. (Juga, Naik Adalah Tempat Gelembung Pergi).
  • Pada layar komputer, sumbu Y menunjuk ke bawah (karena itulah cara layar CRT bekerja, dan juga karena itulah urutan sebagian besar skrip manusia mengatur baris).
  • Ketika Anda melihat sisi "terlihat" dari permukaan pada bidang X/Y, yang normal harus mengarah ke penonton (seperti ketika Anda melihat rekaman satelit; "ketinggian di atas permukaan laut" menunjuk ke satelit, bukan di pusat Bumi). Karena normal untuk bidang X/Y adalah vektor sumbu Z, maka poros Z juga harus mengarah ke penampil.
  • Saat Anda melihat gambar 3D di layar komputer, titik yang jauh dari pemirsa harus memiliki komponen Z yang lebih besar. Oleh karena itu, sumbu Z harus mengarah ke layar.

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.

3
tdammers

Fakta yang menarik.

Direct3D (bukan DirectX - DirectX juga mencakup input, suara, dll) sebenarnya tidak memiliki sistem koordinat kidal.

Ini sangat mampu mendukung kedua sistem RH dan LH. Jika Anda melihat dalam dokumentasi SDK Anda akan melihat fungsi-fungsi seperti D3DXMatrixPerspectiveFovLH dan D3DXMatrixPerspectiveFovRH. Keduanya bekerja, dan keduanya menghasilkan matriks proyeksi yang dapat digunakan dengan sukses dengan sistem koordinat pilihan 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. Sebaliknya, 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 - hanya glLoadMatrix an LH matriks proyeksi. Tak satu pun dari hal-hal ini yang penting dan tidak ada di dekat masalah besar yang kadang-kadang Anda lihat dibuat.

3
Maximus Minimus

Memberikan ini sebagai bahan pelengkap untuk jawaban saya sebelumnya di sini. Dari spesifikasi OpenGL lama dari tahun 1990-an:

OpenGL tidak memaksa kidal atau kidal pada salah satu sistem koordinatnya.

(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?

0
Maximus Minimus

Tidak ada keunggulan 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 (mis. OpenGL).

Jadi saya pikir jawaban dasar untuk pertanyaan ini adalah: Mereka memilih apa yang mereka pilih karena rasanya benar (tidak diragukan lagi mereka memiliki pengalaman sebelumnya dengan kidal 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 menghadapi konversi wenangan, karena itu adalah fakta kehidupan dalam grafik 3D.

0
snogglethorpe