mesh
mesh(x, y, z)
mesh(mesh_object)
mesh(x, y, z, faces)
mesh(xyz, faces)
Plots a 3D or 2D mesh. Supported mesh_object
s include Mesh
types from GeometryBasics.jl.
Attributes
Specific to Mesh
color=theme(scene, :patchcolor)
sets the color of the mesh. Can be aVector{<:Colorant}
for per vertex colors or a singleColorant
. AMatrix{<:Colorant}
can be used to color the mesh with a texture, which requires the mesh to contain texture coordinates. Vector or Matrices of numbers can be used as well, which will use the colormap arguments to map the numbers to colors.interpolate::Bool = false
sets whether colors should be interpolated.
3D shading attributes
shading = true
enables lighting.diffuse::Vec3f = Vec3f(0.4)
sets how strongly the red, green and blue channel react to diffuse (scattered) light.specular::Vec3f = Vec3f(0.2)
sets how strongly the object reflects light in the red, green and blue channels.shininess::Real = 32.0
sets how sharp the reflection is.ssao::Bool = false
adjusts whether the plot is rendered with ssao (screen space ambient occlusion). Note that this only makes sense in 3D plots and is only applicable withfxaa = true
.
Color attributes
colormap::Union{Symbol, Vector{<:Colorant}} = :viridis
sets the colormap that is sampled for numericcolor
s.PlotUtils.cgrad(...)
,Makie.Reverse(any_colormap)
can be used as well, or any symbol from ColorBrewer or PlotUtils. To see all available color gradients, you can callMakie.available_gradients()
.colorscale::Function = identity
color transform function. Can be any function, but only works well together withColorbar
foridentity
,log
,log2
,log10
,sqrt
,logit
,Makie.pseudolog10
andMakie.Symlog10
.colorrange::Tuple{<:Real, <:Real}
sets the values representing the start and end points ofcolormap
.nan_color::Union{Symbol, <:Colorant} = RGBAf(0,0,0,0)
sets a replacement color forcolor = NaN
.lowclip::Union{Nothing, Symbol, <:Colorant} = nothing
sets a color for any value below the colorrange.highclip::Union{Nothing, Symbol, <:Colorant} = nothing
sets a color for any value above the colorrange.alpha = 1.0
sets the alpha value of the colormap or color attribute. Multiple alphas like inplot(alpha=0.2, color=(:red, 0.5)
, will get multiplied.
Generic attributes
visible::Bool = true
sets whether the plot will be rendered or not.overdraw::Bool = false
sets whether the plot will draw over other plots. This specifically means ignoring depth checks in GL backends.transparency::Bool = false
adjusts how the plot deals with transparency. In GLMakietransparency = true
results in using Order Independent Transparency.fxaa::Bool = true
adjusts whether the plot is rendered with fxaa (anti-aliasing).inspectable::Bool = true
sets whether this plot should be seen byDataInspector
.depth_shift::Float32 = 0f0
adjusts the depth value of a plot after all other transformations, i.e. in clip space, where0 <= depth <= 1
. This only applies to GLMakie and WGLMakie and can be used to adjust render order (like a tunable overdraw).model::Makie.Mat4f
sets a model matrix for the plot. This replaces adjustments made withtranslate!
,rotate!
andscale!
.space::Symbol = :data
sets the transformation space for box encompassing the volume plot. SeeMakie.spaces()
for possible inputs.
Examples
using GLMakie
vertices = [
0.0 0.0;
1.0 0.0;
1.0 1.0;
0.0 1.0;
]
faces = [
1 2 3;
3 4 1;
]
colors = [:red, :green, :blue, :orange]
scene = mesh(vertices, faces, color = colors, shading = false)
using FileIO
using GLMakie
brain = load(assetpath("brain.stl"))
mesh(
brain,
color = [tri[1][2] for tri in brain for i in 1:3],
colormap = Reverse(:Spectral),
figure = (resolution = (1000, 1000),)
)
Using GeometryBasics.Mesh and Buffer/Sampler type
We can also create a mesh, to specify normals, uv coordinates:
using GeometryBasics, LinearAlgebra, GLMakie, FileIO
# Create vertices for a Sphere
r = 0.5f0
n = 30
θ = LinRange(0, pi, n)
φ2 = LinRange(0, 2pi, 2 * n)
x2 = [r * cos(φv) * sin(θv) for θv in θ, φv in φ2]
y2 = [r * sin(φv) * sin(θv) for θv in θ, φv in φ2]
z2 = [r * cos(θv) for θv in θ, φv in 2φ2]
points = vec([Point3f(xv, yv, zv) for (xv, yv, zv) in zip(x2, y2, z2)])
# The coordinates form a matrix, so to connect neighboring vertices with a face
# we can just use the faces of a rectangle with the same dimension as the matrix:
faces = decompose(QuadFace{GLIndex}, Tesselation(Rect(0, 0, 1, 1), size(z2)))
# Normals of a centered sphere are easy, they're just the vertices normalized.
normals = normalize.(points)
# Now we generate UV coordinates, which map the image (texture) to the vertices.
# (0, 0) means lower left edge of the image, while (1, 1) means upper right corner.
function gen_uv(shift)
return vec(map(CartesianIndices(size(z2))) do ci
tup = ((ci[1], ci[2]) .- 1) ./ ((size(z2) .* shift) .- 1)
return Vec2f(reverse(tup))
end)
end
# We add some shift to demonstrate how UVs work:
uv = gen_uv(0.0)
# We can use a Buffer to update single elements in an array directly on the GPU
# with GLMakie. They work just like normal arrays, but forward any updates written to them directly to the GPU
uv_buff = Buffer(uv)
gb_mesh = GeometryBasics.Mesh(meta(points; uv=uv_buff, normals), faces)
f, ax, pl = mesh(gb_mesh, color = rand(100, 100), colormap=:blues)
wireframe!(ax, gb_mesh, color=(:black, 0.2), linewidth=2, transparency=true)
record(f, "uv_mesh.mp4", LinRange(0, 1, 100)) do shift
uv_buff[1:end] = gen_uv(shift)
end
The uv coordinates that go out of bounds will get repeated per default. One can use a Sampler
object to change that behaviour:
#=
Possible values:
:clamp_to_edge (default)
:mirrored_repeat
:repeat
=#
data = load(Makie.assetpath("earth.png"))
color = Sampler(rotl90(data'), x_repeat=:mirrored_repeat,y_repeat=:repeat)
f, ax, pl = mesh(gb_mesh, color = color)
wireframe!(ax, gb_mesh, color=(:black, 0.2), linewidth=2, transparency=true)
record(f, "uv_mesh_mirror.mp4", LinRange(0, 1, 100)) do shift
uv_buff[1:end] = gen_uv(shift)
end
These docs were autogenerated using Makie: v0.19.12, GLMakie: v0.8.12, CairoMakie: v0.10.12, WGLMakie: v0.8.16