Light-electric.com

IT Журнал
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Программирование 3d графики на c

Программирование 3d графики на c

БлогNot. C++ .NET: делаем 3D график с помощью Chart

C++ .NET: делаем 3D график с помощью Chart

Вот здесь есть все основные примеры для работы со стандартной (начиная с версии .Net Framework 4.0) компонентой Chart , служащей для построения графиков и диаграмм. Но все эти примеры — «плоские». А можно ли отобразить трёхмерные данные, пользуясь только возможностями Chart ?

Коль скоро каждая из областей ( ChartAreas ) графика может содержать сколько угодно рядов данных ( Series ), а каждый ряд — сколько угодно точек ( Points ), то можно. Тем более, для любой области предусмотрена опция Area3DStyle->Enable3D , позволяющая включить трёхмерный вид её рядов данных.

Создадим пустой проект Windows Forms, кинем как попало на форму компонент Chart , всё остальное сделаем программно по любому удобному событию, например, по загрузке ( Load ) формы.

Сначала растянем Chart по форме и включим некоторые полезные свойства:

Зададим минимально нужные настройки:

Наконец, создадим ряды и заполним их точками-значениями:

Функция f(x,y) — любая функция двух переменных, график которой мы выводим, например, такая:

Это всё, приложение можно запускать и вот что вышло:

Так как компонента «тянется» по форме, при изменении размеров окна всё пересчитается и перерисуется. Если «подложка» пол графиком не нужна, выберите тип диаграммы, например, SeriesChartType::StepLine вместо SeriesChartType::Column .

У нас отображаемые в 3D величины берутся как значения функции двух аргументов f(x,y) , если же они уже «лежат» в двумерном массиве, это только упростит ситуацию — просто вместо f(xPoint,yPoint) будем передавать в AddXY элемент из i -ой строки и j -го столбца этого массива.

Можно также «поиграть» с chart1->ChartAreas[«ChartArea1»]->AxisX , chart1->ChartAreas[«ChartArea1»]->AxisY для детальной настройки. Например, там есть свойства Interval , Maximum и Minimum .

Управляем цветом

В предыдущем листинге закомментировано управление цветом, а часто хочется иметь вместо пёстрого «коврика» что-нибудь более логичное, например, плавный цветовой градиент.

Сменим тип диаграммы на сплайн, а цвет будем рассчитывать пропорционально значению функции. Перед основным циклом for придётся добавить цикл поиска минимума и максимума функции 2 переменных, а расчёт цвета выполнить отдельным методом calculateColor .

Вместо цикла for предыдущего листинга будет код:

а метод расчёта цвета в простейшем случае можно сделать таким (интенсивность красного всегда оставляем равной 255, чтобы иметь диаграмму в красных тонах):

Меняем свойства Chart динамически

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

Понадобится обработчик события MouseClick диаграммы:

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

25.05.2016, 16:25; рейтинг: 6814

Двумерная графика на C#, классы Graphics, Pen и Brush

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

2D-графика делится, как вы знаете, на растровую и векторную. Растровое изображение — это набор цветных пикселей, заданных в прямоугольной области, хранящихся в файлах *.bmp, *.jpg, *.png и т.п. Самый простой растровый редактор — программа Paint. Векторная графика намного экономнее (по объемам памяти) растровой. Так для рисования прямоугольника достаточно задать координаты двух точек (левого верхнего и правого нижнего углов) и цвет и толщину линии. В этом разделе в основном рассмотрим методы векторной графики.

Пространство имен System.Drawing (Рисование) обеспечивает доступ к функциональным возможностям графического интерфейса GDI+ , используя около 50 (!) классов, в том числе класс Graphics. Чуть позже мы будем использовать дополнительные пространства имен System.Drawing.Drawing2D, System.Drawing.Imaging, System.Drawing.Printing, System.Drawing.Text, расширяющие функциональные возможности библиотеки System.Drawing.

Класс Graphics предоставляет методы рисования на устройстве отображения (другие термины — графический контекст, «холст»). Определимся сразу, на чем мы хотим рисовать. Далее в примерах он обозначается как объект g.

Способы задания «холста»

1. Графический объект — «холст» для рисования на форме Form1 (указатель this) можно задать, например, одним оператором:
Graphics g = this.CreateGraphics();
Примечание. Заметим, что стандартным образом
Graphics g = new Graphics();
создать объект-холст не удается.
На этом операторе генерируется ошибка:
Для типа «System.Drawing.Graphics» не определен конструктор.

2. Еще пример задания графического контекста на визуальном компоненте PictureBox (ящик для рисования) через растровый объект класса Bitmap. В классе Form1 зададим два объекта:
Graphics g; // графический объект — некий холст
Bitmap buf; // буфер для Bitmap-изображения
В конструктор Form1() добавим следующие операторы:
buf = new Bitmap(pictureBox1.Width, pictureBox1.Height); // с размерами
g = Graphics.FromImage(buf); // инициализация g

3. В принципе, иногда (если все графические операции выполняются внутри одной функции) эти четыре строки могут быть заменены одной строкой:
Graphics g = Graphics.FromImage(new Bitmap(pictureBox1.Width, pictureBox1.Height));
После этого можно задать фон холста белым:
g.Clear(Color.White);

4. Еще один пример задания «холста» на форме через дескриптор окна:
Graphics g = Graphics.FromHwnd(this.Handle);
Далее в примерах конкретизируются эти способы.

Читать еще:  Бейсик среда программирования

Объекты других классов из библиотеки System.Drawing

Такие классы, как Rectangle (прямоугольник) и Point (точка) инкапсулируют элементы GDI+. Отметим, что Point вообще то является структурой (struct) с полями x,y. Это уточнение несущественно, так как в C# структуры похожи на классы, a инициализация объекта-структуры point может выглядеть так же, как инициализация объекта-класса:
Point point= new Point();

Класс Pen (перо) используется для рисования линий и кривых, а классы, производные от класса Brush (кисть) используются для закраски замкнутых контуров (см. ниже).

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

Класс Image – абстрактный базовый класс предоставляет функциональные возможности для производных классов Bitmap и Metafile. Bitmap используется для работы с пиксельными изображениями (см. выше пример). Metafile определяет графический метафайл, содержащий записи, описывающие последовательность графических операций, которые могут быть записаны (созданы) и воспроизведены (отображается). Этот класс не наследуется.

Класс Graphics

Он инкапсулирует поверхность рисования GDI+. Этот класс не наследуется. Методов в этом классе огромное количество, поэтому сначала представим их в таблице, а затем рассмотрим некоторые из них с примерами и пояснениями.
В третьем столбце таблицы указывается число перегрузок метода, различающихся набором параметров (используйте интеллектуальную подсказку IntelliSense для выбора нужного Вам варианта метода).

Обзор графических библиотек C++

    Подборки, 21 мая 2018 в 16:56

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

SFML (Simple and Fast Multimedia Library) — одна из самых удобных и быстрых графических библиотек для 2D-графики. Её неоспоримое преимущество — минимальные требования к уровню знаний языка и лёгкость освоения: всего за несколько дней можно написать вполне себе полноценную программу. К примеру, первое графическое приложение «SFML works!» можно написать всего за минуту. Ещё одно неоспоримое преимущество — кроссплатформенность: SFML работает под Windows, Linux (только X11, но не Wayland) и Mac, планируется выход под Android.

Кое-что ещё

SFML библиотека используется по большей части небольшими стартапами и программистами, для которых создание игр — хобби. SFML популярен среди небольших команд благодаря тому, что не требует написания больших объёмов кода.

Qt представляет собой целый набор инструментов для быстрого и удобного проектирования GUI. Конечно же, здесь можно писать и игры — почему бы и нет? — но Qt привлекает программистов в основном тем, что она является быстрой, удобной, гибкой и кроссплатформенной. Во многом Qt обогнала даже SFML: библиотека доступна как на Windows, Linux и Mac, так и на мобильных платформах — Windows Mobile, Android и iOS.

Кое-что ещё

Qt расширяет C++ с помощью МОК (Мета-объектного компилятора) и предоставляет дополнительные функции (например, сигналы и слоты). Также имеет платную службу поддержки (как и платную лицензию). Для Qt есть большой выбор IDE: QtDesigner, QtCreator, QDevelop, Edyuk, а также доступна интеграция с Visual Studio, Eclipse и XCode.

Также можно пройти готовый курс по данной библиотеке.

Cairo

Cairo — библиотека для отрисовки векторных изображений под Linux, Windows и Mac OS. К примеру, такой крупный проект, как Mozilla, использует Cairo в браузерном движке Gecko. Также Cairo лежит в основе некоторых операционных систем (MorphOS, AmigaOS) и приложений (InkScape, Synfig, Graphite). При использовании библиотеки будьте готовы к отсутствию русскоязычных ресурсов.

Кое-что ещё

Cairo может взаимодействовать с OpenGL бэкендом с поддержкой GPU, что, конечно, открывает целый список полезных функций.

Cocos2D-X

Кроссплатформенная библиотека Cocos2D-X призванна упростить разработку мобильных игр. Поддерживает все те же платформы, что и Qt. Из плюсов стоит отметить доступность, удобство эксплуатации и создание отдельного конструктора игр, основанного на библиотеке Cocos Creator. В списке игр, основанных на движке, есть всемирно известная BADLAND, работающая на всех доступных платформах.

Кое-что ещё

Если при создании игры вам нужно работать с графикой и анимацией в больших объёмах, то лучше использовать Unity вместо Cocos2D-X. В Unity имеется возможность плавной интеграции с такими инструментами, как Photoshop, Maya или Blender. В Cocos2D-X вся графика добавляется извне и на неё ссылаются из кода.

Читать еще:  Асинхронное программирование это

Ивент переехал в онлайн, есть новые даты ( 14 – 15 июля ) , Москва и онлайн, 10 750–138 000 ₽

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

Juce — кроссплатформенный фреймворк, предназначенный для создания приложений и плагинов на языке C++.

Документации по Juce много, но не на русском языке. Поэтому можно скачать книгу «Программирование на C++ с JUCE 4.2.x: Создание кроссплатформенных мультимедийных приложений с использованием библиотеки JUCE на простых примерах».

Кое-что ещё

Juce больше популярен среди разработчиков аудио-ПО благодаря набору интерфейсов-оболочек для построения аудио-плагинов.

wxWidgets

wxWidgets — одна из старейших, но в то же время наиболее известных графических библиотек для отрисовки GUI. Её основной плюс — производительность. Если QT использует низкоуровневый код лишь для таких элементов, как кнопки и полосы прокрутки, то wxWidgets для каждой системы свой, и благодаря этому все элементы отображаются максимально похожими на системный стиль.

Кое-что ещё

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

В Сети есть урок по работе с библиотекой от её разработчиков.

SDL 2.0

SDL — кроссплатформенная 2D-библиотека, предназначенная для написания приложений (в основном игр). Поддерживаются Windows, Linux, Mac OS, а также Android, Windows Mobile и iOS. Преимущества библиотеки — быстрота, надёжность и лёгкость в эксплуатации. Также в библиотеке реализованы профессиональные инструменты для работы со звуком — это большой плюс при разработке крупных проектов.

Кое-что ещё

Комбинируется с wxWidgets и хорошо интегрируется с OpenGL.

Существует целый цикл уроков, размещённый на Habr.

Пожалуй, одна из самых известных графических библиотек. GTK+ — графический фреймворк, широко применямый во многих системах. Изначально он задумывался как компонент GIMP, но за 20 лет после выпуска первой стабильной версии он нашёл применение в сотнях других приложений.

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

Кое-что ещё

В своё время библиотека создавалась в качестве альтернативы Qt, которая была платной. GTK+ — один из немногих фреймворков, которые поддерживают язык C. Библиотека кроссплатформенная, но есть мнение, что программы на Linux выглядят более нативно, чем на Windows или Mac (GTK+ хорошо поддерживается даже на KDE). Интересно, что из-за некоторых проблем с кроссплатформенностью Wireshark перешла на Qt.

Пример первой программы можно посмотреть на Википедии.

Другие интересные статьи по C++ можно посмотреть у нас на сайте.

Заключение

Выше представлены наиболее популярные технологии для работы с GUI не только на C++, но иногда и на других языках (например, Qt и GTK+). Однако всегда следует учитывать особенности той или иной технологии. Выпишите список функций своего приложения, ещё раз прочитайте описания всех библиотек и фреймворков, и только после этого выбирайте то, что действительно подходит больше всего для проекта.

Программирование 3D графики на Visual Basic 6 и DirectX 8. Часть 3

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Public Sub D3DInit(hWnd As Long)
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS

Set d3d = dx8.Direct3DCreate
d3d.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode

d3dpp.Windowed = True
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
d3dpp.BackBufferFormat = DispMode.Format
d3dpp.BackBufferCount = 1
d3dpp.EnableAutoDepthStencil = True
d3dpp.AutoDepthStencilFormat = D3DFMT_D16

Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd _
, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
End Sub

200?’200px’:»+(this.scrollHeight+5)+’px’);»> Option Explicit

Private Type int64
dw1 As Long
dw2 As Long
End Type

Private Declare Function QueryPerformanceCounter Lib «kernel32» (lpPerformanceCount As int64) As Long
Private Declare Function QueryPerformanceFrequency Lib «kernel32» (lpFrequency As int64) As Long
Dim QSpeed As Double

Public Function QTime() As Double
Dim QD As int64, t As Double
QueryPerformanceCounter QD
If QD.dw1 Option Explicit

Public Running As Boolean
Public FPS As Long

Public Sub Main()
frmD3D.Show
QFreqIni
D3DInit frmD3D.hWnd
Running = True
Do While Running
DoEvents
Render
FPS = FPS + 1
Loop
Unload frmD3D
ClearAll
End Sub

Private Sub Render()
d3dDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFFFFFF * Rnd, 1, 0
d3dDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

Private Sub ClearAll()
D3DTerminate
End Sub

2.2. Мип-мэппинг, фильтрация текстур
При текстурировании существует проблема. Текстура состоит из конечного числа точек, которые называются текселями. На текстурируемой поверхности текстурные координаты могут располагаться с различной плотностью, кроме того сама поверхность может находиться дальше или ближе к камере, что приводит к изменению видимых размеров. В результате текстура накладывается некорректно. Представьте, что текстура, шириной в 16 текселей должна отобразиться на участок бэкбуфера, шириной в 17 или 15 пикселей. В первом случае один из текселей должен будет отобразиться на два пикселя, во втором одному из текселей не хватает места. Когда размер изображения значительно превышает размер текстуры, последняя, как говорят, «распадается на клетки».
Для наглядности сделаем проект. В модуль modMain предыдущего проекта добавьте все необходимое для создания вертексного буфера на четыре вертекса и одной текстуры. Вертекс должен содержать координаты XYZ и текстурные координаты. Создайте квадрат, размером 2 * 2 с центром в начале координат так, чтобы текстура десять раз укладывалась на поверхность квадрата:

Читать еще:  Синхронное и асинхронное программирование

2.3. Caps. Проверка совместимости
До сих пор мы применяли в основном стандартные функции Direct3D, совместимые практически с любыми современными видеоадаптерами. И только в предыдущем проекте мы столкнулись с возможной несовместимостью. Возникает вопрос, а можно ли написать программу так, чтобы она узнавала «на месте» возможности оборудования и автоматически выбирала наиболее оптимальный режим работы, либо отказывалась работать при необходимости? Можно. Для этого в DirectX имеется структура Caps, содержащая всю необходимую информацию об оборудовании. Пользоваться ей очень просто. Добавьте в модуль modDX общую переменную типа D3DCAPS8:

2.4. Мультитекстурирование
До сих пор мы накладывали на наши модели не более одной текстуры, в то время как Direct3D позволяет использовать одновременно до восьми текстур. Мы уже не раз использовали такую команду:

Основы трехмерной графики

Трехмерная графика в WPF включает в себя следующие ингредиенты:

окно просмотра (viewport), содержащее трехмерное содержимое;

источник света, освещающий часть трехмерной сцены;

камера, представляющая точку для наблюдения трехмерной сцены.

Разумеется, наиболее сложные трехмерные сцены содержат множество объектов и могут включать множество источников света. (Можно также создать трехмерный объект, не требующий источника света, если он сам излучает свет.) Однако перечисленные ингредиенты представляют собой хорошую начальную точку.

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

Так в чем же преимущество использования поддержки трехмерной графики в WPF? Первое преимущество состоит в том, что можно создавать эффекты, которые чрезвычайно сложно вычислить на основе эмулируемой трехмерной модели. Хорошим примером могут быть такие эффекты, как отражение, которое становится чрезвычайно сложным, когда приходится иметь дело с множеством источников света и разными материалами с различной отражающей способностью.

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

Окно просмотра

Чтобы работать с трехмерным содержимым, понадобится контейнер, который может его в себе разместить. Этот контейнер представлен классом Viewport3D, находящимся в пространстве имен System.Windows.Controls. Класс Viewport3D унаследован от FrameworkElement и потому может быть размещен везде, где размещается любой обычный элемент. Например, его можно использовать в качестве содержимого окна либо страницы или же поместить внутрь более сложной компоновки.

Класс Viewport3D лишь намекает на сложность трехмерного программирования. Он добавляет только два свойства: Camera, определяющее точку зрения на трехмерную сцену, и Children, содержащее все трехмерные объекты, которые должны помещаться на сцене. Достаточно интересно то, что источник света, освещающий сцену, сам является объектом в окне просмотра.

Среди унаследованных свойств класса Viewport3D одно является особенно важным — ClipToBounds. Если оно установлено в true (по умолчанию так и есть), то содержимое, выходящее за пределы окна просмотра, усекается. Если же упомянутое свойство равно false, это содержимое появляется поверх любых соседних элементов. Это поведение аналогично поведению свойства ClipToBounds класса Canvas. Однако при использовании Viewport3D есть одно существенное отличие: производительность. Установив Videport3D. ClipToBounds в false, можно в значительной мере увеличить производительность при визуализации сложной, часто обновляемой трехмерной сцены.

Ссылка на основную публикацию
Adblock
detector