Nachdem ich mir den Mobius-Streifen angesehen hatte , bemerkte ich, dass seine Gleichung wirklich einfach ist und versuchte, ihn meinem Raytracer hinzuzufügen.
Ich habe einen "naiven" Weg versucht, indem ich einfach N
aneinander befestigte Dreiecke erzeugt habe, um die gewünschte Form zu erhalten. Während dieser Ansatz funktioniert, ist das Ergebnis nicht wirklich hübsch:
(Übrigens habe ich wahrscheinlich ein Problem mit meinen Normalen, aber ich weiß nicht, woher es kommt.)
Ich habe es mit PovRay versucht und das Ergebnis war erstaunlich. Perfekt glatter Streifen, hergestellt in einer weitaus kürzeren Zeit als meiner. Ich bin mir ziemlich sicher, dass Povray gut optimiert ist, aber ich denke auch, dass es keine Dreiecke wie ich erzeugen wird.
Falls dies hilfreich sein könnte, finden Sie hier den tatsächlich verwendeten Code (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
Wie kann ich beim Raytracing mit parametrischen Oberflächen wie dieser umgehen ?
Bearbeiten Nachdem ich den obigen Algorithmus etwa 20 Stunden lang laufen ließ, erhielt ich ein viel schöneres Ergebnis (mit 3 Torsionen anstelle von 1).
isInside
Flag in der Dreieckskreuzungsmethode. Wenn es wahr ist, negiere ich den normalen Vektor. Das Flag wird gesetzt, wenn det < 0
eine Schnittmethode verwendet wird, an die ich mich