体素
: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]
颜色表
使用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"))
体素渲染与纹理映射时 颜色 是一个图像和 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)
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)
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)
请注意 uv_翻译 允许各种输入类型。 你可以找到更多关于他们的信息 ?麦琪uv_翻译. 在最一般的情况下,uv变换是 麦琪垫子{2, 3, Float32} 它乘以 Vec3f(uv..., 1). 该 (翻译、比例尺) 我们上面使用的语法可以写成 麦琪垫子{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
using GLMakie
f, a, p = voxels(ones(8,8,8), colorrange = (0, 1))
p.args[end][] = rand(8,8,8)
f
这两种解决方案都触发了输入数组的完全替换(即 块,块),内部表示(情节。转换[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
挑选体素
该 挑选 函数能够在体素图中挑选单个体素。 返回的索引是传递给数组的平面索引 体素,即 plt的。args[结束][][idx] 会返回相关数据。 这里需要注意的一件重要的事情是,返回的索引是 UInt32 内部并因此具有有限的范围。 非常大的体素图(~43亿体素或2048x2048x1024)可以达到此限制并触发整数溢出。
属性
夹片机
默认值为 自动的
剪辑平面提供了一种在3D空间中进行剪辑的方法。 您可以设置最多8个向量 平面3f 飞机在这里,后面的情节将被裁剪(即变得不可见)。 默认情况下,剪辑平面继承自父绘图或场景。 您可以删除父 夹式飞机 通过传递 平面3f[].
颜色表
默认值为 @继承colormap:viridis
设置为数字采样的颜色表 颜色s. PlotUtils.cgrad(。..), 麦琪反向(any_colormap) 也可以使用,或者来自ColorBrewer或PlotUtils的任何符号。 要查看所有可用的颜色渐变,您可以调用 麦琪可用_gradients().
脱脩脟茅脕麓陆脱
默认值为 错误
控制体素的渲染顺序。 如果设置为 错误 首先渲染靠近查看器的体素,这应该减少过度绘制并产生更好的性能。 如果设置为 真的 体素是从后到前呈现的,使透明体素的顺序正确.
is_air
默认值为 x->开始
#=/home/tnmoxa/。julia/packages/MakieCore/yRxVU/src/basic_plots。jl:626=#
isnothing(x)|/(ismissing(x)//isnan(x))
结束
控制输入数据中哪些值映射到不可见(空气)体素的函数。
底纹/底纹
默认值为 自动的
设置使用的照明算法。 选项是 NoShading (无照明), 快装,快装 (AmbientLight+PointLight)或 MultiLightShading (多个灯,仅GLMakie)。 请注意,这不会影响RPRMakie。