voxels
|
Страница в процессе перевода. |
#
MakieCore.voxels — Function
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))
Атрибут 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)
Цвет и внутреннее представление
Вокселы представлены внутренним образом в виде 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])
Цветовые карты
Со входами, отличными от 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]
)
Передаваемые напрямую идентификаторы вокселов (т. е. 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"))
Когда 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)
Для наложения текстур мы хотим преобразовать 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)
Наложение текстур также может быть выполнено для каждого воксела путем передачи 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)
Обратите внимание, что 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).
Обновление вокселов
Воксельный график немного отличается от других типов графиков, что влияет на способ обновления его данных.
using GLMakie
chunk = Observable(ones(8,8,8))
f, a, p = voxels(chunk, colorrange = (0, 1))
chunk[] = rand(8,8,8)
f
Можно также обновить данные, содержащиеся в объекте графика. Однако при этом индексировать график нельзя, так как в данном случае будут возвращены преобразованные данные идентификатора воксела. Нужно индексировать p.args.
using GLMakie
f, a, p = voxels(ones(8,8,8), colorrange = (0, 1))
p.args[end][] = rand(8,8,8)
f
Оба эти решения приводят к полной замене входного массива (т. е. 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
Выбор вокселов
С помощью функции 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.
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
Функция, которая управляет тем, какие значения во входных данных отображаются в невидимые (эфирные) вокселы.
material
Значение по умолчанию: nothing
RPRMakie - единственный атрибут для установки сложных материалов RadeonProRender. Предупреждаю, способ установки RPR-материала может измениться, и другие серверные системы будут игнорировать этот атрибут
model
Значение по умолчанию: automatic
Задает матрицу модели для построения графика. Это отменяет корректировки, сделанные с помощью translate!, rotate! и scale!.
overdraw
Значение по умолчанию: false
Определяет, будет ли график отображаться поверх других графиков. В частности, это означает игнорирование проверок глубины в GL-интерфейсах
shading
Значение по умолчанию: automatic
Задает используемый алгоритм освещения. Возможны следующие варианты: NoShading (без освещения), FastShading (Окружающий свет + точечный свет) или MultiLightShading (Несколько источников света, только GLMakie). Обратите внимание, что это не влияет на RPRMakie.
space
Значение по умолчанию: :data
задает область преобразования для прямоугольника, охватывающего участок. Видеть Makie.spaces() для получения возможных исходных данных.
specular
Значение по умолчанию: 0.2
Определяет, насколько сильно объект отражает свет в красном, зеленом и синем каналах.
ssao
Значение по умолчанию: false
Определяет, будет ли график отображаться с помощью ssao (screen space ambient occlusion). Обратите внимание, что это имеет смысл только для 3D-графиков и применимо только к fxaa = true.
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.