Làm thế nào để raytrace bề mặt Bezier?


18

Tôi đã thử câu hỏi này trên math.SE và thật ngạc nhiên, câu trả lời là "các phương trình quá khó chịu, chỉ cần cung cấp hàm cho công cụ tìm gốc số". Nhưng nếu bạn coi mình là "một người đồ họa" như tôi, và đã chơi rộng rãi với các đường cong Bezier cho công việc thiết kế, tôi đã tin rằng có thể làm tốt hơn. Có một thuật toán được xuất bản bởi Kajiya mà tôi không có kiến ​​thức cơ bản để hiểu (Ma trận Sylvester), nhưng lời khuyên liên quan đến toán học. E là kết quả là đa thức bậc 18 trong t, và bạn vẫn cần phải giải quyết điều đó số lượng. Tôi đã có một ý tưởng khác với kết quả tương tự .

Vì vậy, nó có phải là một giấc mơ hoàn toàn không mong muốn giải quyết giao tuyến bề mặt Ray / Bezier theo đại số, do đó làm cho nó có thể mã hóa rõ ràng và có độ siêu mịn cực nhanh?

Chặn rằng, phương pháp nhanh nhất để thực hiện phép tính này là gì? Bạn có thể "tìm những cái lắc lư" để có được một ràng buộc chặt chẽ (và mục tiêu) cho phân khu đệ quy không? Nếu bạn phải sử dụng một công cụ tìm gốc số (thở dài), nó cần những thuộc tính nào và có sự lựa chọn tốt nhất cho tốc độ không?

Suy nghĩ ban đầu của tôi là về việc chuẩn bị cho một bề mặt cụ thể, tương tự như mở rộng Laplace như được mô tả trong câu trả lời cho câu hỏi toán học khác của tôi về hình tam giác . Nhưng tôi cũng quan tâm đến các phương pháp chung. Tôi chỉ nghĩ về một bộ hình dạng cố định, như ấm trà Utah . Nhưng tôi rất quan tâm đến các cách tối ưu hóa cho sự gắn kết tạm thời trên các khung hình hoạt hình.


Bạn đang tìm kiếm một phương pháp chung mà bạn có thể áp dụng cho bề mặt Bezier tùy ý, hoặc cách chuẩn bị một phương pháp nhanh cho một bề mặt cụ thể? Hình dạng bề mặt của bạn sẽ được cố định trước khi chạy?
trichoplax

1
Lưu ý rằng bạn có thể raymarch bezier bề mặt dễ dàng hơn nhiều so với raytracing nó. Bạn cũng có thể raytrace hoặc raymarch univariate bề mặt dễ dàng hơn nhiều so với các loại khác! blog.demofox.org/2015/07/11/ripse-bezier-patches
Alan Wolfe

Câu trả lời:


14

Trước hết, đây là phương pháp Kajiya tôi nghĩ rằng bạn đang nghĩ đến: Kajiya, Bản vá tham số Ray Trace , SIGGRAPH 82. Phiên bản báo cáo công nghệ có thể nhiều thông tin hơn.

Điều tôi hy vọng bạn nhận được từ điều đó là không phải là không thể và nó không khó về mặt khái niệm nếu bạn không ngại làm bẩn tay với một số hình học đại số và số phức. Tuy nhiên, làm nó trực tiếp là tốn kém vô lý.

Các bộ quét tia "thực" có xu hướng thực hiện một số kết hợp của hai điều:

  • Đặt một hệ thống phân cấp giới hạn (ví dụ AABB) trên bản vá để có được "giá trị ban đầu" tốt cho công cụ tìm gốc số. Nếu bạn làm tốt điều này, bạn có thể tránh được vấn đề "nhăn".
  • Vận chuyển miếng vá vào vỏ DDG và tia truy tìm chúng như các mắt lưới đa giác.

Điểm cuối cùng đó nghe có vẻ như giết chết yêu cầu "siêu mịn", nhưng nó gần như không tệ như khi bạn sử dụng các vi sai tia . Khớp mức độ tessname với "kích thước" của tia sẽ xử lý lỗi một cách độc đáo. Ngoài ra, dù sao đi nữa, bạn có thể cần vi sai cho tọa độ kết cấu, vì vậy bạn cũng có thể sử dụng nó để kiểm soát độ chính xác của kiểm tra giao cắt.

Khai thác sự gắn kết tạm thời không phải là một ý tưởng tồi, nhưng chính xác cách bạn thực hiện điều đó phụ thuộc rất nhiều vào biểu diễn đồ thị cảnh của bạn. Bạn có thể muốn nhìn vào sự kết hợp tia. Hỏi công cụ tìm kiếm yêu thích của bạn về theo dõi gói tiasắp xếp lại tia .


9

Là một giấc mơ hoàn toàn bằng ống để hy vọng giải quyết giao điểm bề mặt Ray / Bezier theo đại số

Vâng, đó là một giấc mơ ống. Một miếng vá Bezier bicubic là một bề mặt đại số của độ 18. Để cắt một tia với bề mặt này, bạn phải tìm các gốc của một đa thức bậc 18. Không có công thức nào cho các rễ này - bạn phải tìm chúng bằng các phương pháp số . Trên thực tế, có những kết quả toán học ( định lý Abel-Ruffini ) cho chúng ta biết rằng không bao giờ có thể có công thức cho các gốc của phương trình ngoài độ 4. Toán học không chỉ nói rằng các công thức chưa được tìm thấy; nó nói rằng chúng sẽ không bao giờ được tìm thấy, bởi vì chúng không thể tồn tại.

Nếu bạn thực sự muốn thực hiện theo dõi tia phân tích (đại số) các hình dạng cong, bạn có thể thử sử dụng các bản vá Steiner . Chúng có độ 4, vì vậy giao điểm của tia-vá có thể được tính bằng cách tìm các gốc của một tứ phân vị (tức là đa thức bậc 4). Có những công thức để tìm ra nguồn gốc của tứ phân, nhưng chúng khá khó chịu và thật khó để viết mã thực hiện các công thức một cách đáng tin cậy.


5

Một tùy chọn khác, mà tôi đã sử dụng một vài thập kỷ trước (yike!), Là sử dụng sơ đồ của Toth từ năm 1985 sử dụng số học khoảng thời gian để thu hẹp không gian tìm kiếm. IIRC, cuối cùng nó sẽ dùng đến Newton-Rhapson, nhưng, một lần nữa IIRC, tôi nghĩ rằng hiếm khi cần nhiều hơn một hoặc hai bước để có được một giải pháp tốt.

Mặc dù tôi đã không nhìn vào nó (tốt, ngoài một cái liếc nhanh), Mitchell đã xuất bản một số công việc gần đây hơn về phương pháp dò tia với toán học xen kẽ.

(Tôi nên nói thêm rằng, nếu bạn chỉ làm bề mặt Bezier, thì phương thức khoảng có thể hơi "quá mức" vì bạn có thể sử dụng các thủ thuật như nở hoa để lấy giới hạn và dẫn xuất. Tuy nhiên, nếu bạn kết hợp các đường cong Bezier với các chức năng khác, ví dụ: xoay quanh một trục, thì tính tổng quát của nó hữu ích hơn.)


1

https://www.shadertoy.com/results?query=bezier sắp xếp theo độ tuổi, trong trường hợp có vấn đề tương thích:

, ... hiển thị nhiều giải pháp của nhiều tập con spline, hoặc trả lại khoảng cách cho spline 2d hoặc truy tìm bản vá 3d. Splines và patch có nhiều dạng. thiên đàng đơn giản nhất, bezier đơn giản, nuôi dưỡng quá phức tạp. Càng nhiều ràng buộc yo thêm vào spline của bạn, nó càng đơn giản. NURBS là phần mở rộng quá mức cần thiết; - Tính không đồng nhất của trọng số ("NU") làm giảm hiệu quả so với các phép chia đối xứng hơn - Ration-al-ness (R) của nó cũng thêm một số phức tạp, để phân đoạn (phân phối) và trộn với các phân đoạn gần đó (giải quyết đệ quy).

bezier-patch-trace là giải quyết gốc và đi kèm với đó là ưu tiên theo ngữ cảnh về độ chính xác; theo thứ tự nào để giải phương trình bậc hai. điều này trở nên không thực tế trên các số mũ cao hơn khối, do độ phức tạp theo cấp số nhân và mất độ chính xác.

ray-march == theo dõi hình cầu là cách tiếp cận heuristic đơn giản hơn để giải quyết gốc, dường như là giải pháp đơn giản và hiệu quả nhất để hiển thị hầu hết các bản vá spline.

Biểu diễn Lagrange đơn giản hóa việc theo dõi / diễu hành (vì các điểm L được BẬT trên spline trong khi các điểm ControlVector (của cùng một spline) hiếm khi xuất hiện trên spline)

Trường hợp đặc biệt của một thiên thể-spline, trong đó các dẫn xuất đầu tiên của stat và end là == 0. đơn giản hóa tính liên tục và liên quan đến ít khác biệt (ít trừ). Một miếng vá thiên đàng có thể được theo dõi một cách hiệu quả trong một lần chạy: https://www.shadertoy.com/view/4djfW3 trong khi các spline hình khối (hoặc cao hơn) khác làm cho phương pháp theo dõi hình cầu / di chuyển bằng tia heuristic hiệu quả hơn (và " đủ chính xác ") hơn là dám tính toán phân tích tất cả các gốc để giữ gốc dương nhỏ nhất (với các lỗi chính xác tích lũy theo cấp số nhân cho mỗi gốc).


Trong đồ họa máy tính, spline và patch đã được thay thế gần như hoàn toàn bằng cách quét z vào năm 2006. z-Brushing sử dụng các bản đồ dịch chuyển với tọa độ đồng nhất hoặc thậm chí sử dụng một "loại" mà chúng ta kết hợp giữa hình cầu và đường thẳng (đường thẳng có bán kính là 0, hình cầu có độ dài bằng 0, liên kết đơn giản và hữu ích). Đối với một sự mất mát nhỏ về độ chính xác để đạt được hiệu suất lớn với chi phí bộ nhớ tương đối thấp cho bảng tra cứu, điều đó dễ dàng tạo ra động trên một gpu.


Đừng bận tâm. tất cả các giải pháp vá 3d được thực hiện bằng cách theo dõi hình cầu.
ollj

nó chỉ làm tăng đáng kể hiệu suất và độ chính xác khi bản vá đơn giản hơn. đến một điểm mà một bản vá của các thiên đàng sẽ đưa bạn đi rất xa trong một vài lần lặp lại:
ollj

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.