如何抑制rgl中planes3d随球体半径扩展绘图区域并实现裁剪?
解决rgl中planes3d随球体半径扩展的问题
方法1:手动固定绘图范围
rgl默认会根据所有绘制对象(包括球体的完整半径范围)自动调整绘图边界。要避免平面随球体半径扩展,可先绘制平面,再绘制球体,最后手动固定显示范围,或直接用xlim/ylim/zlim约束坐标区间。
修改后的代码示例:
library(rgl) z <- c(0,0,1) y <- c(0,1,0) x <- c(1,0,0) bg3d(color = "white") # 先绘制平面 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) # 绘制球体 rgl.spheres(x, y, z, r = 0.2, color = "grey") # 手动固定坐标范围,限制在0到1之间 par3d(xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1)) view3d(theta=230, phi=-30, zoom=1, fov=0) snapshot3d("r0_2_fixed.png", fmt="png", width=640, height=480, webshot=F)
方法2:使用裁剪功能限制显示区域
如果需要更灵活的区域控制,可通过clip3d()函数定义裁剪边界,只保留指定范围内的内容:
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.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) # 设置裁剪范围,保留x∈[0,1]、y∈[0,1]、z∈[0,1]的区域 clip3d( xmin = 0, xmax = 1, ymin = 0, ymax = 1, zmin = 0, zmax = 1, draw = TRUE ) view3d(theta=230, phi=-30, zoom=1, fov=0) snapshot3d("r0_2_clipped.png", fmt="png", width=640, height=480, webshot=F)
关键说明
- 先绘制平面再设置范围,可避免球体半径干扰平面的显示边界;
par3d()的坐标范围约束是全局生效的,超出范围的对象会被直接截断;clip3d()支持自定义裁剪平面,适合更复杂的区域控制场景。
内容的提问来源于stack exchange,提问作者大根おろし
相关产品推荐
相关产品推荐

