Saya memeriksa tutorial raycasting yang bagus ini di http://lodev.org/cgtutor/raycasting.html dan memiliki pertanyaan matematika yang mungkin sangat sederhana.
Dalam algoritma DDA, saya mengalami kesulitan memahami perhitungan variabel deltaDistX dan deltaDistY, yang merupakan jarak yang harus ditempuh oleh sinar dari 1 sisi x ke sisi x sisi berikutnya, atau dari sisi 1 y ke sisi berikutnya sisi y, di kotak persegi yang membentuk peta dunia (lihat screenshot di bawah).
Dalam tutorial mereka dihitung sebagai berikut, tetapi tanpa banyak penjelasan:
//length of ray from one x or y-side to next x or y-side
double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
rayDirY dan rayDirX adalah arah dari sinar yang telah dilemparkan.
Bagaimana Anda mendapatkan formula ini? Sepertinya teorema pythagoras adalah bagian darinya, tetapi entah bagaimana ada pembagian yang terlibat di sini. Adakah yang bisa memberi saya petunjuk tentang pengetahuan matematika apa yang saya lewatkan di sini, atau "buktikan" rumus dengan menunjukkan bagaimana itu diturunkan?
sumber
Jawaban:
Ahh ya. Saya melempar matematika saya dan saya pikir saya memukulnya. Anda benar itu memang melibatkan teorema Pythagoras dan beberapa penskalaan.
Anda mulai dengan vektor Anda yang dinormalisasi yang mewakili sinar Anda.
Ini memiliki
x
komponen dany
komponen. Pertama-tama kita ingin melihat berapa lama ketika ia berjalan satu unit kex
arah itu. Jadi apa yang kita lakukan? Kami ingin skala seluruh vektor sehinggax
komponennya sama1
. Untuk mengetahui skala apa yang harus diukur, kami melakukan hal berikut:Menuliskannya dalam matematika itu benar-benar adil
Jadi kita bisa menyebutnya begitu
1
.Kemudian untuk
y
komponen:Jadi sekarang kita memiliki komponen skala kita sebagai
(1, rayDirY/rayDirX)
Sekarang, kami ingin tahu panjangnya. Sekarang Pythagoras ikut bermain. Yang mana
Jadi, memasukkan komponen berskala kami dapatkan:
Terapkan beberapa aljabar dan sederhanakan dan kita dapatkan:
Sama berlaku untuk panjang ketika
y
komponen bergerak satu unit, kecuali kita akan memiliki(rayDirX/rayDirY, 1)
yang menghasilkanDi sana kami memiliki dua persamaan Anda dari pertanyaan Anda. Cukup rapi. Terima kasih untuk latihan aljabar.
sumber
Dengan asumsi panjang satuan dari setiap jarak kisi adalah 1.
Segitiga (Segitiga 1) dalam diagram yang diposting (pertanyaan OP) yang terdiri dari
deltaDistX
sebagai sisi miring, memiliki nilai kosinus yang sama dari sudutnya sebagaimana nilai kosinus sudut yang dibentuk dalam segitiga yang dibentuk oleh konstituen darirayDir# Vector
(Segitiga 2)Jadi yang berikut ini bisa disamakan ( besaran vektor di bawah ), dan disederhanakan (1-3)
Ingat: cos = Base / Hypotenuse
Demikian pula persamaan untuk
deltaDistY
dapat diturunkan.sumber