Hallo! Habe wieder einige Tage benötigt (im besten Fall ist man das von mir gewöhnt), danke für die Reaktion!
@Finnegan sagte in Random Walkers 3D:
Also ich finds schick. Immer cool wenn man an dem Punkt ist, dass der ganze Code was ansehnliches produziert. Bei eigenen Sachen könnte ich da stundenlang mit rumspielen (nach all den Tagen des Haareraufens)
Schade, das Ihr Profis nicht auch mal etwas zeigt Kann mir vorstellen, das das etwas umfangreicher wird, aber man hätte dann ein Target, an dem man sich orientieren kann...
Die Heatmap repräsentiert die Schrittdistanz, oder ist das nur der Abstand zum Zentrum (sieht man nicht so ganz genau)?
Bei Heatmap musste ich erst wieder googeln, es könnte auf drei Verfahren in meinem Code hindeuten, die Farbgebung, das 'Node Heading' was als Wert im Video angegeben ist, die Schrittweite zwischen zwei Nodes.
Die Farbgebung ist einfach die x,y,z Koordinate eines Node umgerechnet in sphärische Koordinaten wobei der max-Radius die halbe (ungefähre, aus optischen Gründen) Diagonale des sichtbaren Würfels ist. Dieser Wert, bzw der Radius wird dann auf die Größe der Farb Palette 'remapt'.
case CENTER:
radius = math::toSpherical(pos).Radius;
index = static_cast<std::size_t>(utils::map(radius, 0.0, BORDER * 1.3, 0.0, std::size(Desc.Palette) - 1.0));
return Desc.Palette[index];
.
Das 'Node Heading' wiederum beschreibt in wie weit sich der Walker bei einem Schritt dreht. Bei 0 gibt es gar keine Drehung, bei 1 ist es ein Vollkreis.
zp::Vector3D<double> zp::RandomWalker3DX::getRandomAngle(const double heading) const
{
Random rng;
const double angle = heading * math::TAU<double>;
const double x = rng.uniformReal<double>(-angle / 2, angle / 2);
const double y = rng.uniformReal<double>(-angle / 2, angle / 2);
const double z = rng.uniformReal<double>(-angle / 2, angle / 2);
return { x, y, z };
}
walker.Active.Vel *= Mat4x4<double>().makeRotation(getRandomAngle(walker.Active.Heading));
walker.Active.Pos += walker.Active.Vel;
.
Damit kommen wir zu der Schrittweite. Die wird als Startwert vorgegeben, abhängig davon, wo der Walker starten soll. Die Schrittweite soll vom vorgegebenen Radius eines Node abhängen.
Beim Center, wie in diesem Fall, soll das sein:
case CENTER:
pos.clear();
vel = getRandomVelocity(1.0, node.Radius * 2);
break;
wobei hier das Heading dann 1.0 ist.
zp::Vector3D<double> zp::RandomWalker3DX::getRandomVelocity(const double heading, const double scale) const
{
Random rng;
const double angle = heading * math::TAU<double>;
const double phi = rng.uniformReal<double>(-angle / 2, angle / 2);
const double theta = rng.uniformReal<double>(-angle / 2, angle / 2);
return math::toCartesian<double>(scale, phi, theta);
}
.
Ansonsten: Schön solche Fortschritte zu sehen. Ich erinnere mich noch vage wie wir hier noch über Vektoren, Kameras und Transformationen diskutiert haben. Weiter so!
Ja, danke schön. An dieses Thema kann ich mich auch noch erinnern, wo ich auch wieder einige Zeit zum Reagieren benötigte und ich glaub das ist dann sogar eingeschlafen. Es ging damals darum, das meine Berechung für verdeckte Flächen irgendwo falsch oder unvollständig war. Jedenfalls blitzten in einem bestimmten Winkel immer wieder eigentlich verdeckte Flächen durch. Das Problem habe ich übrigens immer noch Könnte ich ja mal ansprechen, irgendwo gibt es bestimmt eine Lösung. Zum Glück trifft das hier nicht zu. Hier wird strikt von hinten nach vorne gepinselt.
Vielleicht zeige ich auch wieder den gesamten Code. Es braucht ja zum Glück von meiner Engine nur die Create- und Update Methode (mit natürlich den benötigten Funktionen für die Darstellung), um den Code wie er im Video dargestellt wird zu beschreiben.
Also viele Grüße
PS: Ich denke, ich bin im Unterforum 'Jenseits der Programmierung' doch falsch aufgehoben, Bei mir geht es doch gerade um Programmierung. Aber so ist 'my Life'...