Ray casting

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Не слід плутати з Трасування променів (анг. ray tracing).

Проста ілюстрація Кидання променів

Ray casting, рей кастинг або Кидання променів — є методологічною основою для моделювання 3D CAD/CAM та рендерингу зображень. По суті, це те ж саме, що і трасування променів у комп'ютерній графіці, коли віртуальні промені світла «відкидаються» або «трасуються» на своєму шляху від фокусної точки камери через кожен піксель сенсора камери, щоб визначити, що видно вздовж променя в 3D-сцені. Термін «Ray Casting» був введений Скоттом Ротом під час роботи в дослідницьких лабораторіях General Motors у 1978—1980 роках. Його стаття «Ray Casting for Modeling Solids»[1] описує моделювання твердих об'єктів шляхом поєднання примітивних твердих тіл, таких як блоки та циліндри, за допомогою операторів об'єднання (+), (&), (-) — суми, перетину та різниці відповідно. Загальна ідея використання цих бінарних операторів для твердотілого моделювання значною мірою завдячує групі геометричного моделювання Фоелькера та Рекіча в Університеті Рочестера. Кидання променів може стосуватися різних завдань та методів:

Незважаючи на те, що «кидання променів» та «трасування променів» в ранній комп'ютерній графічній літературі часто використовувалися як тотожні[3] — останнім часом намагаються їх відрізняти.[4] Різниця полягає в тому, що кидання променів — це алгоритм рендерингу, при якому рекурсивно ніколи не відстежуються вторинні промені, тоді як інші алгоритми візуалізації на основі трасування променів можуть це зробити.

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

Концепція[ред. | ред. код]

Кидання променів є найбільш простим з багатьох алгоритмів рендерингу комп'ютерної графіки, які засновані на геометричному алгоритмі трасування променів. Алгоритми рендерингу на базі трасування променів працюють в image order[en] для відтворення тривимірних сцен на двовимірний екран. Геометричні промені надходять з ока спостерігача для зразка світла (сяйва), що рухається до спостерігача від напрямку променя. Швидкість і простота кидання променів забезпечується обчисленням кольору світла без рекурсивного відстеження додаткових променів, які відбивають сяйва, що падають на ту точку, в яку потрапляє промінь. Це виключає можливість точного рендерингу відбиття, заломлення або природного падіння тіней. Однак усі ці елементи можуть бути певною мірою підроблені, шляхом творчого використання текстурних карт або інших методів. Висока швидкість обчислення зробила кидання променів зручним методом рендерингу в ранніх 3D-відеоіграх реального часу.

У природі джерело світла випромінює промінь світла, який, врешті-решт, рухається до поверхні, яка й перериває його прогрес. Можна уявити цей «промінь» як потік фотонів, що рухаються уздовж тієї самої траєкторії. На цьому шляху може бути будь-яке поєднання трьох речей з цим світловим променем: поглинання, відбиття та рефракція. Поверхня може відбити весь або частину світлового променя в одному або декількох напрямках. Вона також може поглинути частину світлового променя, що призводить до втрати інтенсивності відбитого та / або заломленого світла. Якщо поверхня має будь-які прозорі або напівпрозорі властивості, вона заломлює частину світлового променя в собі, в іншому напрямку — поглинаючи деякий (або весь) спектр (і, можливо, змінюючи колір). Між поглинанням, відбиттям та заломленням, все вхідне світло повинно враховуватися, і не більше. Поверхня, наприклад, не може відбити 66 % вхідного світлового проміння, і рефлектувати 50 %, оскільки ці два значення складають 116 %. Звідси, відбиті та / або заломлені промені можуть «вражати» інші поверхні, де їх поглинаючі, рефракційні та відбиваючі властивості знову підраховуються на основі вхідних променів. Деякі з цих променів рухаються таким чином, що відповідно потрапляють в очі, змушуючи нас бачити дійсність і тим самим сприяють появі зображення. Спроба симулювати цей реальний процес трасуванням світлових променів за допомогою комп'ютера може вважатися надзвичайно марною, оскільки лише мізерна частка фізичних променів світла дійсно потрапляє у видимість або вюпорт.

Вперше алгоритм кидання променів, що використовується для рендерингу, був представлений Артуром Аппелем (Arthur Appel) у 1968 році.[5] Ідея кидання променів полягає в основі відстеження променя від ока, один на піксель, і знаходити найближчий об'єкт, який блокує шлях цього променю. Наче зображення екранованих дверей, причому кожен квадрат на екрані є піксельним. Це є тим об'єктом, який око бачить через цей піксель. Використовуючи властивості матеріалу та вплив світла на сцену, цей алгоритм може визначити затінення цього об'єкта. Спрощене припущення говорить, що якщо поверхня повернута до світла, світло досягне цієї поверхні і не буде заблоковано або знаходитись в тіні. Затінення поверхні обчислюється за допомогою алгоритмів затінення традиційної 3D комп'ютерної графіки. Однією з найважливіших переваг кидання променів (над старшими алгоритмами сканування), була його здатність легко мати справу з непласкими поверхнями та твердими тілами, такими як конуси та сфери. Якщо математична поверхня може перетинатися променем, вона може зазнати рендеринг ​​за допомогою кидання променів. Складні об'єкти можуть бути створені за допомогою методу моделювання твердих тіл та легко відтворенні через рендеринг.

Раннє використання алгоритму рендерингу кидання променів був здійснений компанією Mathematical Applications Group, Inc. (MAGI) міста Ельмсфорд (штат Нью-Йорк).[6]

Згладжування[ред. | ред. код]

Нерівні краї, спричинені викривленнями, є небажаним ефектом методів точкової вибірки і класичною проблемою алгоритмів растрового відображення. Лінійні або плавно вигнуті краї виглядатимуть нерівними, що особливо неприємно в анімації, оскільки рух зображення робить краї нечіткими або схожими на маленькі ескалатори, що рухаються. Крім того, деталі сцени, менші за відстань між променями, можуть бути втрачені. Нерівні краї в лінійному малюнку можна згладити за допомогою слідування за краями. Мета такого алгоритму — мінімізувати кількість ліній, необхідних для малювання зображення з точністю до одного пікселя. Результат — згладжені краї.

Для згладжування нерівних країв на зафарбованому зображенні з субпіксельною точністю, слід додати додаткові промені для отримання інформації про краї. (Див. розділ Супердискретизація для загального підходу.) Краї утворюються перетином поверхонь або профілем криволінійної поверхні. Застосовуючи «Когерентність», як описано вище, через двійковий пошук, якщо видима поверхня в пікселі (X, Y) відрізняється від видимої поверхні в пікселі (X+1,Y), то промінь можна згенерувати посередині між ними в точці (X+½,Y) і ідентифікувати видиму поверхню в цій точці. Відстань між точками вибірки можна розбити на частини, але пошук не обов'язково має бути глибоким. Основна глибина пошуку для згладжування зазубрених країв є функцією градієнта інтенсивності вздовж краю. Оскільки (1) площа зображення, що містить краї, зазвичай становить невеликий відсоток від загальної площі, і (2) додаткові промені, які використовуються при бінарному пошуку, можуть бути обмежені глибиною видимих примітивів, що утворюють краї, вартість згладжування нерівних країв є доступною.

Реалістичні затінені зображення[ред. | ред. код]

Кидання променів — це природний інструмент моделювання для створення затінених зображень. Система відтворення променів у відтінках сірого, розроблена Скоттом Ротом і Деніелом Бассом у дослідницькій лабораторії GM Research Labs, створювала зображення на кольоровому растровому дисплеї Ramtek приблизно в 1979 році. Для компонування зображень система надавала користувачеві наступні елементи керування:

  • Вигляд
    • Напрямок зору та положення
    • Фокусна відстань
    • Коефіцієнт масштабування
  • Освітленість
    • Кількість джерел світла
    • Розташування та інтенсивність світла
    • Додаткова тінь
    • Інтенсивність навколишнього освітлення та фону
  • Відбиття поверхні

Для відтворення одного пікселя зображення алгоритм пускає промінь з фокусної точки і визначає, що він перетинає напівпрозорий прямокутник і блискуче коло. Потім з цієї точки потрібно пустити додатковий промінь у напрямку, симетрично протилежному до нормалі до поверхні в точці перетину променя з поверхнею, щоб визначити, що буде видно в дзеркальному відображенні. Цей промінь перетинає трикутник, який є непрозорим. Нарешті, кожна точка перетину променя з поверхнею тестується, щоб визначити, чи не знаходиться вона в тіні. Промінь «Тіньового пучка» спрямовується від точки перетину променя з поверхнею до джерела світла, щоб визначити, чи не перекриває цей шлях якась інша поверхня.

Історія рей кастингу[ред. | ред. код]

Історію променевого лиття див. у розділі «Трасування променів», оскільки обидві ці техніки по суті є однією і тією ж технікою під різними назвами. Скотт Рот винайшов термін «Рей кастинг» ще до того, як почув про «трасування променів». Крім того, розробка Скоттом Ротом методу променевого лиття в дослідницькій лабораторії GM Research Labs відбувалася паралельно з роботою Тернера Вітта над трасуванням променів у лабораторії Bell Labs.

Кидання променів в комп'ютерних іграх[ред. | ред. код]

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

У ранніх іграх від першої особи променевий кастинг використовувався для ефективного рендерингу тривимірного світу з двомірного ігрового поля за допомогою простого одновимірного сканування по горизонтальній ширині екрана. Ранні шутери від першої особи використовували двомірний променевий кастинг як техніку для створення тривимірного ефекту з двомірного світу. Хоча світ виглядає тривимірним, гравець не може дивитися вгору або вниз, або тільки під обмеженими кутами зі зсувним спотворенням. Цей стиль рендерингу усуває необхідність випускати промінь для кожного пікселя в кадрі, як у випадку з сучасними ігровими двигунами; як тільки точка попадання знайдена, деформація проєкції застосовується до текстури поверхні, і весь вертикальний стовпчик копіюється з результату в кадр. Цей стиль рендерингу також накладає обмеження на тип рендерингу, який може бути виконаний, наприклад, сортування за глибиною, але не буферизація за глибиною. Тобто полігони мають бути повними перед або позаду один одного, вони не можуть частково перекриватися або перетинатися.

Wolfenstein 3D[ред. | ред. код]

Сцена з Wolfenstein 3D (iD Software). Зверніть увагу на блоковий вигляд. Об'єкти (зброя) і вороги (собака) — це просто прозорі растрові зображення, які масштабуються та стираються (наприклад, вставляються) на тлі.

Світ у Wolfenstein 3D побудований з квадратної сітки стін рівномірної висоти, які стикаються з суцільними підлогами і стелями. Для того, щоб промалювати світ, відстежується один промінь для кожного стовпця пікселів на екрані, де вертикальний фрагмент текстури стінки вибирається та масштабується відповідно до того, як промінь натикається на стіну світу і наскільки далеко він рухався перед цим зіткненням.[7]

Створення рівнів побудованих на сітці виконує два завдання: зіткнення променя зі стіною можна визначити швидше, оскільки потенційні зіткнення є більш передбачуваними та це потребує значно менше ресурсів для роботи. Проте кодування широких відкритих областей займає додатковий простір

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

Серія Comanche[ред. | ред. код]

Рушій Voxel Space[en], розроблений компанією NovaLogic[en] для ігор Comanche, простежує промінь через кожен стовпець пікселів екрана і перевіряє кожен промінь у напрямку до точок на карті висот. Потім він перетворює кожен елемент карти висот в стовпчик пікселів, визначає, які з них видимі (тобто не були заблоковані пікселями, які були зроблені попереду), і малює їх відповідним кольором з текстурної карти.[8]

Обчислювальна геометрія[ред. | ред. код]

В обчислювальній геометрії проблема кидання променів також відома як проблема ray shooting і може бути зазначена як наступна задача запиту. Враховуючи набір об'єктів у d-вимірюваному просторі, попередня обробка їх структури даних є така, щоб для кожного запиту променю можна було швидко знайти початковий об'єкт, на якій потрапляє промінь. Проблема була досліджена для різних параметрів: просторовий вимір, види об'єктів, обмеження на запит променю тощо.[9] Одним з методів є використання Sparse Voxel Octree.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Scott D, Roth (February 1982). "Ray Casting for Modeling Solids", Computer Graphics and Image Processing (англ.). с. 18 (2): 109–144. doi:10.1016/0146-664X(82)90169-1.
  2. Weiskopf, Daniel (2006). GPU-Based Interactive Visualization Techniques (англ.). Springer Science & Business Media. с. p. 21. ISBN 978-3-540-33263-3. {{cite book}}: |pages= має зайвий текст (довідка)
  3. Foley, James D; van Dam, Andries; Feiner, Steven K; Hughes, Steven K; Hughes, John F (1995). Computer Graphics: Principles and Practice (англ.). Addison-Wesley. с. p. 701. ISBN 0-201-84840-6. {{cite book}}: |pages= має зайвий текст (довідка)
  4. Boulos, Solomon (2005). Proceeding SIGGRAPH '05 ACM SIGGRAPH 2005 Courses Article No. 10 (англ.). New York, NY, USA: ACM. doi:10.1145/1198555.1198749.
  5. Macey, Jon. "Ray-tracing and other Rendering Approaches" lecture notes, MSc Computer Animation and Visual Effects (PDF) (англ.). University of Bournemouth. Архів оригіналу (PDF) за 17 листопада 2018. Процитовано 12 серпня 2017.
  6. Goldstein, R.А; Nagel, R (1971). Simulation 16(1). 3-D visual simulation (англ.). с. 25—31.
  7. Ray-Casting Tutorial For Game Development And Other Purposes. http://permadi.com (англ.). 6 травня 1996. Архів оригіналу за 12 серпня 2020. Процитовано 13.08.2017. {{cite web}}: |first= з пропущеним |last= (довідка)
  8. LaMothe, Andre (1995). Black Art of 3D Game Programming (англ.). с. 14, 398, 935—936, 941—943. ISBN ISBN 1-57169-004-2. {{cite book}}: Перевірте значення |isbn=: недійсний символ (довідка)
  9. de Berg, Mark (1993). Ray shooting, depth orders and hidden surface removal (англ.). Springer-Verlag. с. 201. ISBN 3-540-57020-9.

Посилання[ред. | ред. код]