2015-01-07 3 views
1

Я смотрю онлайн, и меня впечатляют возможности использования данных воксела, особенно для создания местности и манипуляции. Проблема в том, что вокселы никогда не были четко объяснены на любом сайте, который я посетил, или о том, как использовать/внедрять их. Все, что я нахожу, это то, что вокселы являются объемными данными. Пожалуйста, предоставьте более полный ответ; что такое объемные данные. Это может показаться простым вопросом, но я все еще не уверен.Как хранить данные вокселя?

Кроме того, как бы вы реализовали данные воксела? (Я пытаюсь реализовать это в программе C++.) Какой тип данных вы использовали бы для хранения данных воксела, чтобы я мог как можно быстрее изменять содержимое во время выполнения. Я смотрел онлайн, и я не мог найти ничего, что объясняло бы, как хранить данные. Списки объектов, массивов, ect ...

Как вы используете вокселы?

EDIT: Поскольку я только начинаю с вокселей, я, вероятно, начну с его использования только для моделирования простых объектов, но в конечном итоге я буду использовать его для рендеринга местности и объектов мира.

+0

Для простоты: трехмерный массив. Для исполнения: [octree] (http://en.wikipedia.org/wiki/Octree) Я думаю. – BWG

ответ

0

В популярном использовании в 90-х и 00-х годах «воксел» может означать несколько разные вещи, что, вероятно, является одной из причин, по которым вам трудно найти согласованную информацию. В литературе по технической визуализации это означает элемент 3D-объема. Зачастую, однако, он используется для описания того, что несколько более четко обозначается как двигатель с высокой степенью детализации (в отличие от двигателя с низким уровнем детализации в Doom или Wolfenstein). Популярный многостраничный учебник живет в Flipcode archives. Также проверьте this brief one by Jacco.

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

Вы должны тщательно подумать о том, что хотите поддержать своим двигателем: автомобильные гонки, летающие, 3D-объекты, планеты и т. Д., Поскольку эти ограничения могут изменить реализацию вашего двигателя. Зачастую структура данных не является сама по себе, но поле высоты рельефа представляется процедурно по функциям. В противном случае вы можете использовать изображение в качестве высоты. Для производительности, при рендеринге на экран, подумайте об уровне детализации, другими словами, сколько фактических пикселей будет восприниматься визуализируемым элементом. Это определит, сколько выборок вы делаете в поле высоты. Как только вы получите что-то работающее, вы можете подумать о том, как вы можете смешивать пиксели со временем и пространством экрана, чтобы они выглядели лучше, делая как можно меньше рендеринга.

1

Voxels - это всего лишь 3d-пиксели, т. Е. Трехмерное пространство, регулярно разделенное на блоки.

Как вы их используете? Действительно зависит от того, что вы пытаетесь сделать. Ленточный каскад игровой движок? Медицинский объемщик? Что-то совсем другое?

Простые 3d-массивы могут быть лучшими для вас, но это интенсивная память. Как указывал BWG, octtree - еще одна популярная альтернатива. Найдите разреженные октеты Вокселя для более позднего подхода.

0

В сущности, вокселы представляют собой трехмерное расширение пикселей («объемных пикселей»), и они действительно могут использоваться для представления объемных данных.

Что объемное данные

Математически, объемные данные можно рассматривать как трехмерный функцию Р (х, у, г). Во многих приложениях эта функция является скалярной функцией, т. Е. Имеет одно скалярное значение в каждой точке (x, y, z) в пространстве. Например, в медицинских целях это может быть плотность определенных тканей.Чтобы представить это в цифровой форме, один общий подход состоит в том, чтобы просто сделать фрагменты данных: представить изображения на (X, Y) -плоскости и сдвинуть значение z, чтобы иметь несколько изображений. Если срезы близко друг к другу, изображения могут отображаться в видеопоследовательности, например, на вики-странице для МРТ-сканирования (https://upload.wikimedia.org/wikipedia/commons/transcoded/4/44/Structural_MRI_animation.ogv/Structural_MRI_animation.ogv.360p.webm). Как вы можете видеть, каждая точка в пространстве имеет одно скалярное значение, которое представлено как оттенки серого.

Вместо фрагментов или видео можно также представлять эти данные с помощью вокселей. Вместо того, чтобы делить 2D-плоскость в правильной сетке пикселей, мы теперь разделим трехмерную область в регулярной сетке вокселей. Опять же, скалярное значение может быть дано каждому вокселу. Тем не менее, визуализация это не так тривиально: тогда как мы могли бы просто дать серое значение пикселам, это не работает для вокселей (мы бы увидели только цвета самого окна, а не его интерьера). На самом деле эта проблема вызвана тем, что мы живем в трехмерном мире: мы можем смотреть на двумерное изображение из третьего измерения и полностью наблюдать за ним; но мы не можем смотреть на 3D-воксельное пространство и наблюдать за ним полностью, поскольку у нас нет 4-го измерения, из которого можно смотреть (если вы не подсчитаете время как 4-е измерение, т. е. создаете видео).

Таким образом, мы можем смотреть только на части данных. Один из способов, как указано выше, состоит в том, чтобы делать срезы. Другой способ - посмотреть на так называемые «изо-поверхности»: мы создаем поверхности в трехмерном пространстве, для которых каждая точка имеет одно и то же скалярное значение. Для медицинского сканирования это позволяет извлечь, например, часть мозга из объемных данных (а не только как срез, а как трехмерную модель).

Наконец, обратите внимание, что поверхности (сетки, террасы, ...) не являются объемными, они 2D-формы изогнуты, скручены, растянуты и деформированы для встраивания в 3D-пространство. В идеале они представляют границу объемного объекта, но не обязательно (например, данные о местности, вероятно, не будут закрытыми сетками). Способ представления поверхностей с использованием объемных данных заключается в том, что поверхность снова является изо-поверхностью некоторой функции. В качестве примера: F (x, y, z) = x^2 + y^2 + z^2 - R^2 может представлять сферу с радиусом R, центрированную вокруг начала координат. Для всех точек (x ', y', z ') сферы F (x', y ', z') = 0. Более того, для точек внутри сферы F < 0 и для точек за пределами сфера, F> 0.

Способ создания такой функции заключается в создании карты расстояния , т. е. создания объемных данных, так что каждая точка F (x, y, z) указывает расстояние до поверхность. Разумеется, поверхность представляет собой совокупность всех точек, для которых расстояние равно 0 (так, опять же, iso-surface со значением 0, как и с сферой выше).

Как реализовать

Как уже отмечалось другими, это действительно зависит от использования. По сути, данные могут быть представлены в трехмерной матрице. Однако, это огромный! Если вы хотите, чтобы разрешение удвоилось, вам нужно 8-кратное хранилище, поэтому, в общем, это не эффективное решение. Это будет работать для меньших примеров, но не очень хорошо масштабируется.

Структура octree, afaik, наиболее распространенная структура для хранения этого. Существует множество реализаций и оптимизаций для octrees, поэтому посмотрите, что можно использовать (re). Как отметил Андреас Калер, редкие октеты вокселов являются недавним подходом.

Octrees позволяют легче перемещаться по соседним ячейкам, родительским клеткам, дочерним ячейкам, ... (теперь я предполагаю, что понятие осей (или квадрантов в 2D) известно?) Однако, если многие листовые клетки расположены на лучшие решения, эта структура данных будет иметь огромные накладные расходы! Итак, это лучше, чем 3D-массив: это зависит от того, с какими объемными данными вы хотите работать, и с какими операциями вы хотите работать.

Если данные используются для представления поверхности, octrees будет вообще быть гораздо лучше: как указано выше, поверхности не очень объемные, поэтому не потребуют много вокселей иметь соответствующие данные (отсюда: «разреженный» octrees). Возвращаясь к картам расстояний, единственными релевантными данными являются точки, имеющие значение 0. Другие точки также могут иметь любое значение, но это не имеет значения (в некоторых случаях знак все еще рассматривается, для обозначения «внутренних» и «внутренних», экстерьер ", но само значение не требуется, если требуется только поверхность).

Как использовать

Если на «использование», вы задаетесь вопросом, как их делают, то вы можете посмотреть на «походных кубов» и его оптимизации. MC создаст треугольную сетку из объемных данных, которая будет отображаться любым классическим способом. Вместо перевода в треугольники вы также можете посмотреть рендеринг тома для рендеринга «3D-выборки данных» (то есть вокселей) как таковых (https://en.wikipedia.org/wiki/Volume_rendering). Я должен признать, что я не настолько разбираюсь в рендеринг тома, поэтому я оставлю его только на wiki-ссылке.

Смежные вопросы