Vektor dalam pengembangan game

19

Saya baru mengenal pemrograman dan pemrograman game. Saya sudah membaca sesuatu tentang vektor dan matematika, tetapi saya punya pertanyaan - di mana saya bisa menggunakan vektor dalam pemrograman game? Mungkin ada yang bisa memberikan contoh sederhana di mana Anda menggunakan vektor (dalam 2D)?

Saya telah menemukan contoh tetapi kebanyakan mereka berada di konsol tempat mereka menampilkan angka, dan contoh besar yang saya tidak mengerti.

vqwer
sumber
TL Dasar; Vektor DR adalah bagian dari topik Aljabar Linier dan mengarah ke Matrik. Dengan Matricies dan Linear Algebra Anda menulis apa pun dari pemecah Minesweeper ke proyeksi dunia 3D untuk melihat objek apa yang ada di bawah kursor Anda. Aljabar Linier adalah cabang tunggal Matematika yang paling berguna dan perlu bagi pengembang game mana pun. Pelajari sekarang; kamu tidak akan menyesal.
Robert Massaioli
Terima kasih untuk semua jawaban yang luar biasa! Tapi mengapa sesuatu seperti tidak menggunakan Vector dalam tutorial ini ?: zetcode.com/tutorials/javagamestutorial Atau satu pengembang tidak menggunakan yang lain?
vqwer
Sulit dikatakan, mungkin penulis ingin tetap sederhana dan dasar untuk pemula.
Maik Semder
Sebenarnya penulis menggunakannya, lihat array-poin di class Star sini
Maik Semder
Juga di sini adalah Point2Ddigunakan diclass ResizeRectangle
Maik Semder

Jawaban:

31

Apa itu vektor?

Vektor adalah sekumpulan koordinat dari berbagai dimensi. Setiap koordinat dalam suatu vektor mewakili suatu posisi absolut dalam arah ruang dari vektor tersebut.

  • Vektor 1-D adalah {1} . Ini bisa berupa, misalnya, posisi di X = 1. Atau waktu t = 1.
  • Vektor 2-D adalah {-4,3} . Ini bisa berupa, misalnya, posisi di -4 pada sumbu X, dan 3 pada sumbu Y. Bisa juga dengan suhu (3 derajat) pada posisi (-4 meter) kembali pada sumbu X.
  • Vektor 3-D adalah {1,2,3} . Ini bisa berupa posisi dalam ruang 1 sepanjang sumbu X, 2 kembali pada sumbu Y, dan 3 di atas sumbu Z. Atau bisa 1 warna merah, 2 hijau, dan 3 biru. Atau, itu bisa berupa posisi XY ( {1,2} ) pada suatu waktu T ( {3} ).

Perhatikan bahwa dalam semua kasus, kami telah memberi makna pada vektor untuk masalah kami. Meskipun Anda biasanya akan menemukan vektor yang digunakan untuk geometri dalam gim, tidak ada alasan Anda tidak dapat melakukan hal lain dengannya.

Mengapa saya menggunakan vektor?

Pertama, Anda tidak perlu menggunakan vektor. Selama Anda melacak x dan y, atau koordinat apa pun yang Anda pedulikan, dalam beberapa hal Anda baik-baik saja.

Namun, keuntungan menggunakan vektor adalah bahwa mereka secara rapi mewakili hal-hal seperti arah dan posisi, dan juga memiliki beberapa operasi matematika yang ditetapkan pada mereka yang membuat hidup Anda lebih mudah.

Untuk contoh sederhana ini, pertimbangkan produk titik .

Misalkan Anda memiliki sistem radar dalam permainan gaya top-down. Setiap musuh yang muncul di sektor radar (beberapa wedge berbentuk pie dalam 2D) harus mendapatkan titik merah kecil di layar Anda. Jadi, Anda perlu mencari tahu musuh apa yang ada di bagian radar Anda.

Anda bisa menguji apakah musuh ada di dalam segitiga. Anda juga bisa menguji apakah musuh terkandung di persimpangan dua setengah ruang dari pesawat / garis yang mendefinisikan dua sisi sektor radar.

Atau, Anda bisa menggunakan produk titik untuk melakukan pemeriksaan. Begini caranya:

  1. Buat vektor dari pusat radar ke arah "depan radar". Normalisasikan itu.
  2. Buat vektor pergi dari pusat radar ke arah objek yang ingin kita periksa visibilitas radar. Normalisasikan itu.
  3. Ambil titik produk dari dua vektor yang dinormalisasi.
  4. Ambil arccosine dari produk itu, dan periksa apakah kurang dari setengah sudut lebar radar. Jika ya, buat blip.

Ini sangat berguna, dan juga sekarang memungkinkan Anda dengan mudah memiliki radar yang mengarah ke arah yang berbeda (cukup ubah vektor maju) dan memiliki lebar yang berbeda (cukup ubah sudut lebar radar) - dan Anda dapat menggunakan kembali kode yang sama untuk kasus-kasus tersebut juga !

Kenapa lagi saya menggunakan vektor?

Jika Anda menggunakan 2D, mungkin cara terbaik untuk mencapai efek dan gerakan kompleks (pemintalan, penskalaan, dll.) Adalah dengan menggunakan grafik adegan. Sebuah planet memiliki kapal yang mengorbit, kapal memiliki pesawat tanpa awak yang mengorbit. Perhitungan untuk ini tanpa menggunakan vektor matematika benar-benar jelek.

Dengan matematika vektor, kami mewakili masing-masing sebagai memiliki titik dan matriks transformasi 3x3. Planet menggunakan transformasinya, kapal menggunakan transformasinya dan transformasi planet, dan drone menggunakan transformasinya dan transformasi kapal serta transformasi planet.

Ketika planet ini bergerak, Anda mengubah transformasinya, dan kapal serta drone secara otomatis diposisikan "gratis". Kode yang jauh lebih bersih.

Masih belum yakin. Vektor juga merupakan representasi asli untuk posisi, geometri, dan gerak yang digunakan oleh hampir semua perpustakaan grafis - dan tentunya OpenGL dan DirectX. Anda tidak mungkin pergi tanpa harus menggunakannya.

Kesimpulan Vektor adalah alat yang ampuh untuk menulis kode yang jelas yang memecahkan masalah geometri dengan bersih dan elegan.

ChrisE
sumber
14

Contoh 2D adalah koordinat layar, ini mengidentifikasi piksel pada layar dan memiliki komponen x- dan y [x, y] yaitu posisi layar kiri atas [0, 0]

Contoh lain: Bayangkan sebuah teks bergulir dari batas layar kanan ke batas layar kiri. Sekarang Anda perlu menentukan kecepatan teks gulir dalam pixel per detik, yaitu [-20, 0] yang berarti teks menggulir 20 piksel ke kiri per detik dan tidak pernah mengubah ketinggian.

Contoh lain yang lebih canggih: Bayangkan sebuah game 2D yang seharusnya berjalan pada resolusi layar yang berbeda 800x600, 1024x768 dll. Ini dapat dengan mudah dilakukan dengan internal menggunakan lebar layar dari 0,0 hingga 1,0 dan tinggi dari 0,0 hingga 1,0 untuk memisahkan logika permainan dari resolusi layar aktual. Sekarang ketika Anda menggambar ke layar Anda hanya mengalikan vektor internal dengan vektor resolusi:

screen_pos = internal_pos * screen_ressolution

perhatikan, ketiga variabel adalah vektor 2D di sini, mereka memiliki komponen x dan komponen y, yaitu untuk internal_pos ini [0,5, 0,25]:

[400, 150] = [0.5, 0.25] * [800, 600]

Jadi posisi internal [0,5, 0,25] ditransformasikan ke posisi layar aktual [400, 150]

Ini adalah hal dasar. Keuntungan sebenarnya dari vektor adalah aplikasi dalam Aljabar Linier di mana Anda dapat menggunakan matriks untuk mengubah simpul Anda (memutar, skala, cermin dll), yaitu untuk dengan mudah memutar semua posisi internal Anda hingga 90 derajat, atau Anda harus menukar layar-y posisi 0 dari atas ke bawah layar, karena ie perpustakaan pihak ketiga yang Anda gunakan, menggunakan konvensi ini.

Maik Semder
sumber
Bukankah vektor array dimensi tunggal, seperti daftar semacam? Ketika kita berbicara tentang resolusi layar, bukankah kita berbicara tentang array multidimensi (satu koordinat untuk setiap sumbu X dan Y)? Hanya untuk memastikan bahwa 'vektor' tidak tercampur dengan matriks di sini. =)
Will Marcouiller
@Apakah data piksel lengkap untuk layar dapat diperlakukan sebagai array multidimensi, pada dasarnya berupa bitmap, tetapi nilai untuk lebar dan tinggi, dengan kata lain resolusinya, tidak bisa
Maik Semder
2
Perhatikan bahwa vektor sering diperlakukan sangat berbeda dalam matematika dan pemrograman. Secara matematis, vektor bukanlah array multidimensi, meskipun komponen-komponennya sehubungan dengan beberapa basis bersama-sama mendefinisikan array tersebut. Vektor itu sendiri adalah invarian koordinat. Operasi screen_pos = internal_pos * screen_resolutionini tidak berkoordinasi invarian cara yang telah ditulis, itu bisa lebih tepat ditulis screen_pos = map_to_screen * internal_pos, di mana map_to_screenadalah pemetaan linear (yang dapat ditulis sebagai matriks, dalam hal ini satu diagonal).
leftaroundabout
6

Berikut adalah penjelasan yang bagus tentang vektor dalam pengembangan game di blog Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

jhocking
sumber
Saat ini hanya jawaban tautan. Harap pertimbangkan untuk memasukkan ringkasan kasar dari poin-poin utama yang Anda harap dapat diperoleh pembaca dari tautan ini, sehingga jawabannya dapat berdiri sendiri meskipun tautan tersebut berubah, rusak, atau menjadi tidak tersedia di masa mendatang.
DMGregory
1

Vektor adalah entitas yang memiliki nilai dan arah. Contoh vektor dalam dunia nyata dan permainan berbasis fisika termasuk kecepatan dan momentum. Properti yang hanya memiliki nilai tetapi tidak memiliki arah disebut skalar dan termasuk lokasi, massa, kepadatan, dan sebagainya.

Vektor diperlukan untuk gim yang meniru sifat fisik seperti vektor (seperti yang disebutkan - kecepatan, akselerasi, dan sebagainya). Matematika yang digunakan untuk perhitungan vektor disebut aljabar linier .

Eran Galperin
sumber
Kecepatan adalah skalar, yang merupakan panjang vektor kecepatan
Maik Semder
Benar - diperbaiki
Eran Galperin
1
dan lokasi biasanya dianggap sebagai vektor, jaraknya adalah skalar.
Ali1S232
Posisi dapat dianggap sebagai skalar (atau kumpulan skalar) atau vektor yang menunjuk dari titik awal sumbu.
Eran Galperin
1

Di mana pun Anda memiliki angka untuk setiap dimensi untuk mewakili sesuatu, koleksi angka-angka ini dapat dianggap sebagai vektor. Posisi, kecepatan dan percepatan adalah contoh utama vektor. Dalam beberapa kasus dapat juga praktis untuk mewakili arah menghadap sebagai vektor.

Untuk hal-hal dasar, tidak masalah apakah Anda menganggap angka-angka ini sebagai vektor, tetapi jika Anda ingin melakukan segala jenis fisika, Anda harus melihat ke dalam matematika vektor.

aaaaaaaaaaaa
sumber
Posisi bukan vektor
Eran Galperin
Baik kecepatan, skalar, kecepatan adalah vektor
Maik Semder
2
@Ran Galperin Saya tahu itu adalah pandangan yang cukup luas di kalangan matematikawan. Namun demikian, perbedaan antara suatu titik dan vektor posisinya yang sesuai adalah cukup akademis. Tidak ada alasan praktis untuk membuat keributan tentang perbedaan tersebut.
aaaaaaaaaaaa
1
Ada alasan praktis, begitu Anda bekerja dengan koordinat dan matriks homogen 4D, Anda harus membuat perbedaan itu. Padahal itu tidak relevan untuk ruang lingkup pertanyaan ini.
Maik Semder
@eBusiness ini bukan "tampilan", itu fakta. Dan saya seorang ahli fisika berdasarkan pendidikan, bukan ahli matematika.
Eran Galperin
0

Sederhananya, apa pun dengan posisi, atau arah, yang ada di mana-mana dalam game mereka menggunakan vektor. Vektor seperti sebuah titik

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Namun perbedaannya benar-benar turun ke ini. Titik hanyalah titik, sedangkan vektor adalah panah.

jika Anda memiliki

Point2.x = 5;

Point2.y = 10;

perkataan Anda yang saya maksud di lokasi ini x 5 dan y 10.

namun ketika Anda mendeklarasikan vektor ...

Vector2.x = 5;

Vector2.y = 10; 

Anda benar-benar mengatakan saya menyatakan panah dari 0,0 ke x 5, y 10;

Anda bahkan dapat memiliki titik dari mana vektor Anda menunjuk dari menjadi titik dalam ruang dari mana saja, misalnya mari kita gunakan titik dan vektor untuk memindahkan objek kita, kita akan menggunakan Point2 untuk menyimpan lokasi dan vektor2 untuk memindahkannya .

point2.x = 10;

point2.y = 15;

sekarang Anda dapat menggunakan vektor untuk memindahkan titik ini, katakanlah kita ingin memindahkan titik ini ke sumbu x 10 unit sehingga Anda miliki

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

sekarang titik telah pindah ke tempat panah vektor Anda mengatakannya.

titik sekarang adalah

point2.x = 20;

point2.y = 15;

Satu hal terakhir yang perlu diperhatikan adalah terkadang vektor digunakan seperti titik dan sebaliknya hanya karena mereka memegang jenis data yang sama.

EddieV223
sumber
Titik adalah vektor. Ini adalah vektor dari titik asal ke titik P.
Bebek Komunis
1
@ Bercinta secara teknis itu tidak benar, merujuk pada koordinat homogen bahwa vektor dapat ditemukan dengan mengurangi origin_point dari position_point, tetapi itu tidak membuat mereka sama: v = pos - originjadi v != poskarena asal adalah sebuah titik{0, 0, 0, 1}
Maik Semder
@Duck: Suatu titik bukan vektor tetapi titik dan asal mendefinisikan vektor, yang sama baiknya dengan sebagian besar waktu jika asal Anda adalah 0.
@ Bercinta lalu mengapa Anda menyebutnya titik P Anda? LOL
EddieV223