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'".
Jawaban:
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.)
sumber
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:
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):
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:
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:
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.
sumber
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->
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.
sumber