Làm thế nào để xử lý một phương trình tham số trong raytracing?


7

Sau khi xem qua dải Mobius , tôi nhận thấy phương trình của nó thực sự đơn giản và đã cố gắng thêm nó vào Raytracer của tôi.

Tôi đã thử một cách "ngây thơ" bằng cách đơn giản tạo ra các Nhình tam giác gắn liền với nhau để có được hình dạng mong muốn. Trong khi phương pháp này hoạt động, kết quả nó không thực sự đẹp:

IMG

(Nhân tiện, tôi có thể có một vấn đề với quy tắc của mình nhưng tôi không biết nó đến từ đâu.)

Tôi đã thử nó với PovRay và kết quả thật đáng kinh ngạc. Dải hoàn hảo mịn được thực hiện trong một thời gian nhỏ FAR xa hơn so với của tôi. Tôi khá chắc chắn Povray được tối ưu hóa tốt nhưng tôi cũng nghĩ nó sẽ không tạo ra các hình tam giác như tôi đã làm.

Pjray

Trong trường hợp có thể giúp ích, đây là mã thực tế được sử dụng (C ++):

float step = .1f;
float halW = 0.5f;

_facets.clear();

auto lambda = [this] (float v, float t) {
  Vec_t p;

  float cdv = Tools::Cos(2 * v);
  float sdv = Tools::Sin(2 * v);
  float ctv = Tools::Cos(v);
  float stv = Tools::Sin(v);

  float c = 2 + t * ctv;

  p.x = c * cdv;
  p.z = c * sdv;
  p.y = t * stv;

  return p;
};

for (float v = 0.f; v < Globals::PI; v += step)
{
  if (v > Globals::PI)
    v = Globals::PI;

  for (float t = -halW; t < halW; t += step)
  {
    if (t > halW)
      t = halW;

    Vec3 p1 = lambda(v, t);
    Vec3 p2 = lambda(v + step, t);
    Vec3 p3 = lambda(v, t + step);
    Vec3 p4 = lambda(v + step, t + step);
    _facets.emplace_back(p1, p2, p3);
    _facets.emplace_back(p3, p2, p4);
  }
}

TL; DR

Làm thế nào tôi có thể xử lý các bề mặt tham số như thế này trong raytracing?

Chỉnh sửa Sau khi để thuật toán trên chạy trong khoảng 20 giờ, tôi đã nhận được kết quả đẹp hơn (với 3 lần thay vì 1)

Kết quả tốt hơn


Đối với vấn đề cụ thể được phác thảo bằng màu đỏ trong hình ảnh đầu tiên, có vẻ như bạn có thể cần kiểm tra phía nào của bề mặt bạn đang tiếp cận trước khi quyết định cách nào mà điểm bình thường nên chỉ ra, nếu không một số vùng sẽ bị mờ không chính xác. Điều này đặc biệt xuất hiện đối với dải Mobius, vì phải có một điểm tại đó các đường chuẩn sẽ chuyển hướng do xoắn. Phải có một số hình tam giác liền kề có hướng gần như ngược chiều bình thường (như hình tam giác liền kề sáng và tối trong ảnh).
trichoplax

Vâng, tôi cũng nghĩ vậy nhưng tôi đang đặt isInsidecờ trong phương thức giao nhau của tam giác. Nếu nó đúng thì tôi phủ định vectơ bình thường. Cờ được đặt nếu det < 0sử dụng phương thức giao nhau Tôi không nhớ tên bây giờ
Telokis

Câu trả lời:


6

Cách đây nhiều năm, tôi đã làm việc trên một máy dò tia xử lý các bề mặt tham số, vì vậy đây không chắc là trạng thái của nghệ thuật, nhưng, IIRC, tôi đã sử dụng kết hợp số học khoảng với phân chia (nhị phân?) Và Newton-Rhapson.

Các ô giới hạn số học + phân chia được xây dựng (bảo thủ) có thể được sử dụng để loại bỏ giao lộ. Tôi nghĩ rằng tôi cũng có thể đã sử dụng số học khoảng trên đạo hàm 1 để giúp xác định khi nào an toàn để khởi chạy vào Newton-Rhapson. Điển hình là các bước Newton hội tụ rất nhanh.

Bạn cũng có thể xúc xắc các bề mặt tham số của mình và đặt chúng vào cấu trúc gia tốc (lưới Voxel / BVH) để tăng tốc quá trình.

Tác phẩm này được dựa trên / lấy cảm hứng từ bài báo "On Ray Trace Parametric Surfaces" năm 1985 của Daniel Toth


Cảm ơn câu trả lời nhưng tôi phải thừa nhận rằng tôi không hiểu mọi thứ. Bạn có thể đặt một số ví dụ hoặc mã cụ thể để tôi không thể nhìn rõ hơn được không?
Telokis

Đồng ý. Tôi không có thời gian hôm nay, nhưng sẽ cố gắng thêm một số thông tin sớm (ish).
Simon F

Những gì bạn đề nghị là tôi tiếp tục sử dụng phương pháp xây dựng hình tam giác của mình nhưng tôi có nên sử dụng thuật toán phân chia không gian để "buộc" tính toán không?
Telokis

Dường như với tôi, bạn có hai tùy chọn cơ bản, tuy nhiên, trong một số giác quan, cả hai đều có thể hội tụ đến một kết quả 'tương đương': (a) Số học khoảng, để loại bỏ các vùng theo sau bởi Newton-Rhapson để giải quyết giao điểm tia hoặc (b ) xúc xắc (tức là tessellate) đối tượng của bạn thành các hình tam giác "đủ nhỏ" mà bạn không nhìn thấy các vật phẩm gián đoạn (như trong hình ảnh đầu tiên của bạn). Theo một nghĩa nào đó, chúng là "tương tự" vì trong (a) mỗi lần lặp Newton-R xấp xỉ bề mặt cục bộ như một mặt phẳng (giống như một tam giác nhỏ). Tôi nghi ngờ b sẽ dễ thực hiện hơn nhiều nhưng khó để ước tính mức phân khu lý tưởng.
Simon F

2

Nói chung khi thực hiện tham số trong bộ dò tia, bạn cần một giải pháp cho

{P=vt+CP=f(u,v)

với thấp nhất trong đó là hàm tham số của bạn là vị trí camera và là hướng tia.tf(u,v)Cv

Có một vài cách chung, ví dụ nếu bạn có thể biết liệu 2 điểm có cùng phía hay không, bạn có thể lấy 2 điểm trên tia ở hai phía đối diện và tìm kiếm nhị phân cho đến khi bạn có độ sâu. Bạn có thể tìm thấy cặp đầu tiên bằng cách diễu hành dọc theo tia.


Bạn có ý nghĩa gì bởi "cùng một phía"? Tôi biết ý tưởng chung về "cách thực hiện" nhưng tôi không biết nó diễn ra như thế nào trong thực tế. Povray cho kết quả chính xác và đẹp như vậy, tôi không hiểu làm thế nào nó có thể làm được.
Telokis
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.