旋转时,来自rgl/persp3d的三维模型闪烁

旋转时,来自rgl/persp3d的三维模型闪烁,r,rgl,R,Rgl,用鼠标旋转myrgl模型时会闪烁(请注意模型底部的黑线,当旋转时它们会四处跳跃)。这是错误还是我的代码有问题 install.packages("rgl") library(rgl) x <- seq(-pi, pi, len = 10) y <- seq(-pi, pi, len = 10) f <- function(x, y) { r <- sqrt(x^2 + y^2); 10 * sin(r)/r } z <- outer(x, y, f) persp

用鼠标旋转my
rgl
模型时会闪烁(请注意模型底部的黑线,当旋转时它们会四处跳跃)。这是错误还是我的代码有问题

install.packages("rgl")
library(rgl)

x <- seq(-pi, pi, len = 10)
y <- seq(-pi, pi, len = 10)
f <- function(x, y) { r <- sqrt(x^2 + y^2); 10 * sin(r)/r }
z <- outer(x, y, f)

persp3d(x, y, z, col = "Red")
surface3d(x, y, z, back = "lines")
surface3d(x, y, z, front = "lines")

闪烁的常见原因是舍入错误:在同一位置对三个曲面进行了过量绘制,但使用了不同的方法来显示它们(“填充”、“默认值”和“线”。对
surface3d
的每次调用都会同时执行这两种操作。)使用不同的方法来计算每个像素的深度,有时一个在前面,有时另一个在前面,即使第一个曲面(红色的曲面)在任何情况下都应该获胜,除非您修改了
material3d(“深度测试”)

在rgl中,很难做到你想做的事情。可以使实体表面半透明,例如

persp3d(x, y, z, col = "red", alpha = 0.8)
surface3d(x, y, z, front = "lines", back = "lines")
但这并不完美。如果编写“着色器”,您可能会做得更好,但这很难,而且只有WebGL支持

如果您稍微移动线条表面并使用
深度测试
,您的特定示例的最佳显示可能会出现

persp3d(x, y, z, col = "red")
surface3d(x, y, z+0.01, front = "lines", back = "lines", depth_test = "lequal")
surface3d(x, y, z-0.01, front = "lines", back = "lines", depth_test = "lequal")

但是移位的数量和方向取决于您试图显示的内容,因此这并不总是容易实现。

我无法在Win10、R3.3.3、rgl 0.98.1上重现闪烁。@Axeman:谢谢!那么,代码示例似乎还可以。问题可能与macOS、X11或rgl中特定于macOS的代码有关。我试着在另一台Mac(Mini 2011)上运行相同的代码,但实际上闪烁更严重。此外,图中的两个象限是完全黑色的(这可能是另一个bug)。实际上,您的两个建议都消除了所有闪烁,可能除了一些可以忽略的线条。因此,闪烁是由覆盖/竞争相同区域引起的,因为命令是链接的。谢谢你指出这一点!
persp3d(x, y, z, col = "red")
surface3d(x, y, z+0.01, front = "lines", back = "lines", depth_test = "lequal")
surface3d(x, y, z-0.01, front = "lines", back = "lines", depth_test = "lequal")