Неділя, 13.10.2024
Творча лабораторія

Навчальні посібники та робочі зошити з інформатики - якісно і дешево


Меню сайту
Реклама
Категорії каталогу
Blender [9]
Безплатна програма для тривимірного моделювання та анімації
GIMP [5]
Використання графічного редактора GIMP
Inkscape [3]
Використання графічного редактора Inkscape
Відео [1]
Головна » Статті » Графіка » Blender

Фрактальні куби

Нові статті

[19.02.2020] [C#]
Задача про розрізання квадрата (ООП, C#)
[09.02.2020] [Python]
Задача про розрізання квадрата (ООП, Python)
[06.02.2020] [Паскаль]
Задача про розрізання квадрата (ООП, Free Pascal)

Пилипчук О.П., вчитель інформатики Гаврилівської ЗОШ Теофіпольського району Хмельницької області

Фрактальні куби

Рекурсія при побудові 3D-моделі (Blender, Python)

Комп'ютерна графіка давно відірвалась від площини і набула об'єму. Без тривимірного комп'ютерного моделювання важко уявити процес розорбки сучасного відеоматеріалу: від рекламного ролика до повнометражного фільму.

Сучасні програми для роботи з 3D-графікою мають багато зручних засобів, проте, якщо їх не вистачає, для отримання особливих ефектів користувач може звернутися до програмування. Наприклад, програма для роботи з тривимірною графікою Blender дозволяє розробляти й використовувати програмні модулі (скрипти) мовою Пітон (Python). При написанні такого модуля програміст оперує безпосередньо об'єктами, з яких складається модель та значеннями їхніх властивостей. Для успішної роботи потрібно детально вивчити функції програмного інтерфейсу (API) Blender. Проте, щоб зрозуміти, як будується тривимірна модель, досить мати базові навички програмування однією з мов.

Розглянемо приклад. На цьому сайті вже описана побудова фрактальних малюнків засобами мов програмування ЛОГО та Паскаль. Перенесемо цей принцип побудови у простір, щоб отримати тривимірну модель, подібну до наведеної на малюнку.

На відміну від розглянутих вище прикладів, у просторі базовим об'єктом є куб. Кожне ребро базового куба ділиться на 3 рівні частини. Таким чином, отримуємо 27 менших кубів. Центральний з менших кубів (на малюнку - синій) треба "намалювати", а з кожним із 26, що лишились, зробити те ж саме, що й з базовим, тобто, теж поділити на частини, зобразити центральний (на малюнку - червоні) і рекурсивно опрацювати інші.

Технічні деталі

Запустіть Blender. Вилучіть куб, який є у сцені за замовчанням. Розділіть 3D-вікно по вертикалі на дві частини. Для правого з отриманих вікон встановіть режим Text Editor (текстовий редактор). Саме у цьому вікні слід набрати програмний код, наведений далі.

Особливістю мови Пітон є те, що логіка програми визначається відступами рядків від краю текстового вікна з програмою. Наприклад, у такому фрагменті

if (k>0):
    a = a + 1
    с = с + 7
b = b + 5

оператори a = a + 1 та с = с + 7 знаходяться в зоні дії умовного оператора if (k>0), а оператор b = b + 5 - за його межами. Так само виділяють оператори, які належать до тіла циклу. Найзручніше відступи встановлювати за допомогою клавіші Tab.

Програма

Наведений далі програмний код слід набрати у вікні текстового редактора. Зміст операторів зрозумілий з коментарів, які у мові Пітон позначають символом "#".
 

import Blender # підключення необхідних для роботи модулів
from Blender import NMesh # підключення необхідних для роботи модулів

# процедура для створення кубика з вершиною з координатами x,y,z та ребром а

def cubic(x,y,z,a): 
 
    poly = NMesh.GetRaw() # створюємо порожній 3D-об'єкт (меш) з ім'ям poly

    v = NMesh.Vert(x,y,z) # створюємо об'єкт-вершину v
    poly.verts.append(v) # додаємо вершину v до списку вершин об'єкта poly

    v = NMesh.Vert(x+a,y,z) # аналогічно додаємо інші вершини
    poly.verts.append(v)

    v = NMesh.Vert(x+a,y+a,z)
    poly.verts.append(v)

    v = NMesh.Vert(x,y+a,z)
    poly.verts.append(v)

    v = NMesh.Vert(x,y,z+a)
    poly.verts.append(v)

    v = NMesh.Vert(x+a,y,z+a)
    poly.verts.append(v)

    v = NMesh.Vert(x+a,y+a,z+a)
    poly.verts.append(v)

    v = NMesh.Vert(x,y+a,z+a)
    poly.verts.append(v)

    f = NMesh.Face() # створюємо порожній об'єкт - нижню грань f
    for i in range(0,4): # додаємо до цієї грані ...
        f.v.append(poly.verts[i]) # ...вершини зі списку вершин об'єкта poly 

    poly.faces.append(f) # додаємо створену грань до об'єкта poly 
 
    f = NMesh.Face() # аналогічно створюємо верхню грань f
    for i in range(4,8):
        f.v.append(poly.verts[i])
    poly.faces.append(f)

    for i in range(0,4): # аналогічно створюємо 4 бічні грані f ... 
        f = NMesh.Face()
        f.v.append(poly.verts[i])
        f.v.append(poly.verts[(i+1)%4])
        f.v.append(poly.verts[4+(i+1)%4])
        f.v.append(poly.verts[i+4])
        poly.faces.append(f) # ... і кожну додаємо до об'єкта poly 
 
    polyObj = NMesh.PutRaw(poly) # додаємо створений об'єкт poly до сцени, тобто, робимо його видимим

# процедура для рекурсивної побудови фрактального об'єкту

def recurs (x,y,z,a,k):
    if (k>0): # змінна k керує глибиною рекурсії
        cubic(x+a,y+a,z+a,a) # будуємо центральний куб
 
 # для 26 сусідніх забезпечуємо рекурсивні виклики цієї ж процедури
 # зверніть увагу на відступи вкладених циклів
    for dx in range (0,3):
        for dy in range (0,3):
            for dz in range (0,3):
                if (dx<>1)or(dy<>1)or(dz<>1):
                    recurs(x+dx*a,y+dy*a,z+dz*a,a/3.0,k-1)

# ОСНОВНА ПРОГРАМА

# виклик процедури, яка створює куби
recurs(0,0,0,10,3)

# перемальовування 3D-зображення для візуалізації змін
Blender.Redraw()


Після того, як текст програми набраний (або скопійований і вставлений ;), потрібно навести вказівник миші на вікно з текстом і запустити скрипт натисканням клавіш Alt+P. Після невеликої паузи у 3D-вікні з'являться кубики. Якщо цього не трапилось, а відкрилось вікно з повідомленням:

 

 

br>


то слід подивитись у консольне вікно Blender. У ньому виводяться діагностичні повідомлення про хід виконання скрипту, за якими можна зорієнтуватись, де помилка.

 

 

 

Випробування

 

Перед повторним запуском скрипту потрібно видалити створені кубики. Найпростіше це зробити, перевівши вказівник у 3D-вікно, після чого:

  • натиснути англійське А (можливо двічі), щоб виділити всі наявні об'єкти;
  • натиснути Del і відразу ж Enter.

Тепер можна внести зміни до коду скрипту і зробити повторний запуск. Змінюючи останній параметр у операторі recurs(0,0,0,10,3) побачимо зображення, що відрізняються глибиною рекурсії. При глибині рекурсії 4 і більше час виконання скрипту стає досить великим!

Вдосконалення

а) Наведений скрипт має добре помітний :) недолік: він створює кубики однакового кольору. Це легко виправити:

  • додайте до сцени декілька матеріалів;
  • щоб процедура, що генерує кубик, могла отримувати ще й номер матеріалу, заголовок процедури зробіть таким:
def cubic(x,y,z,a,k):
  • у самій процедурі слід передбачити присвоєння створеному кубику матеріалу з відповідним номером. Для цього перед останнім оператором цієї ж процедури вставте такий оператор: 
poly.materials.append(Blender.Material.get()[k])
  • у процедурі recurs змініть команду виклику процедури cubic: 
cubic(x+a,y+a,z+a,a,k).

Тепер матеріал кубика залежатиме від глибини рекурсії.

б) Щоб наочно побачити, як відбувається побудова, потрібно в кінці процедури cubic додати команду перемальовування

Blender.Redraw()

 

Тепер зображення оновлюватиметься після додавання кожного з кубиків. Звичайно, це сповільнить роботу скрипта в цілому.

Приклад використання

 

 

 


Интернет реклама
Категорія: Blender | Додав: teachlab (09.07.2010)
Переглядів: 3466 | Рейтинг: 0.0/0
Всього коментарів: 0
Додавати коментарі можуть тільки зареєстровані користувачі.
[ Реєстрація | Вхід ]
Форма входу
Пошук
Друзі сайту

Підтримка

Система Orphus

Маєте свій сайт?
Заробіть на ньому грошей!


Не маєте власного сайту?
Заробіть на обміні файлами!
Статистика
Copyright Пилипчук О.П. © 2024
div id=