Engee 文档

体素

:stem:latexmath :mathjax-tex-packages:ams物理动词boldsymbol

包括::ROOT:partial$page-status。adoc[标签=正在翻译]

xref/# <无翻译>*马基科。体素*-Function

体素(x,y,z,chunk::数组{<:真实,3})
体素(chunk::Array{<:真实,3})

绘制以0为中心的体素块。 可选地,块的位置和缩放可以给出像x、y和z这样的范围(这里只考虑极值)。 体素总是均匀大小。)

内部体素表示为8位无符号整数,具有 0x00 永远是一个看不见的"空气"体素。 传递具有匹配类型的块将直接设置这些值。 请注意,颜色处理是专门用于内部表示的,并且可能与通常的行为有点不同。

绘图类型

绘图类型别名 体素 功能是 体素.

例子:

基本例子

</无翻译>

使用GLMakie
#与卷示例相同
r=LinRange(-1,1,100)
cube=[(x.^2+y.^2+z.^2)for x=r,y=r,z=r]
cube_with_holes=立方体。*(立方体。> 1.4)

#为了将卷示例与isovalue=1.7和isorange=0.05匹配,我们将所有映射
#范围外的值(1.65。.1.75)到带有is_air的隐形空气块
f,a,p=体素(-1..1, -1..1, -1..1,cube_with_holes,is_air=x->!(1.65<=x<=1.75))

图片::Makie/3404335.png[,600px]

间隙属性

差距 属性允许您指定相邻体素之间的间隙大小。 它以体素大小为单位给出(在 差距=0)使 差距=0 创建没有差距和 差距=1 将体素大小减小到0。 请注意,此属性仅在值时生效 差距>0.01. </无翻译>

使用GLMakie
chunk=重塑(收集(1:27), 3, 3, 3)
体素(块,间隙=0.33)

图片::Makie/A997d1a.png[,600px]

颜色和内部表示

体素表示为 阵列{UInt8,3} 体素id的内部。 在此表示中,体素id 0x00 被定义为不可见的空气块。 所有其他id(0x01-0xff或1-255)都是可见的,并从各种颜色属性派生其颜色。 为 情节。颜色 具体而言,体素id作为颜色数组的索引: </无翻译>

使用GLMakie
块=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=体素(块,颜色=[:白色,:红色,:绿色,:蓝色,:黑色,:橙色,:青色,:洋红色])

图像::Makie/63718d4.png[,600px]

颜色表

与非 UInt8 输入、颜色映射属性(颜色映射、colorrange、highclip、lowclip和colorscale)照常工作,但 纳米色 哪些不适用: </无翻译>

使用GLMakie
chunk=重塑(收集(1:512), 8, 8, 8)

f,a,p=体素(块,
    colorrange=(65,448),colorscale=log10,
    lowclip=:红色,highclip=:橙色,
    颜色表=[:蓝色,:绿色]
)

图片::Makie/cce777c.png[,600px]

当直接传递体素id(即an 阵列{UInt8,3})它们用于索引向量 [lowclip;sampled_colormap;highclip]. 这意味着id1映射到lowclip,2。.颜色表的颜色为254,颜色表的颜色为255。 颜色变化色阶;色阶 在这种情况下被忽略。

纹理贴图

对于纹理映射,我们需要一个包含多个纹理的图像,这些纹理要映射到体素。 作为一个例子,我们将使用https://www.kenney.nl/assets/voxel-pack[肯尼的体素包]。 </无翻译>

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

体素渲染与纹理映射时 颜色 是一个图像和 uv_翻译 被定义。 在这种情况下,生成uv(纹理)坐标,通过 uv_翻译 然后用于对图像进行采样。 每个体素以0开始。.1uv范围,可以通过使用Makie的"debug_texture"进行身份转换来显示。 这里品红对应于(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

要做纹理映射,我们要转换0。.1uv范围到与图像中的纹理对应的较小范围。 我们可以通过定义一个 uv_翻译 包括平移和缩放的每个体素id。 </无翻译>

using GLMakie
using FileIO

# load a sprite sheet with 10 x 9 textures
texture = FileIO.load(Makie.assetpath("voxel_spritesheet.png"))

# create a mapping of voxel id -> (translation, scale)
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]
]

# Define which textures/uvs apply to which voxels (0 is invisible/air)
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;;;
]

# draw
voxels(chunk, uv_transform = uvt, color = texture)
5e259dd

纹理映射也可以通过传递一个 矩阵 uv变换。 这里第一个索引对应于体素id,第二个对应于顺序如下的一侧:-x,-y,-z,+x,+y,+z。 </无翻译>

using GLMakie
using FileIO

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

# idx -> uv LRBT map for convenience. Note the change in order loop order
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]
]

# Create uvmap with sides (-x -y -z x y z) in second dimension
uvt = Matrix{Any}(undef, 5, 6)
uvt[1, :] = [uvs[9],  uvs[9],  uvs[8],  uvs[9],  uvs[9],  uvs[8]]  # 1 -> birch
uvt[2, :] = [uvs[11], uvs[11], uvs[10], uvs[11], uvs[11], uvs[10]] # 2 -> oak
uvt[3, :] = [uvs[2],  uvs[2],  uvs[2],  uvs[2],  uvs[2],  uvs[18]] # 3 -> crafting table
uvt[4, :] = [uvs[1],  uvs[1],  uvs[1],  uvs[1],  uvs[1],  uvs[1]]  # 4 -> planks
uvt[5, :] = [uvs[75], uvs[75], uvs[76], uvs[75], uvs[75], uvs[62]] # 5 -> dirt/grass

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;;;
]

# rotate 0..1 texture coordinates first because the texture is rotated relative to what OpenGL expects
voxels(chunk, uv_transform = (uvt, :rotr90), color = texture)
36b4aa6

请注意 uv_翻译 允许各种输入类型。 你可以找到更多关于他们的信息 ?麦琪uv_翻译. 在最一般的情况下,uv变换是 麦琪垫子{2, 3, Float32} 它乘以 Vec3f(uv..., 1). 该 (翻译、比例尺) 我们上面使用的语法可以写成 麦琪垫子{2, 3, Float32}(1/10,0,0,1/9,x,y).

更新体素

体素图与其他图类型略有不同,这会影响您可以和应该更新其数据的方式。

首先你_can_将你的数据作为一个 可观察的 并像往常一样更新observable: </无翻译>

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

您还可以更新plot对象中包含的数据。 为此,您不能索引到绘图中,因为这将返回转换后的体素id数据。 相反,你需要索引到 p.args. </无翻译>

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

这两种解决方案都触发了输入数组的完全替换(即 块,块),内部表示(情节。转换[4])和gpu上的纹理。 如果您只想更新大块的一小部分,这可能会非常缓慢和浪费。 在这种情况下,您应该在不触发更新的情况下更新输入数据(使用 obs。瓦尔)然后打电话 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 # or p.args[end].val
Makie.local_update(p, 30:34, :, :)
f
e491798

挑选体素

挑选 函数能够在体素图中挑选单个体素。 返回的索引是传递给数组的平面索引 体素,即 plt的。args[结束][][idx] 会返回相关数据。 这里需要注意的一件重要的事情是,返回的索引是 UInt32 内部并因此具有有限的范围。 非常大的体素图(~43亿体素或2048x2048x1024)可以达到此限制并触发整数溢出。

属性

阿尔法

默认值为 1.0

Colormap或color属性的alpha值。 多个阿尔法像在 图(alpha=0.2,颜色=(:红色,0.5),会成倍增加。

背光源

默认值为 0.0

为具有倒法线的二次光计算设置权重。

夹片机

默认值为 自动的

剪辑平面提供了一种在3D空间中进行剪辑的方法。 您可以设置最多8个向量 平面3f 飞机在这里,后面的情节将被裁剪(即变得不可见)。 默认情况下,剪辑平面继承自父绘图或场景。 您可以删除父 夹式飞机 通过传递 平面3f[].

颜色

默认值为 什么都没有

设置每个体素id的颜色,跳过 0x00. 这意味着id为1的体素将抓取 情节。颜色[1] 依此类推直到id255。 这也可以设置为颜色的矩阵,即用于纹理映射的图像。

颜色表

默认值为 @继承colormap:viridis

设置为数字采样的颜色表 颜色s. PlotUtils.cgrad(。..), 麦琪反向(any_colormap) 也可以使用,或者来自ColorBrewer或PlotUtils的任何符号。 要查看所有可用的颜色渐变,您可以调用 麦琪可用_gradients().

颜色变化

默认值为 自动的

表示的开始点和结束点的值 颜色表.

色阶;色阶

默认值为 身份认同

的颜色变换功能。 可以是任何函数,但只能与 颜色栏身份认同, 日志, 日志2, 日志10, sqrt,sqrt, 罗吉特, 麦琪伪科学10麦琪符号10.

depth_换档

默认值为 0.0

在所有其他变换之后(即在剪辑空间中)调整绘图的深度值,其中 0<=深度<=1. 这仅适用于GLMakie和WGLMakie,可用于调整渲染顺序(如可调谐透绘)。

脱脩脟茅脕麓陆脱

默认值为 错误

控制体素的渲染顺序。 如果设置为 错误 首先渲染靠近查看器的体素,这应该减少过度绘制并产生更好的性能。 如果设置为 真的 体素是从后到前呈现的,使透明体素的顺序正确.

弥漫性;弥漫性

默认值为 1.0

设置红色、绿色和蓝色通道对漫射(散射)光的反应强度。

外汇管理局

默认值为 真的

调整绘图是否使用fxaa(抗锯齿,仅限GLMakie)渲染。

差距

默认值为 0.0

以体素尺寸为单位设置相邻体素之间的间隙。 这需要大于0.01才能生效。

[医]高

默认值为 自动的

Colorrange上方任何值的颜色。

可检查的

默认值为 @继承inspectable

设置此图是否应由 数据探测仪. 默认值取决于父场景的主题。

检查员-检查员

默认值为 自动的

设置回调函数 (检查员,情节)->。.. 用于清理DataInspector中的自定义指标。

检查员-检查员

默认值为 自动的

设置回调函数 (检查员,情节,索引)->。.. 它取代了默认值 显示_数据 方法。

检查器_label

默认值为 自动的

设置回调函数 (绘图、索引、位置)->字符串 它替换了DataInspector生成的默认标签。

插值,插值

默认值为 错误

控制是否使用插值(即平滑)或不(即像素化)对纹理贴图进行采样。

is_air

默认值为 x->开始 #=/home/tnmoxa/。julia/packages/MakieCore/yRxVU/src/basic_plots。jl:626=# isnothing(x)|/(ismissing(x)//isnan(x)) 结束

控制输入数据中哪些值映射到不可见(空气)体素的函数。

低频,低频

默认值为 自动的

Colorrange以下任何值的颜色。

材料

默认值为 什么都没有

RPRMakie只属性设置复杂的RadeonProRender材料. Warning,如何设置RPR材质可能会发生变化,其他后端会忽略此属性

模型

默认值为 自动的

为绘图设置模型矩阵。 这将复盖使用 翻译!, 旋转!规模!.

纳米色

默认值为 :透明

NaN值的颜色。

透支

默认值为 错误

控制绘图是否将绘制在其他绘图上。 这具体意味着忽略GL后端中的深度检查

底纹/底纹

默认值为 自动的

设置使用的照明算法。 选项是 NoShading (无照明), 快装,快装 (AmbientLight+PointLight)或 MultiLightShading (多个灯,仅GLMakie)。 请注意,这不会影响RPRMakie。

光泽,光泽

默认值为 32.0

设置反射的锐度。

空间

默认值为 :数据

设置包含情节的盒子的变换空间。 见 麦琪空间() 供可能的输入。

镜面,镜面

默认值为 0.2

设置对象在红色、绿色和蓝色通道中反射光线的强度。

ssao

默认值为 错误

调整是否使用ssao(屏幕空间环境光遮蔽)渲染绘图。 请注意,这仅在3D绘图中有意义,并且仅适用于 fxaa=真.

转型

默认值为 :自动

没有可用的文档。

透明度

默认值为 错误

调整情节处理透明度的方式。 在GLMakie 透明度=真 导致使用顺序独立的透明度。

uv_翻译

默认值为 什么都没有

使用纹理映射 uv_翻译 需要定义和 颜色 需要是一个图像。 该 uv_翻译 可以作为一个 向量资料 其中每个索引映射到 UInt8 体素id(跳过0),或作为 矩阵 其中第二个索引映射到顺序后面的一侧 (-x,-y,-z,+x,+y,+z). 每个元素作为一个 垫子{2, 3, Float32} 其应用于 Vec3f(uv,1),其中uv生成为从0开始运行。.1为每个体素。 然后将结果用于对纹理进行采样。 UV变换有一堆你可以使用的短边,例如 (Point2f(x,y),Vec2f(xscale,yscale)). 它们列于 ?麦琪uv_翻译.

uvmap的

默认值为 什么都没有

弃用-使用uv_transform

可见

默认值为 真的

控制是否渲染绘图。