2017-08-19 5 views
0

Rotation de mon modèle rgl avec le scintillement de la souris (remarquez les lignes noires sur le fond du modèle, qui sautent follement autour lors de la rotation). Est-ce un bug ou quelque chose de mal avec mon code?Modèle 3D de scintillement/persp3d scintille lors de la rotation

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") 

Mon environnement

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

Je ne peux pas reproduire le scintillement sur Win10, R3.3.3, rgl 0.98.1. – Axeman

+0

@Axeman: Merci! Donc, l'exemple de code semble OK, alors. Le problème peut être lié à macOS, X11 ou au code spécifique à macOS dans rgl. J'ai essayé d'exécuter le même code sur un autre Mac (Mini 2011), et le scintillement était plus sévère, en fait. De plus, deux des quadrants de la figure étaient complètement noirs (ce qui peut être un autre bug). – forthrin

Répondre

1

La raison habituelle pour vacillante est une erreur d'arrondi: vous overplotting trois surfaces au même endroit, mais en utilisant des méthodes différentes pour les afficher ("remplir ", la valeur par défaut, et" lignes "Chacun de vos appels à surface3d fait les deux.) Différentes méthodes sont utilisées pour calculer la profondeur de chaque pixel, et parfois un sort à l'avant, parfois l'autre, même si le premier surf As (le rouge) aurait dû gagner dans tous les cas, sauf si vous avez modifié material3d("depth_test").

Il est difficile de faire ce que vous essayez de faire. Vous pouvez rendre la surface solide semi-transparente, par ex.

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

mais ce n'est pas parfait. Vous pouvez probablement faire mieux si vous écrivez un "shader", mais c'est dur, et est seulement supporté dans WebGL.

Le meilleur affichage pour votre exemple particulier vient probablement si vous décalez légèrement la surface des lignes et jouez avec le depth_test, par ex.

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") 

mais la quantité et la direction du décalage dépendent de ce que vous essayez d'afficher, donc ce n'est pas toujours facile à réaliser.

+0

En fait, vos deux suggestions suppriment tout scintillement, peut-être à l'exception de quelques lignes négligeables. Ainsi, le scintillement est causé par l'écrasement/la concurrence pour les mêmes zones parce que les commandes sont chaînées. Merci de l'avoir signalé! – forthrin