2017-08-19 104 views
0

使用鼠标闪烁旋转我的rgl模型(注意模型底部的黑色线条,它在旋转时会四处跳跃)。这是我的代码错误或错误吗?从rgl/persp3d旋转时的3D模型在旋转时闪烁

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 

Flickers on the underside of the image

+0

我无法在Win10,R3.3.3,rgl 0.98.1上重现闪烁。 – Axeman

+0

@Axeman:谢谢!那么代码示例似乎没问题。该问题可能与macOS,X11或rgl中特定于macOS的代码有关。我尝试在另一台Mac(Mini 2011)上运行相同的代码,实际上闪烁更严重。此外,图中的两个象限完全是黑色的(这可能是另一个错误)。 – forthrin

回答

1

通常的原因为闪烁的舍入误差:你是在同一个地方overplotting三个面,但使用不同的方法来显示它们(“补“,缺省值和”lines“。您调用surface3d的每个函数都会这样做。)使用不同的方法计算每个像素的深度,并且有时一个出现在前面,有时是另一个出现,即使第一次冲浪王牌(红色)应该赢得每一种情况,除非你修改了material3d("depth_test")

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

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

但它并不完美。如果您编写“着色器”,您可能会做得更好,但这很难,并且仅在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") 

但是移位的数量和方向取决于您要显示的内容,所以这并不总是很容易实现。

+0

其实,你的建议都会消除所有的闪烁现象,也许除了几条微不足道的线条。所以闪烁是由覆盖/竞争相同区域引起的,因为这些命令是链接的。感谢您指出了这一点! – forthrin