Apa yang dilakukan kartu grafis dengan elemen keempat vektor sebagai posisi akhir?

25

Dari pertanyaan ini tampaknya Anda menginginkan vektor posisi empat elemen, karena lebih mudah untuk mengubah posisinya dengan perkalian matriks.

Dengan sendirinya ini akan menyiratkan elemen keempat harus diabaikan ketika menganggapnya sebagai representasi dari titik 3D (dengan asumsi tidak ada transformasi), tetapi saya tahu ini tidak benar, seperti ketika saya memasok vektor4 ke GPU, jika keempat elemen bukan satu, itu tidak diberikan - mengapa?

Apa arti penting dari elemen keempat, begitu ada di rasterizer?

EDIT : Saat ditinjau, pertanyaan ini agak tidak jelas; akan lebih akurat bagi paragraf kedua untuk mengatakan: "jika nilai elemen keempat tidak dalam kisaran tertentu, itu tidak diberikan 'dengan benar' / 'seperti yang diharapkan'".

sebf
sumber
bukankah vektor4 dengan koordinat (x, y, z, 0,5) memberikan hasil yang sama dari vector4 dengan koordinat (2x, 2y, 2z, 1)?
FxIII
@FxIII, saya tidak dapat mereproduksi itu dengan tepat tetapi Anda benar bahwa pernyataan selimut yang salah dibuat di posting asli saya, setelah beberapa percobaan lagi saya telah memperbaruinya.
sebf

Jawaban:

23

Komponen keempat adalah trik untuk melacak proyeksi perspektif. Ketika Anda melakukan proyeksi perspektif, Anda ingin membaginya dengan z: x '= x / z, y' = y / z, tetapi ini bukan operasi yang dapat diimplementasikan oleh matriks 3x3 yang beroperasi pada vektor x, y, z. Trik yang telah menjadi standar untuk melakukan ini adalah dengan menambahkan koordinat keempat, w, dan menyatakan bahwa x, y, z akan selalu dibagi dengan w setelah semua transformasi diterapkan dan sebelum rasterisasi.

Proyeksi perspektif kemudian dicapai dengan memiliki matriks yang memindahkan z ke w, sehingga Anda akhirnya membaginya dengan z. Tetapi itu juga memberi Anda fleksibilitas untuk meninggalkan w = 1.0 jika Anda tidak ingin melakukan pembagian; misalnya jika Anda hanya ingin proyeksi paralel, atau rotasi atau apapun.

Kemampuan untuk menyandikan posisi sebagai w = 1, arah sebagai w = 0 dan menggunakan baris / kolom keempat dari matriks untuk terjemahan adalah manfaat samping yang bagus, tetapi itu bukan alasan utama untuk menambahkan w. Seseorang dapat menggunakan transformasi affine (matriks 3x3 plus vektor terjemahan 3-komponen) untuk menyelesaikan terjemahan tanpa terlihat. (Orang harus melacak apa posisi dan apa arah, dan menerapkan fungsi transformasi yang berbeda untuk masing-masing; itu agak tidak nyaman, tetapi tidak terlalu besar.)

(BTW, secara matematis, vektor yang ditambah dengan w dikenal sebagai koordinat homogen , dan mereka tinggal di tempat yang disebut ruang proyektif . Namun, Anda tidak perlu memahami matematika yang lebih tinggi untuk melakukan grafik 3D.)

Nathan Reed
sumber
Sekali lagi sedikit salah untuk berbicara tentang vektor dan titik dalam istilah-istilah tersebut karena ada isomorfisme antara titik dan vektor (titik dan vektor yang memindahkan asal ke titik itu adalah entitas yang sama). Akan lebih tepat untuk berbicara tentang arah poin / vektor (w! = 0) dan (proyeksi) (w = 0). Pokoknya penyalahgunaan istilah "vektor" adalah standar yang cukup terkonsolidasi dalam bahasa perpustakaan 3d.
FxIII
@FxIII: Diperbaiki. Itu membingungkan untuk menggunakan "vektor" dalam arti matematika standar dan sebagai sinonim untuk "arah" di pos yang sama.
Nicol Bolas
@FxIII dan Nicol Bolas: Saya tidak setuju. Anda benar-benar mengkodekan vektor sebagai w = 0 - termasuk kedua vektor yang hanya mewakili arah, dan vektor aktual di mana panjangnya penting. Misalnya, Anda dapat mengubah vektor kecepatan sudut (arah = sumbu rotasi, panjang = kecepatan) dari objek antara ruang lokal dan ruang dunia menggunakan matriks objek. Anda tidak ingin kecepatan sudut mendapatkan terjemahan objek ditambahkan ke dalamnya; Anda hanya ingin diputar. Jadi Anda menetapkan w = 0. Saya tidak melihat masalah?
Nathan Reed
@NathanReed Saya berharap posting saya membantu memperjelas titik, pokoknya sebagian besar poin saya adalah pada definisi dan penyalahgunaan istilah vektor ditambah keunggulan aljabar linier atas terminologi perpustakaan 3D standar. Tentu saja keduanya bisa diperdebatkan karena setiap definisi dan klaim keutamaan adalah
FxIII
@Nathan, saya bisa melihat dengan jelas sekarang tujuan dari elemen keempat, dan bagaimana informasi yang dikandungnya digunakan oleh rasterizer. Terima kasih banyak!
sebf
10

Tring untuk menjawab komentar Natan yang tepat, saya melakukan beberapa pertimbangan yang dapat berguna untuk memahami apa yang sebenarnya terjadi ketika Anda menggunakan vektor di Ruang Affine untuk mewakili vektor 3D di Ruang Euclidean standar.

Pertama-tama saya akan memanggil vektor apa pun yang memiliki koordinat, jadi titik dan vektor adalah entitas yang sama; Anda dapat melihat vektor sebagai perbedaan dua titik: V = B - A ; V bergerak A di B karena A + V = A + B - A = B . Masukkan A = 0 (asal) dan Anda akan mendapatkan bahwa V = B - 0 = B : titik B dan vektor yang bergerak 0ke B adalah hal yang sama.

Saya akan memanggil "vektor" - dalam arti yang digunakan di sebagian besar perpustakaan 3D - ketika vektor ruang affine memiliki w = 0.

Matriks tersebut digunakan karena memungkinkan Anda untuk merepresentasikan fungsi linier dalam bentuk yang ringkas / elegan / efisien, tetapi fungsi linier memiliki kelemahan utama yang tidak dapat mengubah asal: F ( 0 ) = 0 jika F ingin menjadi linier ( amog hal lain seperti F (λ X ) = λF ( X ) dan F ( A + B ) = F ( A ) + F ( B ))

Ini berarti Anda tidak dapat membuat matriks yang melakukan terjemahan karena Anda tidak akan pernah memindahkan vektor 0 . Inilah saatnya bermain Ruang Affine . Ruang affine menambahkan dimensi ke ruang euclidean sehingga traslantion dapat dilakukan dengan penskalaan dan rotasi.

Ruang Affine adalah ruang proyektif dalam arti bahwa Anda dapat membangun hubungan ekivalensi antara vektor Affine dan vektor Euclidean sehingga Anda dapat membingungkan mereka (seperti yang kami lakukan dengan poins dan vektor). Semua vektor affine yang memproyeksikan ke asal dengan arah yang sama dapat dilihat sebagai vektor euclidean yang sama.

Ini berarti bahwa semua vektor yang memiliki proporsi yang sama dalam koordinat dapat dianggap setara:

Secara matematis:

persamaan derajatnya

yaitu setiap vektor affine dapat direduksi menjadi versi kanon di mana w = 1 (kita memilih di antara setiap vektor ekivalen yang paling kita sukai).

Secara visual (2D euclidean - 3D affine):

kesetaraan visual

karenanya rata-rata ruang "proyektif" ; Anda harus memperhatikan bahwa di sini ruang euclidean adalah 2D (wilayah cyan)

Ada seperangkat vektor affine tertentu yang tidak dapat dimasukkan ke dalam versi kanonik mereka (dengan mudah) yang terletak pada bidang (hyper) w = 0.

Kami dapat menunjukkannya secara visual:

masukkan deskripsi gambar di sini

apa yang Anda (harus) lihat adalah bahwa ketika w -> 0 maka vektor yang diproyeksikan ke dalam ruang Euclidean menuju ke infinite tetapi ke infinite dalam Arah tertentu .

Sekarang jelas bahwa menambahkan dua vektor dalam ruang proyektif dapat menyebabkan masalah ketika Anda mempertimbangkan jumlah vektor sebagai vektor yang diproyeksikan dalam ruang euclidean, ini menambahkan karena Anda akan menjumlahkan komponen W di ruang affine dan kemudian memproyeksikannya ke pesawat euclidean (hiper).

Inilah sebabnya mengapa Anda dapat menjumlahkan hanya "titik" menjadi "vektor" karena "vektor" tidak akan mengubah koordinat w dari "titik" ini benar hanya untuk "titik" di mana w = 1:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat titik hijau adalah yang diperoleh dengan menambahkan dua vektor affine yang mewakili "titik" cyan dan V "vektor" , tetapi jika Anda menerapkan V ke setiap vektor affine dalam bentuk yang berbeda dengan kanon, Anda akan mendapatkan hasil yang salah ("" titik "" merah).

Anda melihat bahwa Affine Space tidak dapat digunakan secara transparan untuk menggambarkan operasi pada Euclidean Spaces dan penyalahgunaan istilah "vektor" memiliki arti di bawah batasan (ketat) jumlah perhitungan hanya pada vektor proyeksi kanon .

Mengatakan itu, cukup masuk akal untuk berpikir bahwa GPU mengasumsikan bahwa Vector4 harus memiliki w = 0 atau w = 1, kecuali Anda benar-benar tahu apa yang Anda lakukan.

FxIII
sumber
Sangat sulit untuk memilih satu jawaban untuk pertanyaan ini, karena semua telah berkontribusi pada pemahaman tentang bagaimana hubungan komponen keempat digunakan dan mengapa diperlukan. Penjelasan Anda tentang euclidean dan ruang affine sangat membantu, saya pasti tidak akan memahaminya seperti yang saya lakukan sekarang tanpa tingkat detail. Terima kasih banyak!
sebf
+1 untuk penjelasan (dan diagram!) Ruang proyektif yang baik. Namun, ruang affine dan ruang proyeksi bukanlah hal yang sama (lihat definisi Wikipedia tentang ruang affine). Mungkin cara yang baik untuk mengatakan ini adalah: 3-ruang projektif dan 3-afin keduanya dapat tertanam dalam R ^ 4, tetapi embedding tidak sepenuhnya konsonan. Pengkodean vektor dari ruang affine sebagai w = 0 adalah mungkin dan berguna, tetapi tidak berarti dari sudut pandang proyektif. Demikian juga, arah proyektif (titik tak terhingga) tidak berarti dari sudut pandang affine.
Nathan Reed
1

Asumsikan vektor seperti (x, y, z, w). Vektor ini memiliki 4 komponen x (koordinat x dalam ruang), y (koordinat y dalam ruang), z (koordinat z dalam ruang) dan komponen w yang menarik dan misterius. Sebenarnya sebagian besar game 3d beroperasi di ruang 4d. Ini juga disebut ruang homogen 4d. Ada beberapa manfaatnya ->

1> Ini membantu kita dalam menggabungkan matriks terjemahan dan rotasi menjadi satu. Tapi Anda mungkin berpikir apa gunanya kita hanya bisa melipatgandakan terjemahan dan matriks rotasi dan hanya itu tetapi tidak ada yang lebih dari itu. Jika kita tidak memiliki komponen w dalam semua vektor kita maka ketika kita mengalikan vektor 3d (xyz) ke matriks gabungan terjemahan dan rotasi dengan cara apa pun kita akan secara tidak sadar menskalakan nilai dengan x, y atau z (begitulah cara perkalian matriks beroperasi) dan ini akan mungkin merusak posisi matriks (bagian terjemahan dari matriks gabungan) karena penskalaan. Untuk memperbaiki masalah ini vektor komponen 4 diperkenalkan dan komponen vektor ini (w) akan memiliki nilai 1,0 dalam 99% kasus. Komponen ke-4 ini memungkinkan kita untuk memiliki nilai posisi unscaled (terjemahan). Matriks diwakili sebagai->

 [x y z w] [rx1 rx2 rx3 1]
           [ry1 ry2 ry3 1]
           [rz1 rz2 rz3 1]
           [px  py  pz  1]

dan kemudian kita memiliki matriks yang sederhana namun kuat. :)

2> Kami menyalin nilai z ke komponen w dalam tahap proyeksi perspektif dan membagi x, y dengan itu. Dengan cara ini objek menjadi lebih pendek saat bergerak menjauh dari layar.

gamePro
sumber
Terima kasih! Saya melihat semakin banyak perlunya menggunakan komponen keempat dalam representasi entitas yang benar-benar berguna dalam ruang 3D.
sebf