执行示例代码会产生有效的 .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 图像,但其中的点是不可见的。
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。