【问题标题】:How to draw to the full window in rgl?如何在rgl中绘制到整个窗口?
【发布时间】:2019-10-24 17:01:30
【问题描述】:

我正在将 rgl 中的 4 个子图绘制到一个窗口中,我希望它们填充可用空间:

library(rgl);
rgl::open3d(windowRect = c(0,50, 1200, 1200));
rgl::mfrow3d(2, 2);


rgl::next3d(reuse=FALSE);
rgl::bg3d("yellow");

rgl::next3d(reuse=FALSE);
rgl::bg3d("blue");

rgl::next3d(reuse=FALSE);
rgl::bg3d("red");

rgl::next3d(reuse=FALSE);
rgl::bg3d("green");

但是,结果只使用了窗口的一小部分,它看起来像这样:

如何让 4 个颜色区域跨越整个窗口,而不是只使用左下角的小部分?

【问题讨论】:

  • 观察;当我逐行运行代码时,它按预期执行,但将所有代码作为一个块运行,我得到与您相同的图像。在rgl::open3d() 行之后添加Sys.sleep(1) 允许代码作为一个块运行并具有正确的输出......所以
  • @user20650 谢谢,您的评论帮助我解决了这个问题。不过,在拨打rgl::mfrow3d() 之后,我也必须添加Sys.sleep(1)。您可以将其添加为答案以便我接受吗?
  • @user20650 嗯,等等。当再次运行相同的代码(等待)时,它停止工作。我现在无法让它再次工作,无论我多久运行一次工作的代码。也许我将不得不将此报告为错误或在邮件列表中询问。
  • 它对我来说反复有效,但它确实暗示了其他一些问题。是的,我认为 R 列表将是一个列出的好地方
  • 我找到了解决方案。这个想法来自this ML post from 2008 about an rgl bug。也许它从来没有修复过。

标签: r rgl


【解决方案1】:

它为我提供了几个小时的时间,但我终于设法让我自己可靠地工作。看来你必须在 open3d() 之后调用 par3d()。

还要注意对 Sys.sleep 的调用,正如上面 cmets 中的 user20650 所建议的那样。没有它,窗口只有在点击后才会以全尺寸绘制(在我的机器上?)。

完整的工作代码:

rgloptions = list("windowRect"=c(50,50,1000,1000));

rgl::open3d();
do.call(rgl::par3d, rgloptions);
Sys.sleep(1);
rgl::mfrow3d(2, 2);

rgl::next3d(reuse=FALSE);
rgl::bg3d("yellow");

rgl::next3d(reuse=FALSE);
rgl::bg3d("blue");

rgl::next3d(reuse=FALSE);
rgl::bg3d("red");

rgl::next3d(reuse=FALSE);
rgl::bg3d("green");

这会可靠地给出以下输出:

【讨论】:

  • 很好,您找到了解决方案的精神,但它确实表明您必须执行此操作的代码不太正确——尤其是睡眠。我确实认为你应该在 R-help 上发帖。 Duncan Murdoch,包的作者很积极,乐于助人。
  • 我也有这个想法。这个包似乎被使用了很多,虽然在一些官方包示例中甚至有Sys.sleep 调用,但正如我所发现的那样,需要这个感觉很奇怪。其他人应该已经抱怨过了。会的。
  • 问题是windowRect 设置不会立即传播到viewport 设置。一种解决方法是同时指定两者,例如rgl::open3d(windowRect = c(0,50, 1200, 1200), viewport = c(0,0,1200,1150))
  • 我想我也尝试过设置视口。这导致了一个图像,其中一个矩形填充了整个视口,并且它们被绘制在另一个之上。即,最后我得到了一个全绿屏。我稍后再检查。也许那个版本的代码有其他问题。
【解决方案2】:

我不确定这是否是您正在寻找的确切解决方案,但将您的代码作为函数运行对我来说很有效。

make_box <- function(){library(rgl)
 rgl::open3d(windowRect = c(0,50, 1200, 1200))
 rgl::mfrow3d(2, 2)


 rgl::next3d(reuse=FALSE)
 rgl::bg3d("yellow")

 rgl::next3d(reuse=FALSE)
 rgl::bg3d("blue")

 rgl::next3d(reuse=FALSE)
 rgl::bg3d("red")

 rgl::next3d(reuse=FALSE)
 rgl::bg3d("green")}
 make_box()

【讨论】:

  • 这对我来说没有什么不同,结果与不在函数中调用它相同。但是感谢您的尝试。显然原因是某种时间问题,可能是由窗口管理器引入的延迟或其他原因引起的。请参阅上面 user20650 的评论。
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多