如何修复“rgl”包中错误的图像保存为矢量图形?

问题描述 投票:0回答:1

执行示例代码会产生有效的 .png 图像,但会产生不正确的 .pdf 和 .svg 图像。 3D 点是不可见的。这些点和椭球可能不相容。矢量图形中点的出现会破坏椭球体的表面。

if (requireNamespace("MASS", quietly = TRUE)) {
  Sigma <- matrix(c(10, 3, 0, 3, 2, 0, 0, 0, 1), 3, 3)
  Mean <- 1:3
  x <- MASS::mvrnorm(10, Mean, Sigma)
  library(rgl)
  open3d()
  plot3d(x, type="s", lit=FALSE, box = FALSE)
  ellipse <- ellipse3d(Sigma, centre = Mean)
  plot3d(ellipse , col = "darkcyan", alpha = 0.3, add = TRUE)
  shade3d(ellipse, col = "Gray90", alpha = 0.3, lit = FALSE)
  rgl.snapshot(filename = '3dellipse.png', fmt = 'png')
  rgl.postscript('3dellipse.pdf', fmt = 'pdf')
  # alternative way to svg file
  require(x3ptools)
  x3p_snapshot("3dellipse_x3p.svg")
}

将代码行更改为

plot3d(ellipse, col = "darkcyan", alpha = 0.3, add = TRUE, type="shade")

生成具有正确椭球体的 PDF 和 SVG 图像,但其中的点是不可见的。

生成的 .png 图像:

生成的 .pdf 或 .svg 图像:

r pdf svg rgl
1个回答
0
投票

rgl.postscript
的文档警告说,并非所有 OpenGL 功能都受支持,因此您不应该对并非所有功能都有效而感到惊讶。但是,您应该能够做得比 PDF 输出更好。在我看来,该图像似乎正在显示“z-fighting”:您在同一位置同时显示灰色椭球体和深青色椭球体,舍入误差意味着有时会显示一个,有时会显示另一个。

解决深度冲突的最简单方法是避免在同一位置显示两个东西。在你的代码中,你有

plot3d(ellipse , col = "darkcyan", alpha = 0.3, add = TRUE)
shade3d(ellipse, col = "Gray90", alpha = 0.3, lit = FALSE)

只包含其中一行,事情看起来应该会更好。另一种可能的解决方案是在其中一个显示器中使用不同的

polygon_offset
,以便深度测试不会发现任何关系。有关详细信息,请参阅
?material3d

您在一个显示器中看到 Z-fighting 而在另一个显示器中看不到的原因是

rgl.postscript
代码不支持 Alpha 透明度。如果您省略
alpha = 0.3
设置,您可能会在两个显示器中看到深度冲突。较新版本的 GL2PS 库可能会做得更好;
rgl
使用 7 年前的 GL2PS 1.4.0。

© www.soinside.com 2019 - 2024. All rights reserved.