|
13 / 7 / 0
Регистрация: 02.06.2014
Сообщений: 27
|
|
Литература, уроки по OpenGL 3+01.12.2014, 17:47. Показов 43257. Ответов 146
Метки нет (Все метки)
0
|
|
| 01.12.2014, 17:47 | |
|
Ответы с готовыми решениями:
146
Уроки OpenGL - FAQ Дайте ссылки на уроки по OpenGL в C# Уроки создания движков и редакторов на OpenGL+delphi |
| 01.03.2026, 03:05 | |||
|
Ну вот, другое дело, по крайней мере человек не боится ответить
Второе. Вращаем объект, два ключа (keyframe): RotateY = 0 на кадре 0, RotateY = 720 на кадре 60. Все ясно, за 60 кадров объект делает 2 полных оборота. Но это с "плохими" углами Эйлера. Как это сделать с "хорошими" кватернионами? Да никак, там +/- 180, и вся любовь. Так что интерполяция - это цветочки. Углы Эйлера обладают другими подлыми свойствами. Ну это пусть Ваня расскажет, он там сейчас с ИИ подружился, для него любой вопрос - не проблема
0
|
|||
|
|
|||||
| 01.03.2026, 10:16 | |||||
![]() Пока кроме сферы со стрелочкой в голову ничего не приходит. Добавлено через 9 минут
0
|
|||||
|
Модератор
|
|||
| 01.03.2026, 11:42 | |||
|
Добавлено через 20 минут И к тому же тут один человек советует писать код с помощью Даже самому прилично все изучив хорошо если выйдет добиться уровня OpenGL, а для лучшего будет нетривиальная задачка. Да и в книгах уроках все довольно упрощенно и некоторые вещи делаются в упор понятливости вместо оптимальности подхода. Например выделение буферов, у вулкана ограничено число выделений и в уроке пишется мол надо либо самому писать менеджер памяти (выделяя больше блоки и используя оффсеты при использовании памяти где нужно) либо использовать готовые сторонние либы, например vma, а так как в уроках не будет достигнут лимит, то будем выделять все напрямую. Я уже который раз берусь за серию уроков vulkan-tutorial, хотя он и по старой версии вулкана (1.0) но сойдет (да и к тому же моя видеокарта самые свежие не поддерживает, вроде у 10 серии нету поддержки 1.4 вулкана) особенно для обучения. Пока переписываю Сишный код уроков на плюсы, так как у Вулкана появился плюсовый апи, который куда компактнее получается, вместо заполнения структур построчно просто создаешь с помощью конструктора указывая только то что нужно или вызываешь методы возвращающие что нужно а не через указатели в параметрах. Но я пока никак не могу понять основные концепции, например чтобы сделать чтото в духе OpenGL, то есть разделить служебные части (инстанс, девайс, очереди, синхронизацию и тд) от рендера объектов. Тут много что связано, например графический пайплайн (включающий в себя настройки растеризатора и кучу всего) в который внезапно входят и шейдеры и и описание вершинных данных, но при этом описание юниформ буферов туда не входит. А все драв колы происходят в коммандных буферах, где привязывается рендерпасс, пайплайн, буферы, описания юниформ и сам дравкол. И только потом в каждом кадре с кучей синхронизации для непосредственно рисования запускается командный буфер. Еще надо учитывать что свапчейн можнт протухнуть и его надо пересоздавать (например при ресайзе окна) и при его пересоздании надо пересоздавать почти все, остаются только грубо говоря буферы и немного служебных объектов, шейдеры, описания вершин и пайплайн надо пересоздавать с нуля (то есть почти всю геометрию обновлять, благо без перезагрузки вершинных данных). Не говоря уже про зависимости, что нужно для создания всего.
0
|
|||
|
|
||||
| 01.03.2026, 12:05 | ||||
|
Добавлено через 9 минут
0
|
||||
|
Модератор
|
||
| 01.03.2026, 12:25 | ||
|
Допустим 100 костей, 1 матрица это 16 float или 64 байта, что будет чуть более 6кб памяти. Особенно если учесть что у видеокарт сейчас минимум по 4гб памяти, ну даже если взять 1-2, то на фоне размера модели и текстур это ничего. С другой стороны если использовать повороты, то тогда надо вычислять матрицы трансформации для каждой вершины, сейчас скелетные меши довольно тяжелые, думаю 100к полигонов вполне себе средний размер, то есть выйдет очень много однотипных расчетов, тогда как все матрицы можно заранее рассчитать в пределах одного кадра.
0
|
||
| 01.03.2026, 12:36 | |
|
Один из самый лучших видеокурсов по OpenGL 3, который состоит из 60 уроков, на канале ThinMatrix: OpenGL 3D Game Tutorials. Уроки на Java и LWJGL, но они по сути на чистом шейдерном OpenGL и без особых проблем переписываются на любой другой язык.
В этом курсе есть 4 урока по скелетной анимации. Интерполяция позиций костей и кватернионов между ключевыми кадрами анимации происходит в главной программе, а в шейдер передаётся массив матриц перед рисованием модели, который хранит в себе слепок позы для кадра. В этих уроках используется формат Collada (.dae), который был удалён из новых версий Blender, но этот формат намного легче в понимании, чем glTF, в контексте скелетных анимаций. DAE можно парсить XML-парсером, например, библиотекой pugixml (https://github.com/zeux/pugixml) на C++, либо использовать встроенный модуль в Qt. На Python есть порт pugixml: https://pypi.org/project/pugixml/ На JavaScript, C#, Java и т.д. есть встроенные парсеры XML. Если кто-то захочет переписать код примеров на C++ и формат glTF, то можно взять библиотеку simdjson: https://github.com/simdjson/simdjson или использовать Qt, в который встроен парсер формата JSON. OpenGL Skeletal Animation Tutorial #1: https://www.youtube.com/watch?v=f3Cr8Yx3GGA OpenGL Skeletal Animation Tutorial #2: https://www.youtube.com/watch?v=F-kcaonjHf8 OpenGL Skeletal Animation Tutorial #3: https://www.youtube.com/watch?v=cieheqt7eqc OpenGL Skeletal Animation Tutorial #4: https://www.youtube.com/watch?v=z0jb1OBw45I
0
|
|
| 01.03.2026, 13:14 | ||||||
|
0
|
||||||
| 01.03.2026, 14:26 | |
|
Раз уже в теме началось активное обсуждение отношения к Vulkan, то я выскажу свою позицию. Я начал было изучать Vulkan в этом году, но потом быстро понял, что лично мне он не подходит, потому что у меня в приоритете веб-технологии (JavaScript, Bootstrap/HTML5/CSS и C/C++/WebAssembly), чтобы можно было ещё и EXE и APK собирать из той же кодовой базы, а Vulkan, в отличие от OpenGL ES 2.0/3.0 (WebGL 1.0/2.0), не умеет собираться в Wasm (WebAssembly) и запускаться в браузере. Прямой современный аналог Vulkan в веб - это WebGPU. То есть я узнал, что WebGPU есть на Си, C++, SDL3 для Desktop, Android и Wasm, поэтому переключился на WebGPU. Но есть большая проблема для меня, что WebGPU не запускается в браузере на моём Redmi 10 (2021 года), хотя там Vulkan есть, но Vulkan на нём не достаточно новой версии, чтобы запускался WebGPU. Поэтому я решил, что для Android надо использовать WebGL 2.0 (JavaScript) и OpenGL ES 3.0 (SDL3), а для Desktop практиковаться с WebGPU (JavaScript, SDL3). У меня на стационарном ПК в браузере WebGPU работает без проблем, как и при сборке в EXE с SDL3-окном, так как ПК поддерживает Vulkan достаточной версии. WebGPU использует Vulkan.
P.S. Только, пожалуйста, не пишите опять бред, что браузер не предназначен для рисования компьютерной графики. Браузеры не только предназначены для отображения текста и картинок (хотя и то и другое, это тоже компьютерная графика), но ещё умеют проигрывать 3D-звук, показывать видео и даже есть люди, которые стабильно зарабатывают на браузерных играх (что более реально в РФ, чем продажи на Steam из РФ) и на неигровой 3D-графике в браузерах, типа продажи 3D-моделей, которые можно покрутить в браузере перед покупкой или для интерактивной рекламы. В этом году еженедельное скачивание Three.js приблизилось к 7 миллионам и растёт стремительно: https://www.npmjs.com/package/three Three.js уже поддерживает WebGPU и активно развивается в этом направлении.
0
|
|
| 01.03.2026, 15:42 | ||||
![]() Вот есть 3 угла поворота, порядок поворотов XYZ (их (порядков) много, может быть напр ZXZ). Пусть поворот Y = 90 (или -90). После поворота по Y "новая" ось Z совпадает (точнее коллинеарна) со "старой" осью X. В результате повороты X и Z вращают вокруг одной и той же оси. Но это совсем не значит что объект как-то "застрял", вращение недоступно и все такое. Просто минус одна степень свободы. Поворота Z можно добиться поворотом X и наоборот. Объект нормально реагирует на все 3 поворота, интерактивность никак не нарушается. И вообще 2 угла достаточны для любого желаемого поворота. В конце-концов никто не доказал что "вращение по кратчайшей дуге" - именно то что нужно юзеру
0
|
||||
|
6270 / 2994 / 1051
Регистрация: 01.06.2021
Сообщений: 11,138
|
||
| 01.03.2026, 16:36 | ||
|
snake32 верно говорит, что "большинство приложений может и показывает юзеру-дизайнеру углы Эйлера, но это абсолютно не значит что внутри они не переводятся в кватернионы и вся работа идёт уже непосредственно с кватернионами."
я бы даже сказал абсолютное большинство приложений внутренне используют именно кватернионы, но поскольку конечным пользователям удобнее работать с углами Эйлера, то в инспекторе игровых движков отображаются углы Эйлера. Однако, все математические операции эффективнее выполнять в кватернионах. С этими углами Эйлера одни проблемы - лаганутые интерполяции, gimbal lock, погрешности, медленные вычисления, сбои физики и пр. Алгоритмам проще работать с кватернионами. Как видно, если в углах Эйлера у нас было (0°, 90°, 0°), то при переходе на кватернион будет (0, sqrt(2)/2, 0, sqrt(2)/2). В Godot тоже можно переключаться между режимами. Там даже три режима: Euler, Quaternion и Basis А вот в UE ничего похожего не встречал (но может я не знаю, где искать), там только углы Эйлера. Но разумеется через код можно работать с кватернионами на любом движке. Я выше писал именно про инспекторы. В Blender тоже можно переключаться между углами Эйлера и кватернионом.
0
|
||
| 01.03.2026, 17:05 | |||
|
Добавлено через 24 минуты ![]() Хорошо, вот задачка которая кажется ну совсем простой. В процессе симуляции (всем лежать, работает движок физики) на каждом шаге для движущихся объектов считаются новые матрицы трансформации. Необходимо преобразовать каждую в стандартные данные: позиция + 3 угла поворота. Только просьба без глупостей: не надо рассказывать что есть ф-ция(и) для перевода матрицы поворота в углы. Это всем известно, и ф-ция давно найдена, и работает она верно, но вот.. есть подводные камни. Какие?
0
|
|||
|
6270 / 2994 / 1051
Регистрация: 01.06.2021
Сообщений: 11,138
|
|
| 01.03.2026, 17:30 | |
|
Igor3D, углы Эйлера из матрицы на каждом шаге это плохой подход. Правильное решение - хранить состояние в кватернионах и конвертировать в углы только для вывода.
На каждом шаге вместо матрицы трансформации (матрица поворота + позиция) советую использовать кватернион + позиция. Матрицу трансформации, если она нужна для прорисовки, можно получить потом очень просто из кватерниона и позиции. Что касается подводных камней, то подозреваю, что около сингулярностей будут усиливаться погрешности чисел с плавающей запятой (накопление погрешности), потом углы будут прыгать.
0
|
|
| 01.03.2026, 17:46 | |||
Первая проблема очевидна и обсуждалась выше
0
|
|||
|
6270 / 2994 / 1051
Регистрация: 01.06.2021
Сообщений: 11,138
|
||||
| 01.03.2026, 20:53 | ||||
|
Например, в Unity в описании функции Transform.eulerAngles сказано:
Допустим наши углы Эйлера это Поскольку порядок ZXY, то матрицы должны перемножаться в обратном порядке Получается такая матрица: Тем не менее, Unity предупреждает
Кстати, получение кватерниона из углов Эйлера в разы быстрая и легкая операция в плане вычислений, чем конвертирование матрицы поворота в кватернион. И даже если все-таки кроме кватерниона еще нужна матрица поворота, то лучше вычислять кватернион не из уже полученной матрицы, а снова из углов Эйлера. Т.е. и матрицу, и кватернион лучше вычислять из углов Эйлера.
0
|
||||
| 01.03.2026, 21:24 | ||||
|
RotateY = 179 // frame 1 RotateY = -179 // frame2 В анимации надо сохранить RotateY = 179 // frame 1 RotateY = 181 // frame2 Следующий камень? (он тоже упоминался выше)
0
|
||||
|
6270 / 2994 / 1051
Регистрация: 01.06.2021
Сообщений: 11,138
|
|||||||
| 01.03.2026, 21:32 | |||||||
NormalizeAngle(-181) будет 179, а NormalizeAngle(181) будет -179
0
|
|||||||
|
|
||||
| 01.03.2026, 23:39 | ||||
![]() ![]() Добавлено через 1 минуту
0
|
||||
| 02.03.2026, 02:56 | |||
|
Еще раз напомню: углов нет, цель их получить (из матриц движка), причем такие углы что пригодны для интерполяции
0
|
|||
|
400 / 36 / 7
Регистрация: 09.01.2019
Сообщений: 147
|
||
| 02.03.2026, 08:28 | ||
|
1) Инициализация контекста: инстанс, физический + логический девайс, очередь (2 из туториала выкиньте, Вам 1 нужна, для работы с графикой) 2) Представление: сурфейс, свапчейн с VkImage + VkImageView. Сюда относится и функционал, отвечающий за пересоздание свапчейна при изменении геометрии окна. "Минимум 3 VkImage" Вы написали - это не так, в большинстве случаев хватит двух. 3) Создание разделяемых ресурсов: шейдеры, дескрипторы, текстуры, пул комманд буфферов, VkBuffers etc. Имеет смысл создать менеджер ресурсов, который будет следить за их жизненным циклом и уничтожать их в корректном порядке. "Разделяемый ресурс" - я подразумеваю, что, например, можно использовать один и тот же вершинный шейдерный модуль в нескольких пайплайнах (и с разными фрагментными, и незачем несколько раз пересоздавать один и тот же ресурс) 4) Пайплайны. Это то место, где Вы, цитата выше, не можете отделить рендер, но тут всё проще. Во-первых, выкиньте рендерпассы с фреймбуферами, это в вулкане 1.3+ уже лет 5 как не имеет смысла: https://lesleylai.info/en/vk-k... rendering/ Во-вторых, на каждую рисуемую сущность создаётся свой пайплайн. Соответственно, создаёте 2 класса: обёртка для пайплайна и гибкий класс для настройки его состояния, с соответствующими методами на каждый этап пайплайна. Пересоздавать пайплайны, внезапно, необязательно при изменении размеров окна, это лишь рекомендуется, как и запись комманд буферов каждый кадр - они дёшевы (но, конечно, никто не запрещает Вам оптимизировать). 5) Менеджер памяти: он нужен, конечно, (тот самый упомянутый Вами vma вполне подойдёт), но в контексте обучения, когда Вы не пишете условный скайрим, оно пока что ни к чему, это первое усложнение, в которое Вы не захотите вникать 6) Второй сложный момент - это синхронизация, увы, его не обойти. Вулкан весь асинхронен, и на каждый чих нужно расставлять семафоры с фенсами. Для меня лично это самое сложное было (и есть) в нём, необходимо писать собственную стейт машину, если не хотите разбирать тонны варнингов из слоёв валидации. В общем-то, вот и весь скелет типичного вулкан приложения
0
|
||
|
6270 / 2994 / 1051
Регистрация: 01.06.2021
Сообщений: 11,138
|
||||||
| 02.03.2026, 11:37 | ||||||
|
Igor3D, для интерполяции углы Эйлера не очень подходят. Нужно использовать кватернионы.
Кроме того, вместо обычной линейной интерполяции (LERP), советую использовать SLERP (сферическую линейную интерполяцию): т.е. когда 3d повороты представляются как кватернионы на абстрактной трехмерной сфере. Трехмерная сфера это сфера в 4D. Как выше было отмечено, игровые движки хранят повороты в виде кватернионов (даже когда пользователь вводит углы Эйлера), что и нужно для SLERP. Таким образом, первая задача это получить кватернион. Формулу для получения кватерниона из углов Эйлера я написал выше. То, про что я пишу, уже реализовано во многих движках. Например, в Unity есть функция Quaternion.Slerp, которая на вход получает два кватерниона и параметр интерполяции, а возвращает интерполированный кватернион.
Если же пишешь без использования api игрового движка и этих функций у тебя нет, то значит придется самому реализовать все эти вспомогательные функции для работы с кватернионами.
0
|
||||||
| 02.03.2026, 11:37 | |
|
Помогаю со студенческими работами здесь
120
Литература по OpenGL
Литература по OpenGL Литература по OpenGL
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|