Skip to content

C++ WinAPI implementation of a 3D wireframe rasterizer with scan-line filling.

License

Notifications You must be signed in to change notification settings

n1xsi/3d-polyhedron-rasterizer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

3d Polyhedron Rasterizer

Language Library Platform License

Приложение для визуализации и управления трёхмерной полигональной моделью (кубом) с использованием Windows API и GDI+.

Проект реализует полный цикл 3D-конвейера "с нуля": от математических преобразований вершин до алгоритмов растеризации и удаления невидимых граней. Данная лабораторная работа выполнена в рамках дисциплины «Компьютерная графика» 🎓.

Скачать готовую программу можно в разделе Releases.

✨ Функциональность

  • Аффинные преобразования:
    • ↔️ Перемещение (Translate) по осям X, Y, Z.
    • 🔄 Вращение (Rotate) вокруг осей X, Y, Z.
    • 🔍 Масштабирование (Scale).
  • Рендеринг:
    • Удаление невидимых граней (Back-face culling) через проверку нормали и вектора взгляда.
    • Алгоритм закраски граней (Scan-line algorithm / Метод сканирующей строки).
    • Проекция перспективы.

🛠 Технический стек

  • Язык: C++
  • Графика: GDI+ (Gdiplus.h)
  • Интерфейс: Pure WinAPI (без использования MFC/Qt)
  • Среда разработки: Visual Studio

🧮 Реализованные алгоритмы

Important

Для полного понимания того, как устроена компьютерная графика, архитектура проекта исключает использование готовых решений (OpenGL, DirectX и прочие 3D-движки).

Graphics Device Interface+ используется исключительно как низкоуровневый инструмент для вывода 2D-примитивов, а вся сложная логика 3D-преобразований и рендеринга реализована самостоятельно (рукописно).

1. Удаление невидимых граней

Используется метод проверки нормали. Для каждой грани вычисляется вектор нормали через векторное произведение сторон. Если угол между нормалью и вектором обзора камеры меньше 90 градусов (скалярное произведение < 0), грань отбрасывается и не рисуется.

2. Закраска (Rasterization)

Для отрисовки граней используется метод сканирующей строки (Scan-line).

  1. Проекция вершин переводится в экранные координаты.
  2. Определяются границы (minY, maxY).
  3. Для каждой строки сканирования находятся точки пересечения со сторонами многоугольника.
  4. Пространство между парами пересечений заливается цветом.

🚀 Сборка и запуск

Вариант 1: MinGW (GCC) / VS Code

Проект включает Makefile для автоматизации сборки. Требуется установленный компилятор GCC (например, MSYS2) и утилита make.

  1. Откройте терминал в папке проекта.
  2. Выполните команду:
    make run

Собранное приложение можно найти по пути build/app.exe. После запуска проекта клонированный репозиторий можно очистить от компиляционных файлов с помощью команды make clean.

Вариант 2: Visual Studio

  1. Откройте Visual Studio и выберите "Create a new project from existing code" или просто создайте пустой C++ проект.
  2. Добавьте все файлы из директории src/ в проект.
  3. Убедитесь, что библиотека gdiplus.lib подключена (Project Properties -> Linker -> Input -> Additional Dependencies).
  4. Скомпилируйте и запустите (F5).

📂 Структура репозитория

3d-polyhedron-rasterizer/
├── assets/                # Статические ресурсы
│   ├── demo.gif               # Gif-изображение, демонстрация работы программы
│   └── icon.ico               # Иконка приложения
│
├── build/                 # Папка сборки (создается автоматически)
│   ├── app.exe                # Скомпилированное приложение
│   └── ...                    # Объектные файлы (.o) и ресурсы (.res)
│
├── src/                   # Исходный код проекта
│   ├── main.cpp               # Точка входа (WinMain)
│   ├── MainWindow.cpp/h       # Класс окна, обработка сообщений и ввода
│   ├── Wireframe.cpp/h        # Класс модели: математика, проекция, отрисовка
│   ├── Point3D.h              # Структура точки в трехмерном пространстве
│   └── resource.rc/h          # Скрипт ресурсов Windows (подключение иконки)
│
├── .gitignore             # Настройки для игнорирования файлов в Git (временные файлы, кэши)
├── LICENSE                # Лицензия MIT
├── Makefile               # Сценарий сборки для make (GCC/MinGW)
└── README.md              # Документация