Use 2d marker in Makie `meshscatter`

Hello !

I’m trying to display a large set of 3D points (about 80k) with GLMakie. Initially, I used meshscatter, unfortunately my PC doesn’t have a discrete GPU so I’m trying to reduce the stress on the iGPU by using scatter. The good thing is that this works well, but in a sense couldn’t I just use a meshscatter with marker=:circle ?

My experience says that this doesn’t work. I tried with the solution discussed in Using arbitrary polygons as markers in Makie.jl - #13 by yakir12, but this doesn’t handle the plotting of 2D objects in a 3D space.

Any ideas on how to proceed ?

Could you post a simple MWE to illustrate what exactly doesn’t work?

So for instance you can do

using GeometryBasics, GLMakie
points = rand(Point3f,1000)

# Does work
# Does not work

To make it as simple as possible, how can I reproduce the scatter output with meshscatter.

I tried adding a polygon as a marker like in the linked post above with e.g.

p = Polygon([Point3f0(0), Point3f0(1,0,0), Point3f0(0,1,0)]);

but that fails with

ERROR: MethodError: no method matching earcut_triangulate(::Vector{Vector{Point{3, Float32}}})

In meshscatter’s help it says:

 •  marker::Union{Symbol, GeometryBasics.GeometryPrimitive, GeometryBasics.Mesh} sets the scattered mesh.

so I tried:

meshscatter(points, marker=Sphere(Point3f(0,0,0), 0.2))

which results in:

Apparently, the default marker is a sphere, so you only need to specify the marker size to change it:

meshscatter(points, markersize=0.02)

Yes, I know this is the default, but in that regard scatter and meshscatter behave differently. While meshscatter plots a sphere, scatter plots a circle. I just want to know how to make meshscatter plot a circle as well.

I understand. But in the same way you can’t plot a sphere into a 2D axes, you can’t plot a 2D marker (a circle) into a 3D axis.

What exactly do you want it to look like…?

Well if so, how do you explain how scatter plots a circle then, even in 3D ?

Not the best answer I got, but: I think it doesn’t? If you rotate the plot around the marker is still round, like a sphere would behave.

Frankly, I would normally agree with you, but the marker field of a scatter plot remains by default a :circle, even in 3D axes like a LScene. Also, if you plot around 100k points, at least it’s roughly the threshold I have on my gear, scatter is definitely much faster than meshscatter so I do not think the objects are the same behind the curtains.

1 Like

Why do you want to use meshscatter with marker circle and not scatter? That’s the main question here, which I can’t see an answer for in the thread.
scatter is exactly faster, because it only draws 2d shapes, which is much easier then drawing 3D meshes, which is the only difference between meshscatter + scatter.
The only other difference is, that markerspace for meshscatter is always :data… I suppose then, that you want scatter(points; markerspace=:data)?

You can also try scatter(..., marker = Circle) which I think still uses a different algorithm on the gpu that might be faster than :circle

Btw, the fastest is scatter(...; marker=PixelMarker), but that only draws pixel like rects…

The thing is I do like the meshscatter result very much in general, and I have made recipes based on that. The only problem is performance on large datasets. So either I need to modify my recipes to call scatter or meshscatter based on some heuristic on the size of the data, or if it is possible, find a way to make scatter look like meshscatter, or the other way around.

Well, they’re different functions because they do something different - hence the performance difference… So you cant make them look alike!
Whats the look you’re aiming for anyways?

To speed up meshscatter, you can try to use a marker with less triangles though.
Try marker=Rect and see if that brings you to the desired framerate

I tried with other markers in meshscatter, but it did not feel much smoother in terms of framerate. I guess I’ll just implement the heuristic and switch to scatter for large datasets.