- •© Вурста с.Ю.,Літнарович р.М.,2010
- •Вступ………………………………..………………………5
- •4.1.Високопродуктивний компілятор в машинний код………………………………..………………... 126
- •4.4 Бібліотека візуальних компонент…………..135
- •5. Опис графічних бібліотек для написання 3d – програм та ігор……………….……………………………………151
- •1. Історія появи фракталів та їх використання
- •2. Довжина берегової лінії. Фрактальна розмірність. Поняття фрактала.
- •2.1. Приклади побудови фрактальних множин. Класифікація фракталів.
- •2.2. Алгоритм фрактального шуму або шум перліна
- •2.3. Реалізація алгоритму
- •3. Історія розвитку комп’ютерної графіки та ігор
- •3.1. Основні поняття зd-графіки
- •3.2. Основні прийоми для роботи з світлом в 3d:
- •3.3 Алгоритми рельєфного текстурування
- •3.3.1 Рельєфне текстурування (bump mappіng)
- •3.3.5 Простий Relief Mapping
- •3.3.6 Багатошаровий Relief Mapping
- •3.4 Основні прийоми для роботи з текстурами в 3d:
- •3.5 Основні поняття про шейдер та види шейдерів
- •3.6. Генерація тривимірних ландшафтів
- •4.1 Високопродуктивний компілятор в машинний код
- •4.2. Могутня об'єктно-орієнтована мова
- •Об'єктно-орієнтована модель програмних компонент
- •4.4 Бібліотека візуальних компонент
- •4.5. Робота з компонентами
- •5. Опис графічних бібліотек для написання 3d – програм та ігор
- •5.1 Опис графічної бібліотеки OpenGl
- •5.2 Графічна бібліотека DirectX
- •5.3 Візуальні бібліотеки компонентів для OpenGl та DirectX.
- •5.4 Опис закладок glScene
- •6. Проектування системи
- •6.1 Вибір середовища реалізації
- •6.2 Опис використаних компонент glScene для реалізації системи
- •Опис інтерфейсу розробленої системи
- •6.3.1 Панель інструментів
- •6.3.2 Опис робочої області
- •6.3.3 Опис панелі налаштування 3d-сцени
- •Висновки
- •Список літератури:
- •Побудова фрактальних поверхонь в комп’ютерній графіці
- •33027 Рівне , Україна
2.3. Реалізація алгоритму
Ядром тут служить шумова функція. Її можна визначити, наприклад, таким чином:
function IntNoise(32-bit integer: x)
x = (x<<13) ^ x;
return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end IntNoise function
Тут на вхід подається ціле число, а на виході виходить дробове число між -1.0 і 1.0.
Далі використовується інтерполяція. Тут, також, можливі деякі варіанти:
Лінійна інтерполяція:
function Linear_interpolate(а, b, x)
return a*(1-х)+ b*x
end of function
Це найпростіший спосіб інтерполяції: найшвидший, зате володіє поганою точністю.
Косинусна інтерполяція:
function Cosine_interpolate(а, b, x)
ft = x * 3.1415927 f = (1 - cos(ft)) * .5 return a*(1-f)+ b*f end of function
Точніший метод, ніж лінійна інтерполяція (виходить гладка крива), зате повільніший за рахунок обчислення косинуса. Обчислення можна прискорити, якщо використовувати табличне завдання косинуса.
Кубічна інтерполяція:
function Cubic_interpolate(v0, v1, v2, v3,x) P = (v3 - v2) - (v0 - v1) Q = (v0 - v1) - P R = v2 - v0 S = v1 return Px3 + Qx2 + Rx + S end of function
Це більш точний метод, ніж косинусна інтерполяція, але повільніший, за рахунок використання великої кількості множень. Як правило, досить використовувати лінійну або косинусную інтерполяцію.
На етапі інтерполяції відбувається згладжування кривої, але необхідно також згладжувати отримувану картинку, використовуючи двовимірні фільтри.
function Noise(x, y)
.
.
end function
function SmoothNoise_2D(x>, y)
corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16
sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8
center = Noise(x, y) / 4
return corners + sides + center
end function
Виходячи зі всіх умов і перетворень в результаті отримаємо наступний алгоритм отримання двовимірної картинки з використанням функцій Perlin Noise:
function Noise(integer x, integer y)
n = x + y * 57;
n = (n << 13) ^ n;
return (1.0 - ((n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);
end function
function SmoothNoise(float x, float y)
corners = (Noise(x-1, y-1) + Noise(x+1, y-1) + Noise(x-1, y+1) + Noise(x+1, y+1)) / 16
sides = (Noise(x-1, y) + Noise(x+1, y) + Noise(x, y-1) + Noise(x, y+1)) / 8
center = Noise(x, y) / 4
return corners + sides + center
end function
function InterpolatedNoise(float x, float y)
integer_X = int(x)
fractional_X = x - integer_X
integer_Y = int(y)
fractional_Y = y - integer_Y
v1 = SmoothedNoise(integer_X, integer_Y)
v2 = SmoothedNoise(integer_X + 1, integer_Y)
v3 = SmoothedNoise(integer_X, integer_Y + 1)
v4 = SmoothedNoise(integer_X + 1, integer_Y + 1)
i1 = Interpolate(v1 , v2 , fractional_X)
i2 = Interpolate(v3 , v4 , fractional_X)
return Interpolate(i1 , i2 , fractional_Y)
end function
function PerlinNoise_2D(float x, float y)
total = 0
p = persistence
n = Number_Of_Octaves - 1
loop i from 0 to n
frequency = 2i
amplitude = pi
total = total + InterpolatedNoise(x * frequency, y * frequency) * amplitude
end of i loop
return total
end function
Замість функції Interpolate зазвичай вибирається функція або лінійною, або косинусной інтерполяції.
Інтерактивна зміна наприклад хмарності істотно підвищує ступінь застосовності застосування. Зміна хмарності в реальному часі дозволяє точніше визначити можливості програми, а також відобразити ефект впливу хмар на підвищення реалістичності сцени як цілого.
Рис..5 «Зміна хмарності»
Якщо для моделювання хмар використовується Perlin noise, то для зміни хмарності досить відняти попіксельно деяку константу (оскільки отримуєм у результаті роботи алгоритму Perlin Noise карту інтенсивностей) і зробити значення менші нуля рівними нулю як це показано на Рис.5.
