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 N
hì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:
(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.
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)
isInside
cờ 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 < 0
sử dụng phương thức giao nhau Tôi không nhớ tên bây giờ