2017-08-19 101 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