class Noise{ public:

NoiseO // a constructor // конструктор

{
int i:
index = new unsigned char[256];

for(i - 0; i < 256: i++) index[i] = i: // fill array with indices // заполняем массив индексами

14.8. Наложение текстуры на поверхности

ford = 0; i < 256: i++)

// shuffle it // перемешиваем его {

int which - randO % 256: // choose random place in array // выбираем случайное место в массиве

unsigned char tmp = index[which]:
// swap them

// переставляем их

index[which] - index[i]; index[i] = tmp:
}
noiseTable = new float[256]; for(i - 0: i < 256: i++) noiseTable[i] - rand()/32767.99:
}

// end of constructor // конец конструктора

float noise(float x. float y, float z); float noise(float scale. Point3& p): float turbulence(float s. Point3& p): float marble(float x, float y. float z): float marble(float strength,Point3& p):
private:

float* noiseTable: // array of noise values // массив значений шума

unsigned char * index; // pseudo random indices // псевдослучайные индексы

float mySplineCfloat x): // used for marble // используется для мрамора

float TatticeNoiseCint i. int j. int k)
{

// return noise value on an integer lattice // возвращаем значение шума на целочисленной решетке #define PERM(x) index[(x) & 255]

#define INDEXOx, iy. iz) PERM( (ix) + PERM((iy) + PERM(iz)) ) return noiseTable[IMDEX(i.j.k)]:
}
}:

Наибольший интерес представляет метод данного класса marbleO, возвращающий координатно-за-висимое значение яркости в пределах от нуля до единицы, которое имитирует прожилки темного и светлого камня в мраморе. Позднее мы детально разработаем этот метод. Он будет использован на начальной стадии трассировки лучей для создания зеленоватого мрамора путем конструирования объекта noise с помощью команды

Noise п:

// create and construct a noise objec;

// создаем и конструируем объект класса noise

Введение в трассировку лучей

и последующего вычисления значения функции 1ехгд1ге(л:, у, г) в любой точке (х, у, г) простым вызовом оператора п.тагЫе(х, у. г): В свою очередь метод тагЫеО использует методы noise() и т,игЬи1епсе(), которые мы вкратце опишем, а также «вспомогательную» функцию 1аШсе№ше(). Конструктор класса создает и заполняет массивы пхтеТаЫеП и 1пс1ех[]. Случайные значения, помещаемые в массив гктеТаЫеП, создаются с помощью стандартной С-функции галсЮ, которая масштабирует эти значения в диапазон от 0,0 до 1,0. Массив 1поех[] вначале загружается числами от 0 до 255 в порядке возрастания, а затем «перемешивается» посредством поочередной перестановки каждого элемента с каким-либо другим случайно выбранным элементом.


⇐ Предыдущая| |Следующая ⇒