Soy nuevo en la programación JSL y en Opengl y me preguntaba cómo ocultar objetos. Si inicialmente tengo varias esferas en una escena, quiero que el usuario pueda usar un control deslizante para especificar el número de esferas en la escena y actualizarlo en consecuencia. ¿Hay alguna manera de ocultar o eliminar objetos?
La lista de visualización no tiene ninguna lógica propia (para ocultar / mostrar); necesitas reconstruir las listas de visualización para mostrar lo que quieres.
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;
Control deslizante número de esferas
Esto utiliza varias capas de listas de visualización llamadas. La lista más pequeña, "esfera", solo contiene una única esfera, pero puede contener un objeto más complicado. La lista de "esferas" es la lista que se reconstruye cuando el control deslizante se mueve; manténgalo tan simple como sea razonable para que el bucle JSL no tenga que trabajar más de lo necesario cuando se mueve el control deslizante. "Esferas", a su vez, se llama (a través de arcball) desde la lista de visualización principal. Otra cosa a tener en cuenta: las listas de llamadas no mantienen las traducciones (etc.) locales a la lista de llamadas. Si una lista llamada traduce un objeto y no deshace esa traducción, la traducción sigue vigente cuando se realiza la lista llamada. Es por eso que se utilizaron pushmatrix y popmatrix.