it-swarm.dev

DirectX neden solak bir koordinat sistemi kullanıyor?

Stack Overflow'da yayınlamayı düşündüm, ancak Microsoft'un bu konudaki seçimi için makul bir teknik açıklama düşünemediğim için soru bana çok öznel geliyor. Ama bu soru beni çok uzun bir süre rahatsız etti ve sorun projelerimden birinde ortaya çıkıyor ve aslında bunu açıklamak için hiç bir girişim görmedim:

OpenGL , dünya koordinat sisteminin + Z bölümünün izleyiciye doğru uzandığı bir sağ elle koordinat sistemi kullanır.

DirectX , dünya koordinatının + Z bölümünün ekrana izleyiciden uzağa (- === -) uzandığı solak bir sistem kullanır .

Ben asla Glide API kullanmadım, bu yüzden nasıl çalıştığını bilmiyorum, ama toplayabildiğim kadarıyla, solak bir sistem de kullanıyor.

Bunun teknik bir nedeni var mı? Ve değilse, bir koordinat sisteminin belirli bir elle tutulması için bazı kavramsal avantajlar var mı? Neden biri diğerini seçsin?

52
greyfade

Bu eski bir yazı olduğunu biliyorum, ama bu yazı referans ve gördüm cevap gelen kişinin sesi sevmediğini gördüm.

Bu yüzden biraz araştırma yaptım!

  1. DirectX eski. İlk kez 1995'te, dünyanın Nvidia ve ATI , DirectX ve OpenGL'den çok daha fazla olduğu zaman piyasaya sürüldü. 15 yıldan fazla, insanlar.
  2. dfx Interactive's Glide (o günlerde DirectX'in rakiplerinden biri. O zaman OpenGL oyun için değildi) solak bir koordinat sistemi kullandı.
  3. POV-Ray ve RenderMan (Pixar'ın oluşturma yazılımı), ayrıca solak bir koordinat sistemi kullanın.
  4. DirectX 9+ her iki koordinat sistemiyle de çalışabilir.
  5. Hem WPF ve XNA (sahnelerde DirectX ile çalışan) bir hak kullanır elle koordinat sistemi.

Bundan birkaç şey hakkında spekülasyon yapabilirim:

  • Endüstri standartları, insanlar gibi standart değildir.
  • Direct3D , herkesin kendi yollarını yaptığı bir zamanda inşa edildi ve geliştiriciler muhtemelen daha iyisini bilmiyordu.
  • Solaklık isteğe bağlıdır, ancak DirectX dünyasında gelenekseldir.
  • Sözleşmeler zor gittiğinden, herkes DirectX'in yalnızca sol el ile çalışabileceğini düşünüyor.
  • Microsoft sonunda öğrendikleri yeni API'larda standardı öğrendi ve izledi.

Bu nedenle, benim sonucum:

Seçmek zorunda kaldıklarında, standardı bilmiyorlardı, 'diğer' sistemi seçtiler ve herkes sürüşe devam etti. Gölgeli bir iş yok, sadece talihsiz bir tasarım kararı verildi, çünkü geriye dönük uyumluluk Microsoft'un oyununun adı.

64
Kyte

Kimsenin bir şeyden bahsetmediğine şaşırdım: OpenGL solak bir koordinat sisteminde de çalışıyor. En azından gölgelendiricilerle çalışırken ve varsayılan derinlik aralığını kullandığınızda bunu yapar.

Sabit işlevli boru hattını attığınızda, doğrudan "klip-alanı" ile ilgilenirsiniz. OpenGL Spesifikasyonu, klips alanını 4D homojen bir koordinat sistemi olarak tanımlar. Dönüşümleri normalleştirilmiş cihaz koordinatları üzerinden takip ettiğinizde ve pencere alanına inerken bunu görürsünüz.

Pencere alanı, bir pencerenin pikselleri alanındadır. Orijin sol alt köşede, + Y yukarı ve + X sağa gidiyor. Kulağa sağ elini kullanan bir koordinat sistemi gibi geliyor. Peki ya Z?

Varsayılan derinlik aralığı (glDepthRange), yakın Z değerini 0 ve uzak Z değerini one olarak ayarlar. Böylece + Z izleyiciden zakta gidiyor.

Bu solak bir koordinat sistemidir. Evet, derinlik testini GL_LESS yerine GL_GREATER olarak değiştirebilir ve glDepthRange öğesini [0, 1] yerine [1, 0] olarak değiştirebilirsiniz. Ancak OpenGL'nin varsayılan durumu, solak ( koordinat sistemi. Ve klip uzayından pencere alanına ulaşmak için gerekli olan dönüşümlerin hiçbiri Z'yi yok etmez. Yani klip alanı, tepe (veya geometri) gölgelendiricinin çıktısı solak bir alan (biraz. 4D homojen bir alan, bu yüzden eli uzatmak zor).

Sabit işlevli boru hattında, standart projeksiyon matrislerinin (glOrtho, glFrustum ve benzerleri tarafından üretilen) tümü sağ elle kullanılan bir alandan sola dönüşür bir. Z'nin anlamını çeviriyorlar; sadece ürettikleri matrisleri kontrol edin. Göz boşluğunda + Z izleyiciye doğru hareket eder; projeksiyon sonrası alanda uzaklaşır.

Microsoft'un (ve GLide'nin) projeksiyon matrislerindeki olumsuzluğu gerçekleştirmek için uğraşmadığından şüpheleniyorum.

37
Nicol Bolas

Saf bir tarih. Eski günlerde ilk mağara grafik programcıları monitör (teletip? Stonetype?) Görüntüleme yüzeyini iki boyutlu grafik kağıdı olarak düşündüler. Matematik ve mühendislikte veri kağıtlarını grafik kağıdına çizmek için olağan kurallar: x = sağ, y = yukarı. Sonra bir gün, silikon tekerleğin icatından yaklaşık bir hafta sonra, biri 3D grafikler düşündü. Bu fikrin mum ampulü başlarının üstünde yanıp söndüğünde, her ne nedenle olursa olsun, Z = izleyiciden uzağa eklemeyi seçerler. (Ah, sağ elim sadece bunu hayal etmekte acıyor.)

Bir gün uzak torunlarının mühendisler, bilim adamları, güzel sanatçılar, ticari sanatçılar, animatörler, ürün tasarımcıları vb. Olacağını ve 3D grafikleri yararlı bulacağına dair hiçbir fikirleri yoktu. Bütün bu ince modern insanlar, birbirleriyle tutarlı olmak için sağ elli koordinat sistemlerini ve daha yerleşik matematik metinleri ve fizik kurallarını kullanırlar.

3D koordinat sistemini ekran yüzeyine dayandırmak aptalca. Önemli olan model - bir evi, sandalyeyi, aşırı kilolu yeşil deveyi veya galaksiyi tanımlayan üçgenler ve çokgenler ve uçaklar. Günümüzde hepimiz sağ elle kullanılan XYZ sistemlerinde bir şeyler tasarlıyor ve modelliyoruz ve bunu nasıl oluşturulacağını düşünmeden önce bile modelin dünyası açısından yapıyoruz. Kamera bir noktaya eklenir, muhtemelen çılgın yollarla uçmak için yapılır ve modeli, bağırsakları içinde koordineli sistem dönüşümleri ile dolaşması gereken piksellere dönüştüren görünmez altyapıdır.

Sadece karışıklığa eklemek için, bazı grafik kütüphaneleri CRT'lerin görüntüyü yukarıdan aşağıya taradığını ve Y = aşağıya sahip olduğunu kabul eder. Bu, bugün bile tüm pencereleme sistemlerinde ve pencere yöneticilerinde kullanılmaktadır - X11, fvwm, gtk +, Win31 API, vb. Bu ihtiyaç yalnızca uygulama programcıları ve GUI tasarımcıları için geçerlidir.

11
DarenW

Her ikisi de esasen eşdeğerdir, çünkü biri kolayca dönüştürülmüş diğerine dönüşebilir. Solak sistem için bulabileceğim tek avantaj: nesneler gözlemciden daha uzak olduğu için, herhangi bir yönde (x, y veya z), mesafe daha yüksek bir değerdir. Ancak Microsoft'un birini diğerinden daha fazla seçmesinin nedeni bu değil.

POV-Ray ayrıca solak bir koridor sistemi kullanır.

10
tcrosley

DirectX'in (ve Direct3D) baş geliştiricisi Alex St.John geçenlerde bu konuda yorum yaptı. Direct3D tarihi ile ilgili bir makalede şunları yazdı:

Direct3D API için bir [el] seçmesi istendi. Kısmen kişisel tercih dışında bir solak koordinat sistemi seçtim. [...] bu bir isteğe bağlı bir seçimdi.

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

10
Daniel Rikowski

Anlaşılması gereken şey, sol el ve sağ el koordinat sistemleri arasında dönüşüm yapmak için BÜYÜK miktarda programcı zamanının boşa harcandığı ve belirli bir anda hangi sistemin gerekli olduğunu hatırlayarak daha fazla programcı zamanının boşa harcandığıdır.

Sağ elli koordinat sistemleri endüstri standardı haline geldiğinde tüm bunlar ortadan kalktı.

Bir kullanım sorusu getirerek sayıyı iki katına çıkarmadan, zaten ortak kullanımda yeterli koordinat sistemi vardır. Bakınız Minkler & Minkler, "Havacılık ve Uzay Koordinat Sistemleri ve Dönüşümleri" . Havacılık ve uzay koordinat işindeyseniz, ör. uçuş simülasyonu, [~ # ~] [~ # ~] bu kitaba ihtiyacınız var.

Benim tahminim, Microsoft'un DirectX projesinde endüstri standartları hakkında hiçbir şey bilmeyen, bir endüstri standardı olduğunu fark etmediği ve bunun önemli olmadığını düşündüğü ANYONE bulunmamasıdır.

Sağ elli sistemleri bildikleri diğer olasılık endüstri standardıydı ve kasıtlı olarak DirectX'i OpenGL kullanmak için kod kullanan insanların dönüştürmesini zorlaştırmak için DirectX'i solak yaptılar. Bunun gerçekten böyle olduğunu keşfetseydim, Redmond'da bir balta katili olarak yeni ve muhtemelen kısa ömürlü bir kariyere başlamayı gerekli bulurdum.

5
John R. Strohm

Direct3D'nin erken sol elini kullanmanın gerçek cevabı, bazılarınızın tahmin ettiğinden çok daha az uğursuz. Microsoft, 1995 yılında RenderMorphics'i satın aldığında DirectX başladı.

O zamanlar RenderMorphics ofislerinde kullanılan standart grafik metni, Newmann ve Sproul tarafından sol el koordinatlarını kullanarak her şeyi yapan "Etkileşimli Bilgisayar Grafiği İlkeleri" idi. Üniversitede kullandığım kitapla aynı. D3D koduna baktığınızda, bunları kitaptaki denklemlerle eşleşen değişken adları kullanarak bile görebilirsiniz.

Bazı Microsoft komploları değil. Karar, Microsoft resme bile girmeden önce verildi.

5
Stephen Coy

Sağ veya sol elini kullanmanın bir avantajı olmadığını düşünen herkes için kesinlikle yanılıyorsunuz. Kartezyen koordinat sistemlerinin sağ elini, vektör çapraz ürününün tanımından gelir. XYZ bazlı vektörler için u, v ve w, w = u X v.

Bu tanım, vektör matematiği, vektör hesabı ve fiziğin çoğunda esastır. Elektromanyetik etkileşimleri simüle etmeye çalıştığınızı varsayalım. Manyetik alan vektörünüz, M ve o alanda v hızında hareket eden yüklü bir parçacığınız var. Yük hangi yöne hızlanıyor? Kolay - M X v Yönünde. Bazı salak ekran sisteminizi solak yapmak eğlenceli olacağını düşündüğü için -M X v Yönünde hızlanır.

Temelde iki vektör miktarı arasındaki herhangi bir fiziksel etkileşim sağ elle tanımlanır ve bu etkileşimi simüle etmeniz gerektiğinde, grafik sisteminizin sağ elini kullanmasını veya negatif işaretler etrafında alışveriş yapmayı hatırlamanız gerekir. tüm matematiğiniz.

5
Tom

Her ikisi de sonuçta diğerinden daha iyi değil - 3D koordinatları 2B bir yüzeye eşliyorsunuz, böylece üçüncü boyut (aslında 3D'yi yapan şeyler) izleyiciye veya ekrana işaret ederek keyfi olarak seçilebilir. Zaten bir şeyleri 4x4 matrisine koyacaksınız, bu yüzden birini diğerinden seçmenin teknik bir nedeni yok. İşlevsel olarak, biri iddia edilebilir:

  • Hesaplama ve diğer alanlarda X ekseninin soldan sağa doğru çalışması konusunda oldukça geniş bir fikir birliği vardır (havacılık görünüşte dikkate değer bir istisnadır).
  • Matematikte Y ekseni işaret eder. (Ayrıca, Kabarcıkların Gittiği Yer).
  • Bilgisayar ekranlarında, Y ekseni aşağıya doğru işaret eder (çünkü CRT ekranları bu şekilde çalışır ve çoğu insan komut dosyasının satırları düzenleme sırası budur).
  • X/Y düzleminde bir yüzeyin "görünür" tarafına baktığınızda, normal izleyiciye doğru bakmalıdır (uydu görüntülerine baktığınızda; "deniz seviyesinden yükseklik", Dünya'nın merkezi). X/Y düzlemi için normal Z ekseni vektörü olduğundan, Z ekseninin de izleyiciyi göstermesi gerekir.
  • Bilgisayar ekranındaki 3B görüntülere baktığınızda, izleyiciden daha uzakta olan noktaların daha büyük bir Z bileşenine sahip olması gerekir. Bu nedenle, Z ekseni ekranı göstermelidir.

Sonuç: X ekseni için bazı fikir birlikleri vardır, ancak diğer ikisi için, iki sağ elle ve iki sol elle yapılandırmayı sağlayarak her iki yön de tartışılabilir ve hepsi mantıklıdır.

3
tdammers

İlginç gerçek.

Direct3D (DirectX değil - DirectX aynı zamanda girişi, sesi vb. De kapsar) aslında yok solak bir koordinat sistemine sahiptir.

Hem RH hem de LH sistemlerini mükemmel şekilde destekleyebilir. SDK belgelerine bakarsanız, D3DXMatrixPerspectiveFovLH ve D3DXMatrixPerspectiveFovRH gibi işlevler görürsünüz. koordinat seçim sisteminizle başarılı bir şekilde kullanılabilen bir projeksiyon matrisi üretebilirsiniz Cehennem, isterseniz Direct3D'de sütun-major bile kullanabilirsiniz; bu sadece bir yazılım matrisi kütüphanesi ve kullanmanız gerekmiyor. Öte yandan, eğer OpenGL ile kullanmak istiyorsanız, OpenGL ile de mükemmel bir şekilde çalıştığını göreceksiniz (belki de matris kütüphanesinin Direct3D'den bağımsızlığının kesin kanıtıdır).

Programınızda bir RH sistemi kullanmak istiyorsanız, fonksiyonun -RH sürümünü kullanmanız yeterlidir. Bir LH sistemi kullanmak istiyorsanız, -LH sürümünü kullanın. Direct3D umursamıyor. Aynı şekilde, LH sistemi kullanmak istiyorsanız) OpenGL - sadece glLoadMatrix an LH projeksiyon matrisi. Bunların hiçbiri önemli değil ve bazen ortaya çıktığı büyük sorunun yakınında değil.

3
Maximus Minimus

Bunu önceki cevabım için ek materyal olarak sağlamak. 1990'lardan kalma eski bir OpenGL spesifikasyonundan:

OpenGL, koordinat sistemlerinin hiçbirinde sola veya sağa elini zorlamaz.

(kaynak: http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf ).

Öyleyse, ne D3D ne de OpenGL herhangi bir el baskısı uygulamadığından asıl soru şudur: insanlar bunu neden önemli bir şey olarak görüyor?

0
Maximus Minimus

Her iki elle tutmanın da teknik bir avantajı yoktur, tamamen keyfidir. Tutarlı olduğunuz sürece her ikisi de iyi çalışır.

Tutarlılığın avantajları nedeniyle, ideal olarak kişi sadece "herkesin ne kullandığını kullanmalıdır" - ama çoğu durumda bu oldukça zordur, çünkü pratikte de ezici bir şekilde "tercih edilen" bir kural yoktur: her iki el de yaygın olarak kullanılır. En iyi ihtimalle, belirli topluluklar arasında bir miktar tutarlılık vardır (ör. OpenGL).

Bence bu sorunun temel cevabı şuydu: Seçtiklerini seçtiler çünkü doğru hissettirdiler (şüphesiz bu el ile daha önceki bir deneyimleri vardı) ve yapmamak için çok az neden vardı.

Sonunda çok az fark yaratıyor - varlıkları/kodu diğer sistemlerle/topluluklarla ciddiye almak isteyen herkes yine de elleçlik dönüşümüyle başa çıkmaya hazır olacak, çünkü bu 3D grafiklerde hayatın bir gerçeği.

0
snogglethorpe