将 mesh3d material 更改为 RGL 中的线

Changing mesh3d material to lines in RGL

刚刚注意到我无法再通过更改对象内的 materials 列表来创建将 cube3d() material 更改为线。不过,这仍然适用于颜色。下面的代码片段用于创建一个实心的绿色立方体,然后在更改 3 个参数后,一个立方体的蓝色轮廓。

当我用 'shapelist3d()' 绘制许多对象并想勾勒出其中一些对象时,我会使用此功能。有没有一种新方法可以选择性地更改某些对象 materials?

使用 rgl v0.107.14 和 R 4.1.1,但也注意到以前的版本。

library(rgl)

cb <- cube3d(col = "green") #Solid green cube

rgl::shapelist3d(list(cb))

cb$material$color <- "blue"
cb$material$front <- "line"
cb$material$back <- "line"

rgl::shapelist3d(list(cb)) #Solid blue cube, but should be wire

reprex package (v2.0.1)

于 2021-09-06 创建

这看起来像是 shade3d 中的错误,由 shapelist3d 调用。

有 3 种方法可以指定一个形状应该画成轮廓:

  • 作为 material 属性(您使用的)
  • 作为 shade3d 的参数
  • 通过调用 wire3d 而不是 shade3d

不幸的是,假设使用第三种方法:shade3d 被调用时没有参数,但它忽略了 material 属性.

对此有几个解决方法。您可以将轮廓对象保存在单独的列表中,然后调用 lapply(outlinelist, wire3d) 将它们绘制成轮廓。或者您可以自己编写 shade3d 的替代品来修复错误,例如

myshade3d <- function(x, front = "filled", back = "filled", ...) {
  if (!is.null(x$material$front)) front <- x$material$front
  if (!is.null(x$material$back)) back <- x$material$back
  rgl::shade3d(x, front = front, back = back, ...)
}

然后将其命名为 lapply(fulllist, myshade3d)

编辑添加:此错误现已在开发版本中修复,可安装(如果您有先决条件!)as

remotes::install_github("dmurdoch/rgl")