Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1972 / 828 / 115
Регистрация: 01.10.2012
Сообщений: 4,986
Записей в блоге: 2

Как хранить полигоны/фейсы

04.02.2026, 03:46. Показов 2510. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Часто говорят "3D объект состоит из треугольников", но это не совсем верно (мягко говоря). В общем случае объект может содержать примитивы (фейсы) ссылающиеся на любое число вертексов. Условная классификация

{0} - точка (используется 1 вертекс с индексом 0, сами вертексы хранятся отдельно)
{0, 1} - линия
{0, 1, 4} - треугольник
{0, 1, 4, 5} - квадрангл (4-угольник)
{0, 1, 4, 5 .. 100} - "комплексный" полигон/контур

Также каждый фейс может иметь свои данные

uint32 material_index - индекс материала (часто)
uint32 color - цвет (иногда)
Vec3f normal - нормаль (редко)

Предложите структуру данных для хранения фейсов

Спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2026, 03:46
Ответы с готовыми решениями:

Есть ли способ хранить массив классов без инициализации (хранить только их заголовки)?
Есть ли способ хранить массив классов без инициализации, а только их заголовки и в нужный момент...

Загрузка точек полигоны Boost
Добрый день. Как загрузить точки (x,y) в полигоны boost? Тут в примере:...

Как в int* var хранить массивы? В чем суть задания?
Всем добрый день :). В задании говорится: "Создайте класс контейнера для целых чисел". Далее...

46
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13184 / 6820 / 1821
Регистрация: 18.10.2014
Сообщений: 17,263
04.02.2026, 04:05
Так а в чем проблема с очевидным решением: фейс - массив индексов вершин (раз уж дано, что вершины хранятся индексами, а не явно)?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
04.02.2026, 12:34
Цитата Сообщение от Igor3D Посмотреть сообщение
Часто говорят "3D объект состоит из треугольников", но это не совсем верно
Все дело в контексте. Когда кто-то так говорит, ты просто спроси у него, что он имеет в виду.

Если под 3D объектом имеешь в виду полигональный меш (полигональную сетку), то согласен, что не только из треугольников.

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

На втором месте по красоте - меш, состоящий из четырухугольников (Quads). Такой меш удобен во время трехмерного моделирования, скульпитинга и прочих операций. С ними всегда секси топология. Однако, все равно твой красивый меш из четырехугольников будет превращен в треугольный меш, т.к. каждый четырехугольник будет разбит на два треугольника.

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

Но 3d объекты это не только полигональные меши. Есть же еще воксельные, параметрические и процедурные объекты.

Цитата Сообщение от Igor3D Посмотреть сообщение
Предложите структуру данных для хранения фейсов
в OBJ формате так:

Code
1
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3
тут пример фейса с тремя вершинами (треугольный фейс)

v - индекс вершины

vt - индекс текстурной координаты (опционально)

vn - индекс нормали (опционально)

Разумеется, в этом же файле должны быть координаты для этих индексов.

Чем не устраивает такой подход? Для текстового формата вполне неплохой подход. Или ты хочешь использовать бинарный формат?
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
04.02.2026, 12:49
Цитата Сообщение от Royal_X Посмотреть сообщение
в OBJ формате так:
где вы все берёте мотивацию третий месяц мусолить обж файлы?

мой прогноз:
"Нам потребуется не менее трёх лет, чтобы тщательно "разобрать" обж файлы, но мы точно закончим эту работу к 2077 году"
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
04.02.2026, 12:56
XLAT, у Игора3д нет фантазии. Может же человек спросить не про "структуру данных для хранения фейсов", а, например, про "структуру данных для хранения состояния кубика рубика")

Добавлено через 2 минуты
XLAT, или, например, может же предложить совместно разработать игру "Балда". Интереснее, чем кроссворд. Скажем, сетевая Балда

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
тщательно "разобрать" эти файлы
наверное, он втайне от всех создает свой формат для хранения меша, который будет конкурировать с ныне существующими. Потом он будет лямы грести лопатой, а мы просто будем завидовать
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,093
Записей в блоге: 3
04.02.2026, 12:57
Цитата Сообщение от Royal_X Посмотреть сообщение
у Игора3д нет фантазии.
а может всё-таки таки нет памяти - Игорь просто уже забыл, что обж файлы мы разобрали 3 месяца назад?

я сёдня рано утром прочел пост Игоря про фейсы,
и подумал, ну, явно же не стоит уже писать ему про обж-файлы, когда я ему уже ранее написал целый парсер...

если он уже забыл, то какой смысл писать заново? - опять же забудет...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
04.02.2026, 12:57
Цитата Сообщение от XLAT Посмотреть сообщение
а может всё-таки таки нет памяти
а скока ему лет? если много, то может и так

или администрация форума платит ему з/п, чтобы тот постоянно строчил новые темы
1
1972 / 828 / 115
Регистрация: 01.10.2012
Сообщений: 4,986
Записей в блоге: 2
04.02.2026, 17:54  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а в чем проблема с очевидным решением: фейс - массив индексов вершин (раз уж дано, что вершины хранятся индексами, а не явно)?
Вопрос был на технику плюсов, глубокие познания в 3D не требуются. Пусть "только треугольники", тогда все ясно
C++
1
2
3
4
5
6
struct Face {
 uint32 material_index;
 uint32 color;
 uint32 flags;
 uint32 indices[3];
};
Ну и модель хранит контейнер этих структур, потенциально большой. Спрашивается "а что/как если "не только" и indices[3] уже не годится?
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 495
04.02.2026, 19:02
Igor3D, так вообще не делается. Никто для каждого фейса не хранит флаги и прочее, модель делится на сабсеты (в терминах Direct3D) - это части модели, объединённые общими стейтами, то есть их можно рендерить за один DIP. Фейсы, как правило, вообще не используются, а перед сохранением в модель триангулируются. Каждый сабсет - это вертексный буфер, со всеми его вертексами, индексный буфер на все его треугольники в формате TriangleList и набор свойств, типа текстуры, материала. Сама информация со ссылками на текстуры и материалы может и не храниться, просто мы знаем, что эти свойства у сабсетов разные. Или даже одинаковые, но сабсет выделен в отдельную от остальных часть потому, что его нужно отдельно от модели двигать (пример - колесо от машины).
0
1972 / 828 / 115
Регистрация: 01.10.2012
Сообщений: 4,986
Записей в блоге: 2
04.02.2026, 20:53  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Igor3D, так вообще не делается. Никто для каждого фейса не хранит флаги и прочее, модель делится на сабсеты (в терминах Direct3D) - это части модели, объединённые общими стейтами, то есть их можно рендерить за один DIP. Фейсы, как правило, вообще не используются, а перед сохранением в модель триангулируются. Каждый сабсет - это вертексный буфер, со всеми его вертексами, индексный буфер на все его треугольники в формате TriangleList и набор свойств, типа текстуры, материала. Сама информация со ссылками на текстуры и материалы может и не храниться, просто мы знаем, что эти свойства у сабсетов разные. Или даже одинаковые, но сабсет выделен в отдельную от остальных часть потому, что его нужно отдельно от модели двигать (пример - колесо от машины).
Это тоже решение, пусть узко специализированное, "для карты", чтобы добиться макс скорости рисования. Псевдокод
C++
1
2
3
4
5
6
7
8
struct SubSet {
  uint32 material_index;
  uint32 vert_count;
  uint32 color;
  uint32 flags;
  std::vector<uint32> indices;
  handle indices_vbo;
};
Это структура для "пачки фейсов", все должны иметь одинаковый material_index, vert_count, color и flags, разные только индексы. При загрузке/считывании каждого нового фейса ищется подходящий SubSet или создается новый. Отсутствие (индивидуального) flags придется компенсировать созданием новых SubSet, что бывает не очень удобно (напр перенос selected). Уползти на треугольники все равно не удается. Точки и линии никто не отменял, да и quadrangle в UI wireframe не равен 2 тр-кам. Светлая сторона - SubSet рисуется одной командой рисования, и даже хранить вектор indices необязательно после того как индексы переданы на карту и получен indices_vbo.

Не по теме:

Конечно если известно что модели будут "только такие", и никаких других, то все хорошо. Но в общем случае нет.
В общем игры - совсем не пуп этой Земли (а ее другое место :))

0
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,427
Записей в блоге: 2
04.02.2026, 22:05
Цитата Сообщение от Igor3D Посмотреть сообщение
В общем игры - совсем не пуп этой Земли
При чем тут игры? Видеокарты и особенности работы с ними везде одинаковые. Если надо рисовать, то использовать надо то что удобнее видеокарте.
Цитата Сообщение от Mikle Quits Посмотреть сообщение
TriangleList
Современные игры мало ковырял, но в старых все же чаще TriangleStrip встречается.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 495
04.02.2026, 22:41
Цитата Сообщение от alecss131 Посмотреть сообщение
Современные игры мало ковырял, но в старых все же чаще TriangleStrip встречается.
Не знаю о на сколько старых играх речь, но, скачивая с просторов интернета модель какой-нибудь машинки, я всегда был заранее уверен, что там TriangleList, ни разу не ошибся. А, например, D3DXMesh - это по определению набор сабсетов TriangleList.
Понятно, что TriangleStrip (или TriangleFun) в общем случае требует меньше повторных расчётов уже раз просчитанных вертексов, но видеокарты уже давно умеют кэшировать такие расчёты в рамках одного DIP.

Цитата Сообщение от Igor3D Посмотреть сообщение
Псевдокод
Даже не так. В сабсете содержится не только массив индексов, но и массив вертексов, он не общий для всей модели.
0
1972 / 828 / 115
Регистрация: 01.10.2012
Сообщений: 4,986
Записей в блоге: 2
05.02.2026, 00:25  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Если надо рисовать, то использовать надо то что удобнее видеокарте.
Спрашивалось "как хранить", а не "как рисовать"
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Даже не так. В сабсете содержится не только массив индексов, но и массив вертексов, он не общий для всей модели.
На здоровье. Пример
Для фейса 5 установить material_index = 1
И что делать? Бегать по субсетам, так все равно не поможет, индекс фейса потеряли. Я понимаю что в игре такая задача вряд ли возникнет, но у меня она есть. Я хочу нормальный контейнер фейсов, хранящий индексы (и) на CPU, а не какого-то игрового урода. Это не мешает иметь приличную скорость рисования
0
1972 / 828 / 115
Регистрация: 01.10.2012
Сообщений: 4,986
Записей в блоге: 2
06.02.2026, 13:29  [ТС]
В общем, тема стала жертвой фетишизма Это был простой вопрос С++ для начинающих, во всяком случае так думал ТС. Кстати вопрос очень банальный, давно известный. Разве стартовый пост упоминает о рисовании вообще, об использовании GPU, разве спрашивалось как это делается в играх (что мы считаем шедевром инженерной мысли)? Ничего такого там нет, есть масса других задач.

Ну и отвечайте "по теме", не суйте ваши игры куда надо и не надо
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
06.02.2026, 14:14
Цитата Сообщение от Igor3D Посмотреть сообщение
Это был простой вопрос С++ для начинающих, во всяком случае так думал ТС.
ну так ты не ответил на вопрос

Цитата Сообщение от Royal_X Посмотреть сообщение
Или ты хочешь использовать бинарный формат?
Igor3D, чтобы ответить на вопрос про предпочтительную структуру данных, сперва нужно узнать, в каком формате все это будет храниться: в бинарном или текстовом? У обоих есть и преимущества и недостатки.

Бинарный формат занимает меньше места, скорость чтения/записи выше, нет потери точности.
Текстовый формат выигрывает в читаемости (а стало быть в ручном редактировании в любом текстовом редакторе), но размер больше и парсер медленный, а также будут потери точности (например, у координат с плавающей запятой).

например, obj текстовый, glb бинарный...

Добавлено через 12 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Это был простой вопрос С++ для начинающих
и зря ты так пишешь. Это отталкивает экспертов форума, которые стыдятся отвечать на "вопросы для начинающих". Вот если бы ты написал, что "это вопрос для экспертов, дескать нигде в инете не смогли ответить и вся надежда на экспертов форума", то эксперты форума сразу же стали бы отвечать на твои вопросы
0
Модератор
Эксперт Java
 Аватар для alecss131
2881 / 1387 / 411
Регистрация: 11.08.2017
Сообщений: 4,427
Записей в блоге: 2
06.02.2026, 14:27
Цитата Сообщение от Royal_X Посмотреть сообщение
в каком формате все это будет храниться: в бинарном или текстовом?
При чем тут это? Тут скорее важно где это будет храниться, на диске для долгого хранения или просто в памяти для последующей обработки.
Цитата Сообщение от Royal_X Посмотреть сообщение
выигрывает в читаемости (а стало быть в ручном редактировании в любом текстовом редакторе)
Никто руками модельки не редактирует, особенно что нибудь более менее сложное. Для редактирования есть 3д редакторы.
Цитата Сообщение от Igor3D Посмотреть сообщение
"как хранить", а не "как рисовать"
Модельки в любом случае надо будет рисовать, а то нафига они нужны? Да даже редактирование модели в 3д редакторе это рисование модели в том числе. 3д модель без рисования просто мусорный набор данных.
Если например для 3д печати, то там свои особенности и полигоны там не применимы.

А вообще хранить стоит в том формате в котором удобнее и быстрее будет обработка.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
06.02.2026, 14:49
Цитата Сообщение от alecss131 Посмотреть сообщение
Тут скорее важно где это будет храниться, на диске для долгого хранения или просто в памяти для последующей обработки.
это всё тоже косвенно связано с моим вопросом. Ведь, если будешь хранить на диске, то сжатый текстовый формат может занять меньше места, чем сжатый бинарный. Для памяти, конечно же, бинарный будет лучше.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 495
06.02.2026, 14:54
Цитата Сообщение от Royal_X Посмотреть сообщение
сжатый текстовый формат может занять меньше места, чем сжатый бинарный
Не представляю, как такое может случиться.

Представил, но это нонсенс - если в вертексе все координаты float имеют целочисленные значения, то в текстовом виде действительно может занять меньше места.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
06.02.2026, 15:37
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Представил, но это нонсенс
ключевое слово здесь "сжатый". Т.е. сравниваем не просто текстовый и бинарный, а сжатые текстовый и бинарный форматы.
то, что бинарный меньше места занимает - это и ежу понятно и я сам об этом писал выше

Цитата Сообщение от Royal_X Посмотреть сообщение
Бинарный формат занимает меньше места, скорость чтения/записи выше, нет потери точности.
Текстовый формат выигрывает в читаемости (а стало быть в ручном редактировании в любом текстовом редакторе), но размер больше и парсер медленный, а также будут потери точности (например, у координат с плавающей запятой).
но эту гипотезу со сжатием форматов для хранения полигонального меша еще проверить нужно на практике, поэтому я писал "может", поскольку не уверен

Цитата Сообщение от Royal_X Посмотреть сообщение
то сжатый текстовый формат может занять меньше места, чем сжатый бинарный.

но я встречал уже такие случаи, когда PPMD, например, текстовый сжимал лучше, чем бинарный. Тут нужно проверить на разных алгоритмах сжатия и на разных данных. Т.е. проверять на конкретном случае.
0
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 495
06.02.2026, 16:04
Цитата Сообщение от Royal_X Посмотреть сообщение
ключевое слово здесь "сжатый"
Я прочитал это слово.
Вот я сгенерировал 100000 случайных векторов и сохранил в двух форматах, в текстовом формате всё минималистично - никаких лишних пробелов, никаких нулей перед десятичной точкой - всё равно в архиве бинарник меньше, даже несжатый бинарник меньше txt с макс сжатием:
Вложения
Тип файла: zip TxtVsBin.zip (234.3 Кб, 3 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2026, 16:04
Помогаю со студенческими работами здесь

как хранить поток?
задача такая: класс имеет конструктор, этому конструктору при создании объекта класса передаёться...

Как хранить строки в кодировке UTF-8?
Как сделать, чтобы в строковом типе символы находились в кодировке utf8? в данном коде слово ТЕКСТ...

Как хранить динамические данные в exe файле?
Как узнать сколько раз запустили exe файл? Слышал что есть строковые ресурсы но так не получилось...

Как лучше всего хранить коэффициенты?
Мне нужно работать с матрицей порядка 100 000. Она сильно разреженная, по этому хранить все...

Задача на алгоритм Дейкстры (как лучше хранить информацию?)
Доброго времени суток. Есть задача: Есть идея хранить входные данные след. образом: Выделить в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru