Файл: Принцип работы и применение технологии трассировки лучей.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.02.2024

Просмотров: 12

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Муниципальное автономное общеобразовательное учреждение

муниципального образования город Краснодар

средняя общеобразовательная школа №74

имени Виктора Васильченко

Проект

Тема: “Принцип работы и применение

технологии трассировки лучей”

Проект выполнил:

Немчинов Илья,

ученик 9”А” класса

Руководитель проекта:

Войтехович Татьяна

Александровна,

учитель информатики

г. Краснодар

2021 – 2022 учебный год

Оглавление

Введение································································································3

Глава I. Метод трассировки лучей ································································5

1.1 Виды трассировки лучей ····································································5

1.2 История метода трассировки лучей ······················································5

Глава II. Реализация трассировки лучей на практике·········································7

2.1 Подготовка к реализации на практике····················································7

2.2 Создание классов vec2 и vec3·······························································8

2.3 Функция отрисовки изображения·························································8

2.4 Дополнение главного файла································································10

Список лирературы··················································································12

Приложение····························································································13

Введение

Данную тему для своего проекта я выбрал, потому что сейчас очень активно применяется и развивается компьютерная графика. Область применения компьютерной графики не ограничивается одними художественными эффектами. Во всех отраслях науки, техники, медицины, в коммерческой и управленческой деятельности используются построенные с помощью компьютера схемы, графики, диаграммы, предназначенные для наглядного отображения разнообразной информации. Инженеры, разрабатывая новые модели автомобилей и самолетов, используют трехмерные графические объекты, чтобы представить окончательный вид изделия. Архитекторы создают на экране монитора объемное изображение здания, и это позволяет им увидеть, как оно впишется в ландшафт.


Рендеринг – процесс получения изображения по модели с помощью компьютерной программы. Это описание любых объектов или явлений на строго определённом языке или в виде структуры данных.

Трассировка лучей (англ. Ray tracing; рейтре́йсинг) — методика рендеринга в компьютерной графике, которая стремится симулировать физическое поведения света настолько близко к реальному, насколько это возможно. Это алгоритм, который трассирует лучи в направлении от виртуальной камеры сквозь пространство; луч отражается от предметов до тех пор, пока полностью не поглотится или рассеется. Качество изображений, получаемых при помощи метода трассировки лучей, как правило, лучше, чем качество изображений, полученных другими методами рендеринга, однако трассировка лучей требует гораздо больших затрат вычислительных ресурсов. Трассировка лучей естественным способом воспроизводит множество оптических эффектов, которые труднодостижимы или вообще недостижимы другими методиками рендеринга: построение теней, глубина резкости изображаемого пространства, размытие движения, дисперсия, глобальное затемнение и непрямое освещение. Осуществление этих оптических эффектов при помощи трассировки лучей намного проще, чем при помощи других методик.

Трассировку лучей можно написать на различных языках программирования. Я нашёл алгоритм трассировки лучей, выполненный на языке программирования C++, и перевёл его на Python 3, так как я считаю его более перспективным. Python более портативный, при одинаковом функционале код на нём короче. Также он поддерживает прототипирование, и в нем нет ограничений типов данных. Python не требует разделителей строк и код на нём более читаемый.

Цель: Написать код алгоритма трассировки лучей на Python 3 и оценить возможности по улучшению кода.

Задачи:

  1. Сбор и анализ источников информации

  2. Реализация алгоритма на практике

  3. Тестирование

  4. Изучение результатов

  5. Направления по модернизации кода

  6. Вывод

Практической значимостью моего проекта является возможность применения продукта в области разработки игр или компьютерной графики.

Глава I. Метод трассировки лучей

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

Чаще всего выделяют 2 вида трассировки лучей:


  • Прямая

  • Обратная

Прямая трассировка лучей

(Приложение 1 Изображение 1)

Смысл прямой трассировки лучей заключается в том, что отслеживается траектория луча от источника света до объектов к виртуальной камере.

Обратная трассировка лучей

(Приложение 1 Изображение 2)

Обратная трассировка отличается тем, что прослеживается путь луча в обратном направлении: от камеры до объекта и источника света.

У каждого из видов есть свои плюсы и минусы.

При прямой трассировке лучей просчитываются траектории всех лучей, даже тех, которые не попадут в кадр, вычислительная мощность компьютера или сервера расходуется впустую и это значимо увеличивает время отрисовки кадра.

У обратной трассировки уже другой минус. А имменно пролемы с созданием дифузных отражений и преломлений.

Для написания кода я выбрал обратную трассировку лучей.

1.2 История метода трассировки лучей.

Технология трассировки лучей для визуализации впервые была представлена Тернером Уиттедом в работе 1979 года под названием "Улучшенная модель освещения для затененного отображения". В своей публикации исследователь отмечает, что его идея применения трассировки в графике основана на работах таких людей, как Роберт Голдстин, который использовал трассировку лучей для расчета радиационного воздействия в танках. Также он упоминает Артура Эппла, который в 1968 году описал технику прослеживания лучей между поверхностью и источником света для создания освещения с тенями — эту работу нередко упоминают, как первое применение трассировки лучей в рендеринге.

В то же время публикация Уиттеда включала не только трассировку лучей для генерирования теней, но и для вторичного влияния света от отражений и преломлений. Такой метод значительно повысил реализм, но был лишен вторичного рассеянного освещения или так называемого "глобального освещения".

В 1984 году была опубликована работа Роберта Кука "Распределенная трассировка лучей", в которой была открыта важная концепция случайного распределения лучей во времени и пространстве для достижения размытия в движении,
полуглянцевых отражений, освещения по площади и глубины резкости. И все это при помощи тех же лучей, которые необходимо генерировать для работы со сглаживанием. 

Проблема такого подхода в экспоненциальной природе трассировки. Можно запустить один луч и он вычислит путь к основному источнику света. Обычно это самый важный и самый значимый источник освещения в сцене. Однако для вторичных отражений необходимо запускать все больше и больше лучей. Начав с 1 луча, он становится еще 10 лучами, каждый из которых выделяет еще 10 лучей, получая уже сотню. Еще по 10 лучей и уже 1000, еще 10 и вот 10 тысяч — процесс может продолжаться бесконечно. Сложность в том, что уже на третьем "отскоке" луча от объектов необходимо использовать в 1000 раз больше производительность, даже если этот "проход" влияет на 1/100 от качества финального освещения. Другими словами, весь процесс трассировки лучей по своей сути крайне неэффективен, даже если он эффективен в сравнении с иными методами физического рендеринга. Несмотря на оптимизацию метода в работе Кука, экспоненциальная характеристика трассировки оставалась фундаментальной преградой для применения технологии.

Глава II. Реализация трассировки лучей на практике.

2.1 Подготовка к реализации на практике.

Теперь можно перейти к практической части. За основу был взят исходный код на языке программирования C++ (список литературы 7). В качестве языка программирования я выбрал Python 3. Он поддерживает прототипирование, и в нем нет ограничений типов данных. Python не требует разделителей строк и код на нём более читаемый. И в нём много направлений для развития. На Python можно разрабатывать всё: от нейросетей, машинного обучения, компьютерного зрения и анализа данных, до разработки игр сайтов и многого другого.

Для написания алгоритма я импортировал все необходимые модули (если на этом этапе появляется ошибка, то в консоль нужно прописать pip install pygame):

import math, random, threading, pygame

math – это модуль содержащий в себе многие математические функции необходимые для различных вычислений.

random– это модуль для генерации случайных чисел или выбора случайного элемента из списка. Может понадобиться в будущем при работе с текстурами и материалами, а также частицами.


threading - это модуль работы с процессами процессора применяется для ускорения и распараллеливания выполнения кода, а также для асинхронного выполнения функций. (В данном случае у меня не получилось применить этот модуль и это привело к артефактам)

pygame - это фреймворк предназначенный для разработки 2D игр. Основанный на SDL – свободной кроссплатформенной мультимедийной библиотеке, имеющей доступ к графической и звуковой подсистеме ввода-вывода.

Для начала я создал класс приложения:

(Приложение 2 Код 1)

Затем я создал файл для настроек и назвал его “settings.py”. В этом файле будут находиться все основные настройки.

from vector import *

FPS, max_reflections = 25, 5

width, height = 1920, 1000

s_width, s_height = 25, 24

p_width, p_height = int(width/s_width), int(height/s_height)

size, aspect = (width, height), (width/height)

speed, camera_speed = 0.75, 0.1

camera_pos = vec3(-3, 0, 1)

sphere_pos, radius = vec3(0, -1.5, 1), 1

box_pos, box_size = vec3(0, 2.5, 1), 1
2.2 Создание классов:vec2 и vec3

Для того чтобы при выполнении файла настроек не появилось ошибка я создал файл “vector.py” в котором будут содержаться 2 класса: vec2 и vec3, а также необходимые им функции.

(Приложение 3 Код 2)

2.3 Функция отрисовки изображения

После этого я приступил к написанию самой трассировки лучей и для этого снова создал отдельный файл:”render.py”

Он будет ссылаться на 2 других файла: settings.py и vector.py:

from settings import *

from vector import *

(Приложение 1 Изображение 3)

Я использовал формулы пересечений и применил их в коде.

def sphere(ro: vec3, rd: vec3, r: float):

b = vec3.dot(ro, rd)

c = vec3.dot(ro, ro) - r**2

h = b**2 - c

if h < 0:

return vec2(-1, -1)

h = math.sqrt(h)

return vec2(-b - h, -b + h)
def box(ro: vec3, rd: vec3, Bsize: vec3, norm: vec3):

m = vec3(1, 1, 1) / rd

n = m * ro

k = vec3(abs(m.x), abs(m.y), abs(m.z)) * Bsize

t1 = -n -k

t2 = -n + k

tN = max(max(t1.x, t1.y), t1.z)

tF = min(min(t2.x, t2.y), t2.z)

if tN > tF or tF < 0:

return vec2(-1, -1)

yzx = vec3(t1.y, t1.z, t1.x)

zxy = vec3(t1.z, t1.x, t1.y)

norm = -vec3.sign(rd) * vec3.step(yzx, t1) * vec3.step(zxy, t1)

return vec2(tN, tF)
def plane(ro: vec3, rd: vec3, p: vec3, w: float):

d = vec3.dot(rd, p)

if d != 0:

return -(vec3.dot(ro, p) + w) / d

else:

return 99999999
def clamp(value, vmin, vmax):

return max(min(value, vmax), vmin)

Я создал функцию рендеринга, которая покадрово будет выполняться из класса приложения. В качестве аргументов функция будет принимать окно, в котором она будет отрисовывать изображение, номер кадра, координаты камеры и объектов сцены, а также их размеры. Для получения номера кадра был ранее создан инкремент переменной t.