Документация Engee

voxels

Страница в процессе перевода.

voxels(x, y, z, chunk::Array{<:Real, 3})
voxels(chunk::Array{<:Real, 3})

Строит блок вокселов с центром в точке 0. При необходимости расположение и масштаб фрагмента можно задать в виде диапазонов x, y и z. (Здесь учитываются только экстремумы. Вокселы всегда имеют одинаковый размер.)

На внутреннем уровне вокселы представлены 8-разрядными целыми числами без знака, при этом 0x00 — это всегда невидимый «воздушный» воксел. При передаче блока соответствующего типа эти значения задаются напрямую. Обратите внимание, что обработка цвета адаптирована для внутреннего представления и может происходить немного не так, как обычно.

Тип графика

Псевдоним типа графика для функции voxels — Voxels.

Примеры

Базовый пример

using GLMakie
# Аналогичен примеру для объема
r = LinRange(-1, 1, 100)
cube = [(x.^2 + y.^2 + z.^2) for x = r, y = r, z = r]
cube_with_holes = cube .* (cube .> 1.4)

# Для соответствия примеру объема с isovalue=1.7 и isorange=0.05 мы сопоставим все
# значения вне диапазона (1.65..1.75) с невидимыми воздушными блоками с is_air
f, a, p = voxels(-1..1, -1..1, -1..1, cube_with_holes, is_air = x -> !(1.65 <= x <= 1.75))
7f79fc3

Атрибут gap

Атрибут gap позволяет задать размер промежутка между смежными вокселами. Он указывается в единицах размера воксела (при gap = 0), поэтому gap = 0 не создает промежутки, а gap = 1 уменьшает размер воксела до 0. Обратите внимание, что этот атрибут работает только при значениях gap > 0.01.

using GLMakie
chunk = reshape(collect(1:27), 3, 3, 3)
voxels(chunk, gap = 0.33)
a997d1a

Цвет и внутреннее представление

Вокселы представлены внутренним образом в виде Array{UInt8, 3} идентификаторов вокселов. В этом представлении идентификатор воксела 0x00 определяется как невидимый воздушный блок. Все остальные идентификаторы (0x01—​0xff или 1—​255) являются видимыми и получают свой цвет из различных цветовых атрибутов. Специально для plot.color идентификатор воксела выступает в качестве индекса в массиве цветов:

using GLMakie
chunk = UInt8[
    1 0 2; 0 0 0; 3 0 4;;;
    0 0 0; 0 0 0; 0 0 0;;;
    5 0 6; 0 0 0; 7 0 8;;;
]
f, a, p = voxels(chunk, color = [:white, :red, :green, :blue, :black, :orange, :cyan, :magenta])
63718d4

Цветовые карты

Со входами, отличными от UInt8, атрибуты цветовой карты (colormap, colorrange, highclip, lowclip и colorscale) работают как обычно, за исключением nan_color, который не применяется:

using GLMakie
chunk = reshape(collect(1:512), 8, 8, 8)

f, a, p = voxels(chunk,
    colorrange = (65, 448), colorscale = log10,
    lowclip = :red, highclip = :orange,
    colormap = [:blue, :green]
)
cce777c

Передаваемые напрямую идентификаторы вокселов (т. е. Array{UInt8, 3}) используются для индексирования вектора [lowclip; sampled_colormap; highclip]. Это означает, что идентификатор 1 соответствует lowclip, 2…​254 — цветам цветовой карты, а 255 — highclip. В этом случае colorrangeи colorscale игнорируются.

Наложения текстур

Для наложения текстур нам нужно изображение, содержащее несколько текстур, которые должны быть наложены на вокселы. В качестве примера будем использовать Kenney’s Voxel Pack (воксельный пакет Kenney).

using GLMakie
using FileIO
texture = FileIO.load(Makie.assetpath("voxel_spritesheet.png"))
image(0..1, 0..1, texture, axis=(xlabel = "u", ylabel="v"))
ee86ff1

Когда color является изображением и преобразование uv_transform определено, вокселы отображаются с наложенной текстурой. В данном случае генерируются uv-координаты (текстура), затем они преобразуются с помощью uv_transform и после этого используются для выборки изображения. Каждый воксел начинается с uv-диапазона 0…​1, который можно отобразить с помощью debug_texture от Makie с преобразованием тождественности. Здесь пурпурный цвет соответствует (0, 0), синий — (1, 0), красный — (0, 1) и зеленый — (1, 1).

using GLMakie
using FileIO, LinearAlgebra
texture = FileIO.load(Makie.assetpath("debug_texture.png"))
voxels(ones(UInt8, 3,3,3), uv_transform = [I], color = texture)
71c711d

Для наложения текстур мы хотим преобразовать uv-диапазон 0…​1 в меньший, соответствующий текстурам на изображении. Для этого определим идентификатор uv_transform для каждого воксела, который включает перемещение и масштабирование.

using GLMakie
using FileIO

# загрузим лист спрайтов с текстурами 10 x 9
texture = FileIO.load(Makie.assetpath("voxel_spritesheet.png"))

# создадим отображение идентификатора воксела -> (перемещение, масштаб)
uvt = [(Point2f(x, y), Vec2f(1/10, 1/9))
    for x in range(0.0, 1.0, length = 11)[1:end-1]
    for y in range(0.0, 1.0, length = 10)[1:end-1]
]

# Определим, какие текстуры/uvs к каким вокселам применяются (0 — невидимый/воздушный блок)
chunk = UInt8[
    1 0 2; 0 0 0; 3 0 4;;;
    0 0 0; 0 0 0; 0 0 0;;;
    5 0 6; 0 0 0; 7 0 9;;;
]

# строим
voxels(chunk, uv_transform = uvt, color = texture)
5e8fd43

Наложение текстур также может быть выполнено для каждого воксела путем передачи Matrix uv-преобразований. Здесь первый индекс соответствует идентификатору воксела, а второй — стороне, следующей порядку: --x, --y, --z, +x, +y, +z.

using GLMakie
using FileIO

texture = FileIO.load(Makie.assetpath("voxel_spritesheet.png"))

# idx -> uv сопоставление LRBT для удобства. Обратите внимание на изменение порядка цикла.
uvs = [
    (Point2f(x, y), Vec2f(1/10, 1/9))
    for y in range(0.0, 1.0, length = 10)[1:end-1]
    for x in range(0.0, 1.0, length = 11)[1:end-1]
]

# Создадим uvmap со сторонами (-x -y -z x y z) во втором измерении.
uvt = Matrix{Any}(undef, 5, 6)
uvt[1, :] = [uvs[9],  uvs[9],  uvs[8],  uvs[9],  uvs[9],  uvs[8]]  # 1 -> береза
uvt[2, :] = [uvs[11], uvs[11], uvs[10], uvs[11], uvs[11], uvs[10]] # 2 -> дуб
uvt[3, :] = [uvs[2],  uvs[2],  uvs[2],  uvs[2],  uvs[2],  uvs[18]] # 3 -> верстак
uvt[4, :] = [uvs[1],  uvs[1],  uvs[1],  uvs[1],  uvs[1],  uvs[1]]  # 4 -> доска
uvt[5, :] = [uvs[75], uvs[75], uvs[76], uvs[75], uvs[75], uvs[62]] # 5 -> грязь/трава

chunk = UInt8[
    1 0 1; 0 0 0; 1 0 5;;;
    0 0 0; 0 0 0; 0 0 0;;;
    2 0 2; 0 0 0; 3 0 4;;;
]

# сначала повернем координаты текстуры 0...1, потому что текстура повернута относительно того, что ожидает OpenGL
voxels(chunk, uv_transform = (uvt, :rotr90), color = texture)
1b213da

Обратите внимание, что uv_transform допускает различные входные типы. Дополнительные сведения о них см. в описании ?Makie.uv_transform. В самом общем случае uv-преобразование представляет собой Makie.Mat{2, 3, Float32}, умноженное на Vec3f(uv..., 1). Синтаксис (translation, scale), который мы использовали выше, можно записать как Makie.Mat{2, 3, Float32}(1/10, 0, 0, 1/9, x, y).

Обновление вокселов

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

Сначала можно передать данные как Observable и обновить этот наблюдаемый элемент как обычно:

using GLMakie
chunk = Observable(ones(8,8,8))
f, a, p = voxels(chunk, colorrange = (0, 1))
chunk[] = rand(8,8,8)
f
fead61a

Можно также обновить данные, содержащиеся в объекте графика. Однако при этом индексировать график нельзя, так как в данном случае будут возвращены преобразованные данные идентификатора воксела. Нужно индексировать p.args.

using GLMakie
f, a, p = voxels(ones(8,8,8), colorrange = (0, 1))
p.args[end][] = rand(8,8,8)
f
7fb3f47

Оба эти решения приводят к полной замене входного массива (т. е. chunk), внутреннего представления (plot.converted[4]) и текстуры в GPU. Это может быть довольно медленным и затратным процессом, если требуется обновить только небольшую часть большого фрагмента. В этом случае следует обновить входные данные без запуска обновления (используя obs.val), а затем вызвать local_update(plot, is, js, ks) для обработки обновления:

using GLMakie
chunk = Observable(rand(64, 64, 64))
f, a, p = voxels(chunk, colorrange = (0, 1))
chunk.val[30:34, :, :] .= NaN # или p.args[end].val
Makie.local_update(p, 30:34, :, :)
f
843a8bb

Выбор вокселов

С помощью функции pick можно выбирать отдельные вокселы на воксельном графике. Возвращаемый индекс представляет собой плоский индекс в массиве, переданном voxels, то есть plt.args[end][][idx] вернет соответствующие данные. Здесь важно отметить, что возвращаемый индекс имеет внутреннее значение UInt32 и, следовательно, ограниченный диапазон. Очень большие воксельные графики (~4,3 млрд вокселов или 2048 x 2048 x 1024) могут достичь этого предела и вызвать целочисленное переполнение.

Атрибуты

alpha

Значение по умолчанию: 1.0

Альфа-значение цветовой карты или атрибута color. Несколько букв, таких как в plot(alpha=0.2, color=(:red, 0.5), будут умножены.

backlight

Значение по умолчанию: 0.0

Устанавливает вес для расчета вторичного освещения с использованием перевернутых нормалей.

clip_planes

Значение по умолчанию: automatic

Плоскости обрезки позволяют выполнять обрезку в трехмерном пространстве. Вы можете задать вектор длиной до 8 Plane3f Здесь вы можете задать плоскости, за которыми участки будут обрезаны (т.е. станут невидимыми). По умолчанию плоскости клипа наследуются от родительского графика или сцены. Вы можете удалить родительский элемент clip_planes проходя мимо Plane3f[].

color

Значение по умолчанию: nothing

Устанавливает цвета для каждого идентификатора воксела, пропуская 0x00. Это означает, что воксел с идентификатором 1 будет захватывать plot.colors[1] и так далее до id 255. Это также может быть задано как матрица цветов, т.е. изображение для отображения текстуры.

colormap

Значение по умолчанию: @inherit colormap :viridis

Устанавливает цветовую схему, которая выбирается для числовых значений. colors. PlotUtils.cgrad(...), Makie.Reverse(any_colormap) также можно использовать любой символ из ColorBrewer или PlotUtils. Чтобы просмотреть все доступные цветовые градиенты, вы можете позвонить по телефону Makie.available_gradients().

colorrange

Значение по умолчанию: automatic

Значения, представляющие начальную и конечную точки colormap.

colorscale

Значение по умолчанию: identity

Функция преобразования цвета. Может быть любой функцией, но хорошо работает только в сочетании с Colorbar для identity, log, log2, log10, sqrt, logit, Makie.pseudolog10 и Makie.Symlog10.

depth_shift

Значение по умолчанию: 0.0

настраивает значение глубины участка после всех других преобразований, т.е. в пространстве клипа, где 0 <= depth <= 1. This only applies to GLMakie and WGLMakie and can be used to adjust render order (like a tunable overdraw).

depthsorting

Значение по умолчанию: false

Controls the render order of voxels. If set to false voxels close to the viewer are rendered first which should reduce overdraw and yield better performance. If set to true voxels are rendered back to front enabling correct order for transparent voxels.

diffuse

Значение по умолчанию: 1.0

Определяет, насколько сильно красный, зеленый и синий каналы реагируют на рассеянный (рассеянный) свет.

fxaa

Значение по умолчанию: true

настраивает, будет ли отображаться график с помощью fxaa (сглаживание, только для GLMakie).

gap

Значение по умолчанию: 0.0

Устанавливает интервал между соседними вокселами в единицах размера воксела. Для вступления в силу это значение должно быть больше 0,01.

highclip

Значение по умолчанию: automatic

Цвет для любого значения, превышающего цветовой диапазон.

inspectable

Значение по умолчанию: @inherit inspectable

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

inspector_clear

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (inspector, plot) -> ...</span> для очистки пользовательских индикаторов в DataInspector.

inspector_hover

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (inspector, plot, index) -> ... которая заменяет функцию по умолчанию show_data методы.

inspector_label

Значение по умолчанию: automatic

Устанавливает функцию обратного вызова (plot, index, position) -> string который заменяет метку по умолчанию, сгенерированную DataInspector.

interpolate

Значение по умолчанию: false

Определяет, будет ли выборка текстурной карты выполняться с интерполяцией (т.е. плавно) или без нее (т.е. пикселизированно).

is_air

Значение по умолчанию: x->begin #= /home/tnmoxa/.julia/packages/MakieCore/yRxVU/src/basic_plots.jl:626 =# isnothing(x) || (ismissing(x) || isnan(x)) end

Функция, которая управляет тем, какие значения во входных данных отображаются в невидимые (эфирные) вокселы.

lowclip

Значение по умолчанию: automatic

Цвет для любого значения ниже цветового диапазона.

material

Значение по умолчанию: nothing

RPRMakie - единственный атрибут для установки сложных материалов RadeonProRender. Предупреждаю, способ установки RPR-материала может измениться, и другие серверные системы будут игнорировать этот атрибут

model

Значение по умолчанию: automatic

Задает матрицу модели для построения графика. Это отменяет корректировки, сделанные с помощью translate!, rotate! и scale!.

nan_color

Значение по умолчанию: :transparent

Цвет для значений NaN.

overdraw

Значение по умолчанию: false

Определяет, будет ли график отображаться поверх других графиков. В частности, это означает игнорирование проверок глубины в GL-интерфейсах

shading

Значение по умолчанию: automatic

Задает используемый алгоритм освещения. Возможны следующие варианты: NoShading (без освещения), FastShading (Окружающий свет + точечный свет) или MultiLightShading (Несколько источников света, только GLMakie). Обратите внимание, что это не влияет на RPRMakie.

shininess

Значение по умолчанию: 32.0

Определяет, насколько четким будет отражение.

space

Значение по умолчанию: :data

задает область преобразования для прямоугольника, охватывающего участок. Видеть Makie.spaces() для получения возможных исходных данных.

specular

Значение по умолчанию: 0.2

Определяет, насколько сильно объект отражает свет в красном, зеленом и синем каналах.

ssao

Значение по умолчанию: false

Определяет, будет ли график отображаться с помощью ssao (screen space ambient occlusion). Обратите внимание, что это имеет смысл только для 3D-графиков и применимо только к fxaa = true.

transformation

Значение по умолчанию: :automatic

Документация недоступна.

transparency

Значение по умолчанию: false

Настраивает прозрачность графика. В GLMakie transparency = true в результате используется прозрачность, независимая от порядка.

uv_transform

Значение по умолчанию: nothing

Чтобы использовать отображение текстуры, uv_transform должно быть определено и color должно быть изображением. То uv_transform может быть задан как Vector , где каждый индекс соответствует UInt8 идентификатору вокселя (пропуск 0), или как Matrix , где второй индекс соответствует стороне, следующей по порядку (-x, -y, -z, +x, +y, +z). Каждый элемент действует как Mat{2, 3, Float32} , который применяется к Vec3f(uv, 1), где для каждого воксела генерируются значения uv, начиная с 0..1. Результат затем используется для выборки текстуры. У UV-преобразований есть множество сокращений, которые вы можете использовать, например (Point2f(x, y), Vec2f(xscale, yscale)) Они перечислены в ?Makie.uv_transform.

uvmap

Значение по умолчанию: nothing

Устаревший - используйте uv_transform

visible

Значение по умолчанию: true

Определяет, будет ли отображаться график или нет.