planes3d expands and draws the area based on the sphere's radius

50 views Asked by At

The planes3d expands and draws the area based on the sphere's radius. Is there a way to suppress this? More desirable for me would be to clip the drawing area, though.

library(rgl)
z <- c(0,0,1)
y <- c(0,1,0)
x <- c(1,0,0)
bg3d(color = "white")
rgl.spheres(x, y, z, r = 0.02, color = "grey") 
planes3d(1, 0, 0, 0, col = 'blue', alpha = 0.6, size = 0)
planes3d(0, 1, 0, 0, col = 'red', alpha = 0.6, size = 0)
planes3d(0, 0, 1, 0, col = 'green', alpha = 0.6, size = 0)
view3d(theta=230, phi=-30, zoom=1, fov=0)
snapshot3d("r0_02.png", fmt="png", width=640, height=480, webshot=F)

clear3d()
rgl.spheres(x, y, z, r = 0.2, color = "grey") 
planes3d(1, 0, 0, 0, col = 'blue', alpha = 0.6, size = 0)
planes3d(0, 1, 0, 0, col = 'red', alpha = 0.6, size = 0)
planes3d(0, 0, 1, 0, col = 'green', alpha = 0.6, size = 0)
view3d(theta=230, phi=-30, zoom=1, fov=0)
snapshot3d("r0_2.png", fmt="png", width=640, height=480, webshot=F)

I'm expecting a workaround.

1

There are 1 answers

2
user2554330 On BEST ANSWER

You shouldn't be using planes3d(), which draws infinite planes, clipped to the bounding box.

There might be a workaround where you put the planes in one subscene and apply clipping there, and put the spheres in a different subscene with no clipping, but that would be tricky to implement.

A better approach is to use quads3d() instead of planes3d(). With your example, this would be

library(rgl)
z <- c(0,0,1)
y <- c(0,1,0)
x <- c(1,0,0)
corner1 <- c(1,1,2,2) # vector entry with corner of square
corner2 <- c(2,3,3,2) # other corner
bg3d(color = "white")
rgl.spheres(x, y, z, r = 0.2, color = "grey") 
# planes3d(1, 0, 0, 0, col = 'blue', alpha = 0.6, size = 0)
quads3d(cbind(0, y[corner1], z[corner2]),
        col = "blue", alpha = 0.6)
#planes3d(0, 1, 0, 0, col = 'red', alpha = 0.6, size = 0)
quads3d(cbind(x[corner1], 0, z[corner2]), 
        col = 'red', alpha = 0.6)
#planes3d(0, 0, 1, 0, col = 'green', alpha = 0.6, size = 0)
quads3d(cbind(x[corner1], y[corner2], 0), 
        col = 'green', alpha = 0.6)
view3d(theta=230, phi=-30, zoom=1, fov=0)

Created on 2024-01-11 with reprex v2.0.2

In an earlier version of this answer, the spheres showed weird black blobs on the edges. That was due to a bug in rgl that has been fixed. This image was drawn with the development version 1.2.10.