Je suis nouveau dans la programmation JSL et Opengl et je m'interrogeais sur le fait de cacher des objets. Si, au départ, j'ai plusieurs sphères dans une scène, je souhaite que l'utilisateur puisse utiliser un curseur pour spécifier le nombre de sphères de la scène et le mettre à jour en conséquence. Existe-t-il un moyen de masquer ou de supprimer des objets?
La liste d’affichage n’a pas de logique propre (pour masquer / afficher); vous devez reconstruire les listes d’affichage pour montrer ce que vous voulez.
sphere = Scene Display List();
sphere << sphere( .15, 15, 15 );
spheres = Scene Display List();
makespheres = Function( {n},
spheres << clear;
For( i = 1, i < n, i++,
spheres << color( i / n, 1 - i / n, .9 ); // .1,.1,.1 = almost black .9,.9,.9 = almost white
spheres << pushmatrix;
spheres << translate( (i - (n / 2)) / 3, 0, 0 );
spheres << calllist( sphere );
spheres << popmatrix;
);
);
Scene = Scene Box( 600, 600 );
Scene << backgroundcolor( 0 ); // black=0, gray=1, white=2
Scene << showarcball( always );
nspheres = 14;
makespheres( nspheres );
New Window( "x",
Scene,
Slider Box(
1,
20,
nspheres,
makespheres( nspheres );
scene << update;
)
);
Scene << perspective( 45, .2, 20 );
Scene << Translate( 0.0, 0.0, -4.5 );
Scene << arcball( spheres, 1.5 );
Scene << update;
Le curseur contrôle le nombre de sphères
Ceci utilise plusieurs couches de listes d'affichage appelées. La plus petite liste, "sphere", ne contient qu'une seule sphère, mais peut contenir un objet plus compliqué. La liste "sphères" est la liste qui est reconstruite lorsque le curseur se déplace; maintenez-le aussi simple que possible afin que la boucle JSL ne doive pas travailler plus que nécessaire lorsque le curseur se déplace. "Spheres", à son tour, est appelé (via arcball) à partir de la liste d'affichage principale. Une autre chose à noter: les listes appelées ne conservent pas les traductions (etc.) locales de la liste appelée. Si une liste appelée traduit un objet et n'annule pas cette traduction, la traduction est toujours en vigueur lorsque la liste appelée est terminée. C'est pourquoi le pushmatrix et le popmatrix ont été utilisés.