Создание программы визуализации псевдотрехмерного изображения с помощью рейкастинга | Статья в журнале «Молодой ученый»

Отправьте статью сегодня! Журнал выйдет 30 ноября, печатный экземпляр отправим 4 декабря.

Опубликовать статью в журнале

Автор:

Рубрика: Информационные технологии

Опубликовано в Молодой учёный №50 (340) декабрь 2020 г.

Дата публикации: 13.12.2020

Статья просмотрена: 1152 раза

Библиографическое описание:

Евстратов, В. В. Создание программы визуализации псевдотрехмерного изображения с помощью рейкастинга / В. В. Евстратов. — Текст : непосредственный // Молодой ученый. — 2020. — № 50 (340). — С. 12-15. — URL: https://moluch.ru/archive/340/76504/ (дата обращения: 16.11.2024).



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

Ключевые слова: raycasting, рейкастинг, псевдо 3D визуализация, graphic programming, графическое программирование, Wolfenstein.

Введение

Рейкастинг (англ. ray casting — бросание лучей) — один из методов рендеринга в компьютерной графике, при котором сцена строится на основе замеров пересечения лучей с визуализируемой поверхностью [1].

Термин впервые использовался в конце 70-х годов. Он применялся для описания метода параметрического моделирования с помощью комбинации примитивов, соединенных посредством операций объединения (+), разности (-) и пересечения (&).

В данной статье рейкастинг будет рассматриваться применительно к компьютерным играм. Конкретнее, будет рассмотрен способ отрисовки сцены в реальном времени в простейшей компьютерной игре.

Одной из первых игр, в которой была использована подобная технология псевдотрехмерной визуализации игрового пространства была Wolfenstein 3D (1992 год издания). Спустя почти 30 лет технологии визуализации в компьютерной графике, конечно, усложнились, однако, рейкастинг как технология имеет много общего с рейтрейсингом [2]. Рейтрейсинг, в свою очередь, благодаря увеличению вычислительных мощностей персональных компьютеров, в настоящее время становится современным способом визуализации некоторых объектов в играх, и уже довольно давно применяется в кинематографе для создания компьютерных спецэффектов.

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

Основной принцип рейкастинга в играх

Принцип рейкастинга заключается в том, что от наблюдателя (точки, из которой мы будем смотреть на сцену) бросаются лучи в необходимую область перед наблюдателем — область видимости. Каждый луч, столкнувшись с препятствием луч запоминает расстояние, которое он пролетел в данном направлении, прежде чем встретил препятствие. В зависимости от этого расстояния мы можем визуализировать это препятствие (стену) на экране. Размер визуализируемого объекта выбирается в соответствии с необходимой перспективой. На рисунке 1 показано графическое представление этого процесса: в области примерно 60 перед наблюдателем бросаются лучи, каждый луч пролетает какое-то расстояние, и чем оно больше — тем меньше высота отображаемой стены.

Визуализация рейкастинга

Рис. 1. Визуализация рейкастинга

Далее будет описан общий алгоритм формирования таких изображений.

Соглашения для разработки собственной программы визуализации

− Представляемая сцена («карта») будет представлять собой двумерный массив символов. Символ «1» будет представлять препятствие, символ «0» — пустое пространство.

− Операционная система — Ubuntu.

− Для упрощенного создания графического окна воспользуемся надстройкой для Linux библиотеки LibX, MiniLibX.

Алгоритм отрисовки

Основной алгоритм отрисовки одной сцены заключается в следующем:

  1. Определить ширину экрана в точках
  2. Определить область видимости игрока в градусах (FOV — field of view)
  3. Определить шаг угла (область видимости, деленная на ширину экрана)
  4. Для каждого угла в интервале от 0 до FOV с полученным шагом выполнить бросок луча, и в зависимости от расстояния до препятствия отобразить вертикальную полоску на экране в соответствующей «колонке» дисплея

Основной алгоритм броска луча

Чтобы «бросить» луч необходимо вычислить расстояние между наблюдателем и препятствием в направлении луча. Если препятствие — это математический объект, который описывается каким-либо уравнением, а наблюдатель — точка на координатной плоскости, то чтобы рассчитать необходимое расстояние достаточно решить нужное уравнение. Однако, по нашим соглашениям препятствия — это «1» в двумерном массиве символов, поэтому нам нужно «шагать» лучом, пока мы не встретим стену.

Очевидным способом броска луча является перемещение начальной координаты луча в выбранном направлении на заданное константное расстояние [3] (рисунок 2).

Очевидное решение для броска луча

Рис. 2. Очевидное решение для броска луча

Однако, такое решение не является работоспособным для всех случаев. Основная причина в том, что под определенным углом луч будет проходить сквозь эту диагональную схему. Сокращение дистанции, на которую перемещается луч если и частично решает данную проблему, то вместе с этим сильно замедляет отрисовку изображения [3]. На рисунке 3 показан этот эффект.

Луч проскочил через стену

Рис. 3. Луч проскочил через стену

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

Луч перемещается по граням сетки

Рис. 4. Луч перемещается по граням сетки

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

Примечание 1.

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

Примечание 2.

Поскольку мы проецируем изображение стены не на точку, из которой мы бросаем лучи, а на плоскость (монитор компьютера), то нам необходимо делать коррекцию расстояния до стен, чтобы убрать эффект рыбьего глаза. Необходимое расстояние до стены получается следующим образом:

length_to_wall = ray_distance * cos(cur_angle — midle_angle);

Здесь cur_angle — это угол текущей итерации относительно заданного FOV, а midle_angle — центральный угол FOV’а.

Примечание 3.

Для повышения эффективности алгоритма, вместо вычисления функции cos() во время отрисовки изображения можно заранее рассчитать таблицу косинусов и вместо вычисления косинусов брать заранее рассчитанное значение. Это может ускорить некоторые части программы в несколько раз [4].

Добавление текстур.

Поскольку бросаемый луч останавливается на грани сетки, то мы можем узнать точку попадания луча относительно одной клетки. Вычислив относительное расстояние от левого края клетки до места попадания луча, мы можем узнать соответствующий столбец пикселей изображения и вывести его на экран. Перед выводом, очевидно, этот столбик пикселей текстуры необходимо растянуть или сжать (в зависимости от высоты изображения и высоты препятствия, которое мы отображаем). Графически этот процесс представлен на рисунке 5 [5].

Наложение текстур

Рис. 5. Наложение текстур

Заключение

Результат программы представлен на рисунке 6. Полный исходный код проекта можно посмотреть в github репозитории автора [https://github.com/vesord/cub3d].

Результат работы рейкастера

Рис. 6. Результат работы рейкастера

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

Литература:

  1. Рей кастинг. — Текст: электронный // Википедия свободная энциклопедия. — URL: https://ru.wikipedia.org/wiki/Ray_casting (дата обращения 05.12.2020)
  2. Boulos, Solomon (2005). Notes on efficient ray tracing // SIGGRAPH 2005
  3. Raycasting — Текст: электронный // Lode's Computer Graphics Tutorial. — URL: https://lodev.org/cgtutor/raycasting.html (дата обращения 07.12.2020)
  4. Евстратов В., Оценка скорости вычисления тригонометрических функций на Си / В. В. Евстратов // Молодой учёный № 46 (336) ноябрь 2020.
  5. Рейкастинг — Текст: электронный // Блог компании «Библиотека программиста». — URL: https://proglib.io/p/raycasting-for-the-smallest/ (дата обращения 08.12.2020)
Основные термины (генерируются автоматически): FOV, луч, бросок луча, двумерный массив символов, компьютерная графика, компьютерное изображение, наложение текстур, необходимое расстояние, область видимости, полный исходный код.


Ключевые слова

raycasting, рейкастинг, псевдо 3D визуализация, graphic programming, графическое программирование, Wolfenstein

Похожие статьи

Технологии компьютерной графики и их практическая реализация

В статье рассматриваются виды компьютерной графики, такие как векторная графика, графические растровые изображения и фрактальная графика, средства 3-D моделирования, освещаются различия между ними, а также способы, методы и области применения. Так же...

Интеллектуальная система выявления фейков на фотографии

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

Разработка программного кода на основе библиотеки MFC и объектно ориентированного подхода

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

Построение программного комплекса для генерации звуков барабанов с использованием GAN сетей

В статье рассматривается построение программного комплекса для генерации звуков барабанов с использованием GAN сетей. Программный комплекс работает на клиент-сервер архитектуре и использует нейронные сети WaveGAN для генерации звуков. Результаты, пол...

Разработка диспетчера параллельного исполнения задач для формирования изображения в авиатренажёре

Разработан программный модуль диспетчера, распределяющего задачи, связанные с формированием изображения при помощи технологии OpenGL, по нескольким потокам выполнения. Разработанный диспетчер использует новый алгоритм распределения задач по потокам, ...

Разработка веб-сервиса для генерации музыкальной последовательности по изображению

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

Разработка программного модуля для проведения оценки тяжести поражения легких при COVID-19 по данным компьютерной томографии

В статье автор демонстрирует результаты, достигнутые в проводимом им исследовании, связанным с разработкой алгоритма, решающего задачу оценивания степени поражения легких при COVID-19 по данным компьютерной томографии с использованием нейронных сетей...

3D принтер — технология будущего

В данной статье речь пойдет о новой технологии создания объектов и предметов — 3D принтере. Описывается история возникновения, указываются основные принципы и технологии работы устройства. Проводится исследование применения 3D принтера в Ростове-на-Д...

Обзор различных средств фаззинга как инструментов динамического анализа программного обеспечения

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

Методы обработки видеоизображений с помощью языка программирования Python

В статье рассматриваются современные методы обработки видеоизображений с использованием языка программирования Python. Описываются ключевые библиотеки, такие как OpenCV и scikit-image, а также их применение для выполнения задач, включая распознавание...

Похожие статьи

Технологии компьютерной графики и их практическая реализация

В статье рассматриваются виды компьютерной графики, такие как векторная графика, графические растровые изображения и фрактальная графика, средства 3-D моделирования, освещаются различия между ними, а также способы, методы и области применения. Так же...

Интеллектуальная система выявления фейков на фотографии

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

Разработка программного кода на основе библиотеки MFC и объектно ориентированного подхода

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

Построение программного комплекса для генерации звуков барабанов с использованием GAN сетей

В статье рассматривается построение программного комплекса для генерации звуков барабанов с использованием GAN сетей. Программный комплекс работает на клиент-сервер архитектуре и использует нейронные сети WaveGAN для генерации звуков. Результаты, пол...

Разработка диспетчера параллельного исполнения задач для формирования изображения в авиатренажёре

Разработан программный модуль диспетчера, распределяющего задачи, связанные с формированием изображения при помощи технологии OpenGL, по нескольким потокам выполнения. Разработанный диспетчер использует новый алгоритм распределения задач по потокам, ...

Разработка веб-сервиса для генерации музыкальной последовательности по изображению

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

Разработка программного модуля для проведения оценки тяжести поражения легких при COVID-19 по данным компьютерной томографии

В статье автор демонстрирует результаты, достигнутые в проводимом им исследовании, связанным с разработкой алгоритма, решающего задачу оценивания степени поражения легких при COVID-19 по данным компьютерной томографии с использованием нейронных сетей...

3D принтер — технология будущего

В данной статье речь пойдет о новой технологии создания объектов и предметов — 3D принтере. Описывается история возникновения, указываются основные принципы и технологии работы устройства. Проводится исследование применения 3D принтера в Ростове-на-Д...

Обзор различных средств фаззинга как инструментов динамического анализа программного обеспечения

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

Методы обработки видеоизображений с помощью языка программирования Python

В статье рассматриваются современные методы обработки видеоизображений с использованием языка программирования Python. Описываются ключевые библиотеки, такие как OpenCV и scikit-image, а также их применение для выполнения задач, включая распознавание...

Задать вопрос