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).
quelle
isInside
Flag in der Dreieckskreuzungsmethode. Wenn es wahr ist, negiere ich den normalen Vektor. Das Flag wird gesetzt, wenndet < 0
eine Schnittmethode verwendet wird, an die ich michAntworten:
Vor vielen Jahren habe ich an einem Raytracer gearbeitet, der parametrische Oberflächen handhabt, daher ist dies wahrscheinlich nicht der Stand der Technik, aber IIRC habe ich eine Kombination aus Intervallarithmetik mit (binärer?) Unterteilung und Newton-Rhapson verwendet.
Die Intervallarithmetik + Unterteilung konstruierte (konservative) Begrenzungsrahmen, die zur Schnittpunktunterdrückung verwendet werden könnten. Ich glaube, ich habe möglicherweise auch Intervallarithmetik für die 1. Ableitung verwendet, um festzustellen, wann der Start in Newton-Rhapson sicher war. Typischerweise konvergierten die Newton-Schritte sehr schnell.
Sie können Ihre parametrischen Oberflächen auch vorab in Würfel schneiden und in eine Beschleunigungsstruktur (Voxel-Gitter / BVH) einfügen, um den Prozess zu beschleunigen.
Diese Arbeit basiert auf / inspiriert von Daniel Toths 1985er Arbeit "On Ray Tracing Parametric Surfaces".
quelle
Wenn Sie in einem Ray Tracer parametrisch arbeiten, benötigen Sie im Allgemeinen eine Lösung für
für die niedrigstent wo f( u , v ) ist Ihre parametrische Funktion C. ist die Kameraposition und v ist die Strahlrichtung.
Es gibt einige allgemeine Möglichkeiten. Wenn Sie beispielsweise feststellen können, ob sich 2 Punkte auf derselben Seite befinden oder nicht, können Sie 2 Punkte auf dem Strahl auf gegenüberliegenden Seiten nehmen und binär suchen, bis Sie die Tiefe erreicht haben. Sie können das erste Paar finden, indem Sie entlang des Strahls marschieren.
quelle