Kelas Penting - Transform
Kelas Penting - Quaternion

Kelas Penting - Vektor

Vektor adalah konsep matematika mendasar yang memungkinkan Anda untuk menggambarkan arah dan kebesaran. Dalam permainan dan aplikasi, vektor sering digunakan untuk menggambarkan beberapa sifat mendasar seperti posisi karakter, kecepatan sesuatu bergerak, atau jarak antara dua benda.

Vektor aritmatiketik mendasar untuk banyak aspek pemrograman komputer seperti grafis, fisika dan animasi, dan berguna untuk memahaminya dalam kedalaman untuk mendapatkan yang paling dari Unity.

Vektor dapat diungkapkan dalam beberapa dimensi, dan Unity menyediakan kelas vektor2, vektor3 dan vektor4 untuk bekerja dengan 2D, 3D, dan 4D vektor. Tiga jenis kelas vektor ini semua berbagi banyak fungsi yang sama, seperti kebesaran, sehingga sebagian besar informasi di halaman ini berlaku untuk semua tiga jenis vektor kecuali ditentukan lain.

Halaman ini memberikan gambaran dari kelas vektor dan kegunaan umum mereka ketika scripting dengan mereka. Untuk referensi knalpot dari setiap anggota kelas vektor, lihat halaman referensi skrip untuk Vektor2, Vektor3 dan Vektor4.

Memahami Vektor Arithmetic

Addition

Ketika dua vektor ditambahkan bersama, hasilnya setara dengan mengambil vektor asli sebagai “langkah”, satu setelah yang lain. Perhatikan bahwa urutan dua parameter tidak masalah, karena hasilnya adalah cara yang sama.

Jika vektor pertama diambil sebagai titik di ruang maka yang kedua dapat ditafsirkan sebagai offset atau “jump” dari posisi itu. Misalnya, untuk menemukan titik 5 unit di atas lokasi di tanah, Anda dapat menggunakan perhitungan berikut: -

 var pointInAir = pointOnGround + new Vector2(0, 5);

Jika vektor mewakili kekuatan maka lebih intuitif untuk memikirkan mereka dalam hal arah dan kebesaran mereka (besaran menunjukkan ukuran kekuatan). Menambahkan dua vektor kekuatan hasil dalam vektor baru setara dengan kombinasi kekuatan. Konsep ini sering berguna ketika menerapkan kekuatan dengan beberapa komponen yang terpisah bertindak sekaligus (misalnya, roket yang didorong maju juga dapat dipengaruhi oleh lintasan).

Meskipun contoh di sini menunjukkan vektor 2D, konsep yang sama berlaku untuk vektor 3D dan 4D.

Subtraction

Subtraksi vektor paling sering digunakan untuk mendapatkan arah dan jarak dari satu objek ke yang lain. Perhatikan bahwa urutan dua parameter does masalah dengan subtraksi:-

// The vector d has the same magnitude as c but points in the opposite direction.
var c = b - a;
var d = a - b;

Seperti dengan angka, menambahkan negatif dari vektor sama dengan mengurangi positif.

// These both give the same result.
var c = a - b;
var c = a + -b;

negatif dari vektor memiliki besaran yang sama dengan garis asli dan poin di sepanjang garis yang sama tetapi pada arah yang berlawanan.

Arah dan Jarak dari Satu Objek ke Lain

Jika satu titik di ruang terganggu dari yang lain, maka hasilnya adalah vektor bahwa "titik" dari satu objek ke yang lain:

// Gets a vector that points from the player's position to the target's.
var heading = target.position - player.position;

Serta menunjuk ke arah objek target, kebesaran vektor ini sama dengan jarak antara kedua posisi. Anda mungkin perlu vektor "normalisasi" memberikan arah ke target, tetapi dengan jarak tetap (kata untuk mengarahkan proyektil). Anda dapat menormalkan vektor dengan membaginya dengan kebesarannya sendiri:

var distance = heading.magnitude;
var direction = heading / distance; // This is now the normalized direction.

Pendekatan ini lebih disukai untuk menggunakan sifat besar dan dinormalisasi secara terpisah, karena keduanya cukup CPU-hungry (mereka keduanya melibatkan menghitung akar persegi).

Jika Anda hanya perlu menggunakan jarak untuk perbandingan (untuk cek dekat, katakanlah) maka Anda dapat menghindari perhitungan besar sama sekali. Properti sqrMagnudo memberikan persegi nilai besar, dan dihitung seperti kebesaran tetapi tanpa operasi akar persegi waktu. Dari membandingkan kebesaran terhadap jarak yang diketahui, Anda dapat membandingkan kebesaran persegi terhadap jarak persegi:-

if (heading.sqrMagnitude < maxRange * maxRange) {
    // Target is within range.
}

Ini jauh lebih efisien daripada menggunakan kebesaran sejati dalam perbandingan.

Kadang-kadang, ketika bekerja di 3D, Anda mungkin perlu “pemainan darat” ke target. Misalnya, bayangkan pemain berdiri di tanah yang perlu mendekati target mengambang di udara. Jika Anda mengalihkan posisi pemain dari target maka vektor yang dihasilkan akan menunjuk ke arah target. Ini tidak cocok untuk mengorientasikan transformasi pemain karena mereka juga akan menunjuk ke atas; apa yang benar-benar diperlukan adalah vektor dari posisi pemain ke posisi di tanah langsung di bawah target. Anda dapat memperoleh ini dengan mengambil hasil dari subtraksi dan mengatur koordinat Y ke nol:-

var heading = target.position - player.position;
heading.y = 0;  // This is the overground heading.

Multiplikasi dan Divisi Scalar

Ketika membahas vektor, hal ini umum untuk merujuk pada nomor biasa (misalnya, nilai pelampung) sebagai scalar. Arti dari ini adalah bahwa sebuah scalar hanya memiliki “skala” atau besar di mana vektor memiliki kebesaran dan arah.

Menggandakan vektor dengan hasil scalar dalam vektor yang poin dalam arah yang sama seperti aslinya. Namun, kebesaran vektor baru sama dengan kebesaran asli yang dikalikan oleh nilai scalar.

Demikian juga, pembagian scalar membagi besarnya vektor asli oleh perskalaan.

Operasi ini berguna ketika vektor mewakili gerakan mengimbangi atau kekuatan. Mereka memungkinkan Anda untuk mengubah besarnya vektor tanpa mempengaruhi arahnya.

Ketika setiap vektor dibagi dengan besarnya sendiri, hasilnya adalah vektor dengan besarnya 1, yang dikenal sebagai vektor normal. Jika vektor normal dikalikan dikalikan oleh scalar maka perbesaran hasilnya akan sama dengan nilai scalar. Ini berguna ketika arah gaya konstan tetapi kekuatannya dikontrol (misalnya, kekuatan dari roda mobil selalu mendorong ke depan tetapi daya dikendalikan oleh pengemudi).

Produk

Produk titik mengambil dua vektor dan mengembalikan skala. Penskalaan ini sama dengan besarnya dua vektor yang dikalikan bersama-sama dan hasilnya dikalikan oleh kosin sudut antara vektor. Ketika kedua vektor dinormalkan, kosin pada dasarnya menyatakan seberapa jauh vektor pertama meluas ke arah kedua (atau sebaliknya - urutan parameter tidak masalah).

Di bawah ini Anda dapat melihat perbandingan bagaimana vektor berbagai sudut dibandingkan dengan vektor referensi kembali nilai produk titik antara 1 dan -1:

Produk dot adalah operasi yang lebih sederhana secara matematika daripada menghitung cosine, sehingga dapat digunakan di tempat Mathf. Fungsi cos atau operasi magnudo vektor dalam beberapa keadaan (tidak melakukan hal yang sama tetapi kadang-kadang efeknya setara). Namun, menghitung fungsi produk titik membutuhkan waktu CPU yang jauh lebih sedikit dan sehingga dapat menjadi optimasi yang berharga.

Produk dot berguna jika Anda ingin menghitung jumlah satu besarnya vektor yang terletak di arah vektor lain.

Misalnya, speedometer mobil biasanya bekerja dengan mengukur kecepatan rotasi roda. Mobil mungkin tidak bergerak langsung ke depan (dapat skidding sideways, misalnya) di mana bagian kasus gerakan tidak akan masuk ke arah mobil menghadap - dan jadi tidak akan diukur oleh speedometer. Pembesaran vektor rigidbodyKomponen yang memungkinkan GameObject untuk dipengaruhi oleh gravitasi simulasi dan kekuatan lainnya. More info
Lihat di Glossary
.velocity objek akan memberikan kecepatan ke arah gerakan keseluruhan tetapi untuk mengisolasi kecepatan ke arah depan, Anda harus menggunakan produk dot:

var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward);

Secara alami, arah dapat apa pun yang Anda suka tetapi vektor arah harus selalu dinormalisasi untuk perhitungan ini. Tidak hanya adalah hasil yang lebih benar daripada besarnya kecepatan, itu juga menghindari operasi akar persegi lambat yang terlibat dalam menemukan kebesaran.

Produk Cross

Produk salib hanya bermakna untuk vektor 3D. Ini mengambil dua vektor 3D sebagai input dan mengembalikan vektor 3D lain sebagai hasilnya.

vektor hasil tegak lurus dengan dua vektor input. Anda dapat menggunakan aturan sekrup tangan yang tepat untuk mengingat arah vektor output dari pemesanan vektor input. Jika Anda dapat menyembuhkan jari Anda dalam urutan vektor input, poin thumb Anda ke arah vektor output. Jika urutan parameter terbalik maka vektor yang dihasilkan akan menunjuk ke arah berlawanan yang tepat tetapi akan memiliki besarsi yang sama.

Kebesaran hasil sama dengan besarnya vektor input yang dikalikan bersama-sama dan kemudian nilai yang dikalikan oleh sinus sudut antara mereka. Beberapa nilai yang berguna dari fungsi sinus ditunjukkan di bawah ini:-

Produk salib tampaknya rumit karena menggabungkan beberapa potongan informasi yang berguna dalam nilai pengembaliannya. Namun, seperti produk dot, sangat efisien secara matematika dan dapat digunakan untuk mengoptimalkan kode yang akan tergantung pada fungsi transkendental yang lebih lambat seperti sinus dan cosine.

Mengkomputasikan vektor normal / tegak lurus

vektor "normal" (yaitu vektor tegak lurus ke pesawat) diperlukan sering selama generasi meshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
Lihat di Glossary
dan juga berguna dalam hal jalur dan situasi lainnya. Mengingat tiga poin di pesawat, mengatakan titik sudut segitiga jala, Anda dapat menemukan normal sebagai berikut: - Pilih salah satu dari tiga poin - Mengalihkannya dari masing-masing dari dua poin lain secara terpisah (meningkatkan dalam dua vektor baru, "Side 1" dan "Side 2") - Hitung produk salib dari vektor "Side 1" dan "Side 2" - Hasil produk salib adalah vektor baru yang tegak lurus ke pesawat tiga poin asli berbaring - "normal".

Vector3 a;
Vector3 b;
Vector3 c;

Vector3 side1 = b - a;
Vector3 side2 = c - a;

Vector3 normal = Vector3.Cross(side1, side2);

“pengaturan tangan kiri” dapat digunakan untuk memutuskan pesanan di mana dua vektor harus dilewatkan ke fungsi produk silang. Seperti yang Anda lihat di sisi atas permukaan (dari mana yang normal akan menunjuk ke luar) vektor pertama harus menyapu sekitar searah jarum jam ke detik:

Hasilnya akan menunjuk ke arah yang berlawanan jika urutan vektor input terbalik.

Untuk jala, vektor normal juga harus dinormalkan. Ini dapat dilakukan dengan properti normal, tetapi ada trik lain yang kadang-kadang berguna. Anda juga dapat menormalkan vektor tegak lurus dengan membaginya dengan kebesarannya:-

float perpLength = perp.magnitude;
perp /= perpLength;

Catatan berguna lainnya adalah bahwa luas segitiga sama dengan perpLength / 2. Ini berguna jika Anda perlu menemukan luas permukaan seluruh mesh atau ingin memilih segitiga secara acak dengan probabilitas berdasarkan daerah kerabat mereka.

Kelas Penting - Transform
Kelas Penting - Quaternion