使用rgl的surface3d绘制方形面时后两个面无法显示的问题
rgl包surface3d无法渲染最后两个面的问题排查
你的问题出在最后两段代码的z_3D矩阵构造上。rgl的surface3d要求z矩阵的每个元素对应x和y网格点的z值,当你构造z_3D <- matrix(c(min(C),max(C)),nrow = 2,ncol = 2)时,生成的矩阵是:
[,1] [,2] [1,] 0 1 [2,] 0 1
结合y_3D <- c(min(B),min(B))(即c(0,0)),最终生成的四个顶点是:
- (0, 0, 0)、(1, 0, 1)、(0, 0, 0)、(1, 0, 1)
这实际上是两个重复的点,构不成有效面,因此rgl不会渲染,且不会抛出错误。
修正方案
需要构造对应x和y网格的正确z矩阵,确保四个顶点不重复,能构成矩形面。对于垂直于y轴的面(y固定),z矩阵的每一行应该对应相同的z值,列对应x的取值:
修正后的最后两段代码如下:
# 绘制y=min(B)的面 x_3D <- c(min(A), max(A)) y_3D <- c(min(B), min(B)) z_3D <- matrix(c(min(C), min(C), max(C), max(C)), nrow = 2, ncol = 2) surface3d(x = x_3D, y = y_3D, z = z_3D) # 绘制y=max(B)的面 x_3D <- c(min(A), max(A)) y_3D <- c(max(B), max(B)) z_3D <- matrix(c(min(C), min(C), max(C), max(C)), nrow = 2, ncol = 2) surface3d(x = x_3D, y = y_3D, z = z_3D)
或者用byrow=TRUE让矩阵构造更直观:
z_3D <- matrix(c(min(C), min(C), max(C), max(C)), nrow = 2, ncol = 2, byrow = TRUE)
这样生成的z矩阵是:
[,1] [,2] [1,] 0 0 [2,] 1 1
对应的四个顶点为(0,0,0)、(1,0,0)、(0,0,1)、(1,0,1),能正常构成立方体的侧面。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

