2017-08-19 26 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:ありがとう!ですから、コード例はOKです。この問題は、macOS、X11、またはrglのmacOS固有のコードに関連する可能性があります。別のMac(Mini 2011)で同じコードを実行しようとしましたが、実際にはちらつきがより深刻でした。また、図の象限のうち2つは完全に黒色であった(別のバグかもしれない)。 – forthrin

答えて

1

ちらつきのための通常の理由は、エラーを丸めている:あなたは、同じ場所で3面をoverplotting、それらを表示するために、異なる方法を使用している(「塗りつぶしそれぞれのピクセルの深度を計算するためにさまざまな方法が使用されていますが、時には最初のサーフェスが前面に出てくることもあれば、もう1つのサーフェイスが最初に出てくることもあります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

関連する問題