Saya baru-baru ini belajar bahwa kita banyak menggunakan teorema Pythagoras dalam perhitungan fisika kita dan saya khawatir saya tidak benar-benar mengerti maksudnya.
Berikut ini contoh dari buku untuk memastikan objek tidak bergerak lebih cepat daripada MAXIMUM_VELOCITY
konstanta pada bidang horizontal:
MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY;
function animate(){
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
x_velocity = x_velocity / scalar;
z_velocity = x_velocity / scalar;
}
}
Mari kita coba ini dengan beberapa angka:
Objek mencoba memindahkan 5 unit dalam x dan 5 unit dalam z. Seharusnya hanya dapat memindahkan 5 unit secara horizontal total!
MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
var squared_horizontal_velocity = 5 * 5 + 5 * 5;
var squared_horizontal_velocity = 25 + 25;
var squared_horizontal_velocity = 50;
// if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
if( 50 <= 25 ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
scalar = 50 / 25;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
Sekarang ini berfungsi dengan baik, tetapi kita dapat melakukan hal yang sama tanpa Pythagoras:
MAXIMUM_VELOCITY = 5;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var horizontal_velocity = x_velocity + z_velocity;
var horizontal_velocity = 5 + 5;
var horizontal_velocity = 10;
// if( horizontal_velocity >= MAXIMUM_VELOCITY ){
if( 10 >= 5 ){
scalar = horizontal_velocity / MAXIMUM_VELOCITY;
scalar = 10 / 5;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
Manfaat melakukannya tanpa Pythagoras:
- Garis kurang
- Dalam garis-garis itu, lebih mudah untuk membaca apa yang terjadi
- ... dan butuh waktu lebih sedikit untuk menghitung, karena ada lebih sedikit perkalian
Sepertinya saya seperti komputer dan manusia mendapatkan kesepakatan yang lebih baik tanpa teorema Pythagoras! Namun, saya yakin saya salah karena saya telah melihat teorema Pythagoras di sejumlah tempat terkemuka, jadi saya ingin seseorang menjelaskan kepada saya manfaat menggunakan teorema Pythagoras kepada seorang pemula matematika .
Apakah ini ada hubungannya dengan vektor satuan? Bagi saya vektor satuan adalah ketika kita menormalkan vektor dan mengubahnya menjadi pecahan. Kami melakukan ini dengan membagi vektor dengan konstanta yang lebih besar. Saya tidak yakin apa itu konstan. Ukuran total grafik? Lagi pula, karena ini pecahan, saya ambil, vektor satuan pada dasarnya adalah grafik yang dapat masuk ke dalam kisi 3D dengan sumbu x berjalan dari -1 ke 1, sumbu z berjalan dari -1 ke 1, dan y -aksis berjalan dari -1 ke 1. Itu benar-benar semua yang saya tahu tentang vektor satuan ... tidak banyak: P Dan saya gagal melihat kegunaannya.
Selain itu, kami tidak benar-benar membuat vektor satuan dalam contoh di atas. Haruskah saya menentukan skalar seperti ini:
// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;
var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;
x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5
Sekali lagi, saya tidak dapat melihat mengapa ini lebih baik, tetapi lebih "unit-vector-y" karena multiplicative_scalar adalah unit_vector? Seperti yang Anda lihat, saya menggunakan kata-kata seperti "unit-vector-y" jadi saya benar-benar bukan jagoan matematika! Juga sadar bahwa vektor satuan mungkin tidak ada hubungannya dengan teorema Pythagoras jadi abaikan semua ini jika saya menggonggong pohon yang salah.
Saya orang yang sangat visual (modeller 3D dan artis konsep berdasarkan perdagangan!) Dan saya menemukan diagram dan grafik benar-benar bermanfaat, jadi sebanyak mungkin yang bisa dilakukan secara manusiawi!
sumber
(2.5, 2.5)
memiliki besaran sekitar 3,54, bukan 5.sqrt(2.5*2.5 + 2.5*2.5)
Jawaban:
Kode Pythagoras-free Anda tidak menghitung panjang seperti yang biasa kita pikirkan.
Biasanya dalam game 3D kami memodelkan dunia sebagai ruang Euclidean, dan kami menggunakan metrik jarak Euclidean ( juga dikenal sebagai Teorema Pythagoras ) untuk menghitung panjang total vektor v dengan komponen vx dan vy Yaitu:
(Perhatikan bahwa akar kuadrat ini tidak ada dalam kode sampel Anda di atas, itulah sebabnya kedua pendekatan tersebut muncul untuk memberikan jawaban yang sama. Lebih lanjut tentang itu sebentar lagi ...)
Kode yang Anda jelaskan menggunakan metrik jarak Manhattan :
(Meskipun Anda tidak menyertakan nilai absolut, yang mungkin membuatnya berperilaku tak terduga untuk angka negatif)
Sangat mudah untuk melihat bahwa kedua fungsi jarak ini cocok ketika vx atau vy bernilai nol, dan kami hanya bergerak di sepanjang satu sumbu. Bagaimana mereka membandingkan ketika kita bergerak secara diagonal?
Katakanlah vx = vy = 1. Berapa lama vektor ini (setara, seberapa cepat kecepatan yang digambarkannya)?
Anda dapat melihat metrik ini sebenarnya tidak setuju untuk garis diagonal.
Mari kita plot pada grafik himpunan poin yang setiap metrik katakan adalah jarak 1 dari titik asal:
Metrik Euclidean yang kita kenal adalah lingkaran merah. Ini adalah himpunan semua titik x, y sedemikian rupa sehingga x ^ 2 + y ^ 2 = 1. Anda dapat melihat bahwa itu simetris-rotasi, dan itulah mengapa kami menyukainya: itu dengan rapi menggambarkan gagasan bahwa jarak tidak berubah dengan arah.
Metrik Manhattan adalah berlian biru. Bukan pasangan yang cocok untuk ide intuitif kita tentang jarak - tetapi itu tidak membuatnya buruk. Dalam banyak permainan berbasis ubin tempat Anda bergerak dalam langkah-langkah terpisah di empat arah mata angin, metrik Manhattan memberikan jarak yang tepat antara titik (dalam hal "berapa banyak gerakan yang diperlukan untuk sampai ke sana?")
Akhirnya, saya melemparkan metrik Chebyshev untuk bersenang-senang - ini adalah kotak hijau:
Ini juga bagus untuk gim berbasis ubin, tempat Anda diizinkan untuk bergerak diagonal. Seorang Raja di Catur bergerak sesuai dengan metrik Chebyshev.
Saya harap ini menjelaskan apa perbedaan antara kode gaya khas Pythagoras dan contoh yang Anda berikan di atas.
sumber
Tanpa Pythagoras, Anda terikat pada kecepatan tetap pada setiap sumbu. Anda memiliki kecepatan x, kecepatan y dan (di dunia 3d) kecepatan z yang semuanya tidak tergantung satu sama lain. Setiap gerakan akan disejajarkan dengan sumbu tegak lurus ini.
Namun, dengan Pythagoras, Anda memiliki kecepatan yang bisa konstan di sudut mana pun. Itu memungkinkan Anda untuk membuat grid menghilang dan benda bergerak dengan kecepatan konstan ke segala arah yang memungkinkan.
Area yang dilalui objek dalam satu detik terlihat tanpa Pythagoras (fe Chebyshev metric):
Dan ini dengan Pythagoras:
Yang terakhir biasanya tampak jauh lebih alami dalam banyak kasus.
sumber