【问题标题】:rgl fade with depth, depth perceptionrgl 随深度褪色,深度感知
【发布时间】:2020-01-10 09:02:52
【问题描述】:

如何在 rgl 中使用淡出效果显示更远的对象?

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

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

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

【问题讨论】:

    标签: r rgl


    【解决方案1】:

    OpenGL 支持“雾”,rgl 可以让您对其进行一些控制,尽管如何获得它并不完全清楚。但是,如果您在大多数功能之前运行它,这将有效:

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

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

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

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

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

    这是可行的,因为材料属性仅适用于数据,而不适用于轴。我觉得这个版本看起来更好,但你的口味可能会有所不同:

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

    编辑: 在 cmets 中指出,调用 bgplot3d 可以清除迷雾。这是rgl 最高版本 0.100.33 中的错误,已在 0.100.34 中修复。请参阅 How do I install the latest version of rgl? 了解获取途径。

    编辑 2:rgl 的开发版本(当前为 0.102.4)现在支持 WebGL 和 R 中的雾。fogtype = "exp" 和 @987654337 的显示略有不同@;我认为它实际上看起来更好。

    【讨论】:

    • 谢谢,这就是我要找的:)
    • 如果我想在情节中加入标题,按照this post,我应该如何修改您的示例?一个简单的plot3d(..., fog=TRUE) 后跟bgplot3d({plot.new() }) 不存在雾
    • 看起来像一个错误。我认为您需要修复 bgplot3d 以允许它将 fogtype = "linear") 与它传递的其他参数一起传递给 bg3d
    【解决方案2】:

    如何为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 &lt;- 11/(order(z) + 10 中的这些值以获得您喜欢的外观。

    【讨论】:

    • 谢谢,但是当我旋转情节时它会起作用吗?
    猜你喜欢
    • 2016-08-21
    • 2012-08-23
    • 2016-08-06
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多