Hướng dẫn Raycasting / câu hỏi toán học vectơ


8

Tôi đang xem hướng dẫn raycasting tuyệt vời này tại http://lodev.org/cgtutor/raycasting.html và có một câu hỏi toán học rất đơn giản.

Trong thuật toán DDA, tôi gặp khó khăn trong việc tìm hiểu sự biến đổi của các biến deltaDistX và deltaDistY, đó là khoảng cách mà tia phải đi từ phía 1 x sang phía x tiếp theo hoặc từ 1 bên sang bên tiếp theo phía y, trong lưới ô vuông tạo nên bản đồ thế giới (xem ảnh chụp màn hình bên dưới).

nhập mô tả hình ảnh ở đây

Trong hướng dẫn, chúng được tính như sau, nhưng không có nhiều lời giải thích:

//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 và rayDirX là hướng của tia đã được đúc.

Làm thế nào để bạn có được những công thức? Có vẻ như định lý pythagore là một phần của nó, nhưng bằng cách nào đó có sự phân chia liên quan ở đây. Bất cứ ai cũng có thể gợi ý cho tôi về những kiến ​​thức toán học mà tôi đang thiếu ở đây, hoặc "chứng minh" công thức bằng cách chỉ ra nó xuất phát như thế nào?


Có lẽ bạn cũng muốn kiểm tra Scratchapixel.com/lessons/3d-basic-lessons/ , trong đó có một lời giải thích rất hay và chi tiết về DDA.
Grieverlove

Câu trả lời:


8

À đúng rồi. Tôi đã ném toán của tôi vào nó và tôi nghĩ rằng tôi đã đánh nó. Bạn đã đúng, nó liên quan đến định lý Pythagore và một số tỉ lệ.

Bạn bắt đầu với vector chuẩn hóa của bạn đại diện cho tia của bạn.

nhập mô tả hình ảnh ở đây

Nó có một xthành phần và một ythành phần. Đầu tiên chúng ta muốn xem nó dài bao nhiêu khi nó di chuyển một đơn vị xtheo hướng. Vậy ta phải làm sao? Chúng tôi muốn chia tỷ lệ toàn bộ vector để xthành phần bằng nhau 1. Để tìm ra quy mô của nó bằng cách nào, chúng tôi làm như sau:

scaleFactor = 1/rayDirX;

Viết nó ra trong toán học nó thực sự chỉ là

scaledX = rayDirX * (1/rayDirX) = 1

Vì vậy, chúng tôi chỉ có thể gọi đó 1.

Sau đó, cho các ythành phần:

scaledY = rayDirY * (1/rayDirX) = rayDirY/rayDirX

Vì vậy, bây giờ chúng ta có các thành phần tỷ lệ của chúng tôi như (1, rayDirY/rayDirX)

Bây giờ, chúng tôi muốn biết chiều dài. Bây giờ Pythagore đi vào chơi. Đó là

length = sqrt((x * x) + (y * y))

Vì vậy, cắm vào các thành phần tỷ lệ của chúng tôi, chúng tôi nhận được:

length = sqrt((1 * 1 ) + (rayDirY / rayDirX) * (rayDirY / rayDirX))

Áp dụng một số đại số và đơn giản hóa và chúng tôi nhận được:

length = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX))

Tương tự với độ dài khi ythành phần di chuyển một đơn vị, ngoại trừ chúng ta sẽ có (rayDirX/rayDirY, 1)kết quả trong

length = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY))

Ở đó chúng tôi có hai phương trình từ câu hỏi của bạn. Khá gọn gàng. Cảm ơn các bài tập đại số.


ahh bạn đánh tôi với nó! Rất đẹp!
Philip

Ha, tôi tiếp tục kiểm tra xem có câu trả lời mới nào không! Tôi cảm thấy như mình đang đua một ai đó :)
MichaelHouse

Rất đẹp, cảm ơn! Rõ ràng là ít hơn nhiều so với tôi mong đợi.
mattboy

Tôi chỉ tìm thấy câu trả lời khi tôi từ bỏ việc cố gắng đảo ngược nó và cố gắng tìm cách tôi sẽ nhận được giá trị đó nếu tôi đang làm nó. Tôi nghĩ rằng có thể nhân rộng vectơ sẽ là một loại phím tắt, nhưng hóa ra nó giống như cách họ đang làm nó :)
MichaelHouse

1

Giả sử chiều dài đơn vị của mỗi khoảng cách lưới là 1.

Tam giác (Tam giác 1) trong sơ đồ đã đăng (câu hỏi OP) bao gồm deltaDistXcạnh huyền, có cùng giá trị cosin của góc của nó với giá trị cosin của góc được tạo trong tam giác được tạo bởi các thành phần của rayDir# Vector(Tam giác 2)

Vì vậy, những điều sau đây có thể được đánh đồng ( cường độ vectơ bên dưới ) và đơn giản hóa (1-3)

Ghi nhớ: cos = Base / Hypotenuse

0. cosine_triangle_2                   = cosine_triangle_1
1. rayDirX/sqrt(rayDirX^2 + rayDirY^2) = 1/deltaDistX
2. (rayDirX*deltaDistX)^2              = rayDirX^2 + rayDirY^2
3. deltaDistX                          = sqrt(1+ rayDirY^2/rayDirX^2)

Tương tự phương trình cho deltaDistYcó thể được dẫn xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.