来自 rgl/persp3d 的 3D 模型在旋转时闪烁

3D model from rgl/persp3d flickers when rotating

用鼠标闪烁旋转我的 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")

我的环境

R version 3.4.1 (2017-06-30)
Platform: x86_64-apple-darwin16.7.0 (64-bit)
Running under: macOS Sierra 10.12.6
rgl_0.98.1

闪烁的通常原因是舍入误差:您在同一个地方重叠绘制三个表面,但使用不同的方法来显示它们("fill",默认值和 "lines"。每个你对 surface3d 的调用两者都做。)不同的方法被用来计算每个像素的深度,有时一个出现在前面,有时另一个出现,即使第一个表面(红色的)应该赢在任何情况下,除非您修改了 material3d("depth_test").

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

persp3d(x, y, z, col = "red", alpha = 0.8)
surface3d(x, y, z, front = "lines", back = "lines")

但这并不完美。如果您编写 "shader",您可能会做得更好,但这很难,并且仅在 WebGL 中受支持。

如果您稍微移动线条表面并使用 depth_test,例如

,您的特定示例的最佳显示可能会出现
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")

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