.. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_tutorials_01_introductory_viz_spiky.py: =============== Spiky Sphere =============== In this tutorial, we show how to create a sphere with spikes. .. code-block:: default import numpy as np from fury import window, actor, utils, primitive import itertools Create a sphere actor. Define the center, radius and color of a sphere. The sphere actor is made of points (vertices) evenly distributing on a sphere. Let's create a scene. .. code-block:: default scene = window.Scene() The vertices are connected with triangles in order to specify the direction of the surface normal. ``prim_sphere`` provites a sphere with evenly distributed points .. code-block:: default vertices, triangles = primitive.prim_sphere(name='symmetric362', gen_faces=False) To be able to visualize the vertices, let's define a point actor with green color. .. code-block:: default point_actor = actor.point(vertices, point_radius=0.01, colors=(0, 1, 0)) Normals are the vectors that are perpendicular to the surface at each vertex. We specify the normals at the vertices to tell the system whether triangles represent curved surfaces. .. code-block:: default normals = utils.normals_from_v_f(vertices, triangles) The normals are usually used to calculate how the light will bounce on the surface of an object. However, here we will use them to direct the spikes (represented with arrows). So, let's create an arrow actor at the center of each vertex. .. code-block:: default arrow_actor = actor.arrow(centers=vertices, directions=normals, colors=(1, 0, 0), heights=0.2, resolution=10, vertices=None, faces=None) To be able to visualize the surface of the primitive sphere, we use ``get_actor_from_primitive``. .. code-block:: default primitive_colors = np.zeros(vertices.shape) primitive_colors[:, 2] = 180 primitive_actor = utils.get_actor_from_primitive( vertices=vertices, triangles=triangles, colors=primitive_colors, normals=normals, backface_culling=True) We add all actors (visual objects) defined above to the scene. .. code-block:: default scene.add(point_actor) scene.add(arrow_actor) scene.add(primitive_actor) scene.add(actor.axes()) The ShowManager class is the interface between the scene, the window and the interactor. .. code-block:: default showm = window.ShowManager(scene, size=(900, 768), reset_camera=False, order_transparent=True) We want to make a small animation for fun! We can determine the duration of animation with using the ``counter``. Use itertools to avoid global variables. .. code-block:: default counter = itertools.count() The timer will call this user defined callback every 200 milliseconds. The application will exit after the callback has been called 20 times. .. code-block:: default def timer_callback(_obj, _event): cnt = next(counter) showm.scene.azimuth(0.05 * cnt) primitive_actor.GetProperty().SetOpacity(cnt/10.) showm.render() if cnt == 20: showm.exit() showm.initialize() showm.add_timer_callback(True, 200, timer_callback) showm.start() window.record(showm.scene, size=(900, 768), out_path="viz_spiky.png") .. image:: /auto_tutorials/01_introductory/images/sphx_glr_viz_spiky_001.png :class: sphx-glr-single-img Instead of arrows, you can choose other geometrical objects such as cones, cubes or spheres. .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 4.404 seconds) .. _sphx_glr_download_auto_tutorials_01_introductory_viz_spiky.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download :download:`Download Python source code: viz_spiky.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: viz_spiky.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_