rgl 随深度、深度感知而褪色

rgl fade with depth, depth perception

如何在 rgl 中显示 objects 更远的 fade-out 效果?

目前,给定 3D 散点图,R 的 rgl 包显示 objects 更远,尺寸更小。然而,我仍然发现很难感知 object 的深度,尤其是当绘制了很多点时。在下面的例子中,如果不旋转,很难看出哪个点在另一个点后面。

x <- 1:101
y <- rnorm(101, sd=15)
z <- x + rnorm(101, sd=15)
library(rgl)
plot3d(x,y,z, type='s')

但在下图中,很容易看出图片左边的点距离较远。如何在 rgl 中实现类似的效果?有一个 alpha 参数,但这不取决于每个点的深度。

如何为 alpha 生成一个新变量:

x <- 1:101
y <- rnorm(101, sd=5)
z <- x + rnorm(101, sd=15)
a <-11/(order(z) +10)
library(rgl)
plot3d(x, y, z, type = 's', 
       alpha = a)

您可能需要在 a <- 11/(order(z) + 10 中调整这些值以获得您喜欢的外观。

OpenGL 支持 "fog",并且 rgl 使您可以对其进行一些控制,尽管如何获得它并不完全清楚。但是,如果你在大多数功能之前 运行 它就有效:

r3dDefaults$material$fog <- TRUE
r3dDefaults$bg$fogtype <- "linear"

如果您希望显示器的某些部分淡出而其他部分不淡出,请使用 fog = FALSE 为非雾化部分设置 material。这通常是默认值。

雾类型的选择是c("none", "linear", "exp", "exp2")。使用线性雾,您的示例如下所示:

如果你想让雾只影响点,你可以这样做:

r3dDefaults$material$fog <- FALSE
r3dDefaults$bg$fogtype <- "linear"
plot3d(x, y, z, type = "s", fog = TRUE)

这是有效的,因为 material 属性只应用于数据,而不是轴。我觉得这个版本更好看,但你的口味可能会有所不同:

一个限制:目前 rglwidget() 生成的 WebGL 代码不支持雾。

编辑: 评论中指出调用 bgplot3d 会清除迷雾。这是 rgl 0.100.33 之前的版本中的错误,已从 0.100.34 开始修复。请参阅 获取它的位置。

编辑2:rgl的开发版本(目前为0.102.4)现在支持WebGL和R中的雾。显示有点不同对于 fogtype = "exp"fogtype = "exp2";我觉得它实际上更好看。