FullCircle/Perlin Noise

Aus C3MAWiki
Wechseln zu: Navigation, Suche

Perlin Noise wird für die Berechnung von Texturen aller Art in Film und Computerspielen genutzt. Wikipedia erklärt Perlin noise ganz gut. Für mehr Details: in die Perlin-FAQ reinlesen.

Das schöne an Perlin noise ist, dass er komplett deterministisch ist. Man hat in der FullCircle-Implementation vier Parameter (vgl. fc-demo.cpp):


 fullcircle::PerlinNoise::Ptr noize(new fullcircle::PerlinNoise(
     3,    // octaves
     .42, // freq
     2.4,   // amplitude
     42    // seed
   ));

Mit den ersten drei Parametern kann man das generelle Aussehen verändern, mit dem letzten Parameter kann man die konkret zu berechnende Sequenz festlegen. In den Inputmodulen müssen wir quasi nur eine Seed berechnen, die dann durch die Klasse in kohärente, aber doch individuell verschiedene Visualisierungen umgesetzt wird. Ein Beispiel ist hier:

https://dl.dropbox.com/u/928797/LightWall/perlin_noise.mov

Für einen einzelnen Frame mache ich darin folgendes:

   fullcircle::Frame::Ptr frame(new fullcircle::Frame(8,8));
   frame->fill_whole(smash->get_background());
   for( uint16_t x = 0; x < 8; ++x) {
     for( uint16_t y = 0; y < 8; ++y) {
       float n=noize->get_3d(x/8.0f, y/8.0f, frameID/10.0f);
       // determine color
       if (0<=n && n<0.3) {
         frame->set_pixel(x,y,smash->get_primary());
       } else if (0.3<=n && n<0.7) {
         frame->set_pixel(x,y,smash->get_secondary());
       } else if (0.7<=n && n<=1.0) {
         frame->set_pixel(x,y,smash->get_background());
       } else {
         std::cout << "Error: Unknown noise value: " << n << std::endl;
       }
     }


(Da ist das Farbschema smash im Spiel, schaut Euch den Code an.) Ich berechne also n und färbe die Kachel entsprechend.