There's a hole in a sphere generated by makie.surface

Take a look at this Eye !!!

Unlike mesh(spheremesh) method, current surface(x,y,z) method leaves a circular hole at the north pole of the ball, see:

and sometimes leave an 1. circular hole / 2. irregular hole composed of several black triangular faces at the south pole as well, see:

  1. How to Create a 3D-Transparent Cylinder with GLMakie or Plots if possible?
  2. Drawing an ellipsoid to visualize a tensor - #11 by AndiMD

a MWE would be

# https://discourse.julialang.org/t/how-to-get-a-semi-transparent-sphere-in-makie/117944/2?u=xczphysics

using Colors, GeometryBasics #versions 0.10.5, 0.12.11, 0.9.20
using GLMakie
GLMakie.activate!()
# A sphere
n = 13

function gan_sphere_points(num, Θ_L, Θ_R)
    r = 1.0f0
    Θ = range(Θ_L, Θ_R, num)
    Φ = range(-π, π, num)
    x = [r * sin(θ) * cos(ϕ) for ϕ in Φ, θ in Θ]  # 这里的 ϕ,θ 顺序会影响 可否穿透球表面获取位置
    y = [r * sin(θ) * sin(ϕ) for ϕ in Φ, θ in Θ]
    z = [r * cos(θ) for ϕ in Φ, θ in Θ]

    # return [x, y, z]

    # 应用旋转变换
    rotation_angle = -π/3  # 45度
    rotation_matrix = [cos(rotation_angle) 0 -sin(rotation_angle);
                    0                  1 0;
                    sin(rotation_angle) 0 cos(rotation_angle)]

    x_rotated = rotation_matrix[1,1] .* x + rotation_matrix[1,3] .* z
    y_rotated = y
    z_rotated = rotation_matrix[3,1] .* x + rotation_matrix[3,3] .* z

    return [x_rotated, y_rotated, z_rotated]
end

sphere_points = gan_sphere_points(n, 0, π)
fig, ax, p = GLMakie.surface(sphere_points...,
    color=sphere_points[3], invert_normals=true, transparency=true)

fig

If your ultimate goal is to simply show a Sphere or Ellipsoid after rotations, take a look at Meshes.jl. In particular, you can

using Meshes
import GLMakie as Mke

ellipsoid = Ellipsoid(...)

viz(ellipsoid)

You can further rotate the ellipsoid with the Rotate transform:

ellipsoid |> Rotate(...) |> viz

You need both triangles and quadrangles to properly discretize the sphere/ellipsoid. The Makie.surface displays meshes that are made of quadrangles.

1 Like

Thanks for your kind hint! During my testing,

this rotates correctly:

using Meshes, Rotations, GLMakie
Ellipsoid((3., 2., 1.), (0., 0., 0.), RotXYZ(π/4, π/5, π/3)) |> viz

but the following doesn’t even rotate:

using Meshes, Rotations, GLMakie
Ellipsoid((3., 2., 1.)) |> Rotate(RotXYZ(π/4, π/5, π/3)) |> viz

for what? args works, while the operator fails to work…

Can you please try to call discretize before viz? This will force the discretization of the Ellipsoid into a mesh. If it works, then this is an issue on our side. I am far from my computer now.

1 Like

it works :slight_smile: :slight_smile:

using Meshes, Rotations, GLMakie
discretize(Ellipsoid((3., 2., 1.)), RegularDiscretization(10,10)) |> Rotate(RotXYZ(π/4, π/5, π/3)) |> viz

and the kwarg color = 1:nelements(mesh) of the method viz seems to need discretize(mesh) first too:

using Meshes, Rotations, GLMakie
ellipsoid = Ellipsoid((3., 2., 1.), (0., 0., 0.), RotXYZ(π/4, π/5, π/3))
ellipsoid = discretize(ellipsoid, RegularDiscretization(10,10))
viz(ellipsoid, color = 1:nelements(ellipsoid), showsegments = true)

1 Like

Fyi, starting/ending the polar angles at a small delta from the poles (instead of the 0 and pi endpoints) allows us to fill the holes as much as we like.

δ = 1e-6
sphere_points = gan_sphere_points(n, δ, π-δ)

Of course we also need to increase n to make the sphere smooth and round.

1 Like

Nice that it works. So the Rotate doesn’t change the visualization? Mind opening an issue in Meshes.jl so that we can take a look over the week?

1 Like

OOObservant :eyes: and SSSmart :brain: !!!

Compared to the x,y coordinate of the eye’s pupil always = 0,0 (when the sphere is not rotated), I had also found the x,y coordinate of the “ass” → 0,0 but mostly ≠ 0,0 may be the reason why the “ass” sew itself, but never took a closer look into it…

Thanks bro, this is a beautiful shortcut.
The solution to this problem should be gifted to you.

Glad it helped. I am not sure if I totally followed your description, but as Émile Zola once said, the celestial sphere and the ass are two great levers.

2 Likes