{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Draw 3D rotating Cube\n\nThis example shows how to display 3D objects.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\nfrom vispy import app, gloo\nfrom vispy.util.transforms import perspective, translate, rotate\n\nvert = \"\"\"\n// Uniforms\n// ------------------------------------\nuniform mat4 u_model;\nuniform mat4 u_view;\nuniform mat4 u_projection;\nuniform vec4 u_color;\n\n// Attributes\n// ------------------------------------\nattribute vec3 a_position;\nattribute vec4 a_color;\nattribute vec3 a_normal;\n\n// Varying\n// ------------------------------------\nvarying vec4 v_color;\n\nvoid main()\n{\n v_color = a_color * u_color;\n gl_Position = u_projection * u_view * u_model * vec4(a_position,1.0);\n}\n\"\"\"\n\n\nfrag = \"\"\"\n// Varying\n// ------------------------------------\nvarying vec4 v_color;\n\nvoid main()\n{\n gl_FragColor = v_color;\n}\n\"\"\"\n\n\n# -----------------------------------------------------------------------------\ndef cube():\n \"\"\"\n Build vertices for a colored cube.\n\n V is the vertices\n I1 is the indices for a filled cube (use with GL_TRIANGLES)\n I2 is the indices for an outline cube (use with GL_LINES)\n \"\"\"\n vtype = [('a_position', np.float32, 3),\n ('a_normal', np.float32, 3),\n ('a_color', np.float32, 4)]\n # Vertices positions\n v = [[1, 1, 1], [-1, 1, 1], [-1, -1, 1], [1, -1, 1],\n [1, -1, -1], [1, 1, -1], [-1, 1, -1], [-1, -1, -1]]\n # Face Normals\n n = [[0, 0, 1], [1, 0, 0], [0, 1, 0],\n [-1, 0, 0], [0, -1, 0], [0, 0, -1]]\n # Vertice colors\n c = [[0, 1, 1, 1], [0, 0, 1, 1], [0, 0, 0, 1], [0, 1, 0, 1],\n [1, 1, 0, 1], [1, 1, 1, 1], [1, 0, 1, 1], [1, 0, 0, 1]]\n\n V = np.array([(v[0], n[0], c[0]), (v[1], n[0], c[1]),\n (v[2], n[0], c[2]), (v[3], n[0], c[3]),\n (v[0], n[1], c[0]), (v[3], n[1], c[3]),\n (v[4], n[1], c[4]), (v[5], n[1], c[5]),\n (v[0], n[2], c[0]), (v[5], n[2], c[5]),\n (v[6], n[2], c[6]), (v[1], n[2], c[1]),\n (v[1], n[3], c[1]), (v[6], n[3], c[6]),\n (v[7], n[3], c[7]), (v[2], n[3], c[2]),\n (v[7], n[4], c[7]), (v[4], n[4], c[4]),\n (v[3], n[4], c[3]), (v[2], n[4], c[2]),\n (v[4], n[5], c[4]), (v[7], n[5], c[7]),\n (v[6], n[5], c[6]), (v[5], n[5], c[5])],\n dtype=vtype)\n I1 = np.resize(np.array([0, 1, 2, 0, 2, 3], dtype=np.uint32), 6 * (2 * 3))\n I1 += np.repeat(4 * np.arange(2 * 3, dtype=np.uint32), 6)\n\n I2 = np.resize(\n np.array([0, 1, 1, 2, 2, 3, 3, 0], dtype=np.uint32), 6 * (2 * 4))\n I2 += np.repeat(4 * np.arange(6, dtype=np.uint32), 8)\n\n return V, I1, I2\n\n\n# -----------------------------------------------------------------------------\nclass Canvas(app.Canvas):\n\n def __init__(self):\n app.Canvas.__init__(self, keys='interactive', size=(800, 600))\n\n self.vertices, self.filled, self.outline = cube()\n self.filled_buf = gloo.IndexBuffer(self.filled)\n self.outline_buf = gloo.IndexBuffer(self.outline)\n\n self.program = gloo.Program(vert, frag)\n self.program.bind(gloo.VertexBuffer(self.vertices))\n\n self.view = translate((0, 0, -5))\n self.model = np.eye(4, dtype=np.float32)\n\n gloo.set_viewport(0, 0, self.physical_size[0], self.physical_size[1])\n self.projection = perspective(45.0, self.size[0] /\n float(self.size[1]), 2.0, 10.0)\n\n self.program['u_projection'] = self.projection\n\n self.program['u_model'] = self.model\n self.program['u_view'] = self.view\n\n self.theta = 0\n self.phi = 0\n\n gloo.set_clear_color('white')\n gloo.set_state('opaque')\n gloo.set_polygon_offset(1, 1)\n\n self._timer = app.Timer('auto', connect=self.on_timer, start=True)\n\n self.show()\n\n # ---------------------------------\n def on_timer(self, event):\n self.theta += .5\n self.phi += .5\n self.model = np.dot(rotate(self.theta, (0, 1, 0)),\n rotate(self.phi, (0, 0, 1)))\n self.program['u_model'] = self.model\n self.update()\n\n # ---------------------------------\n def on_resize(self, event):\n gloo.set_viewport(0, 0, event.physical_size[0], event.physical_size[1])\n self.projection = perspective(45.0, event.size[0] /\n float(event.size[1]), 2.0, 10.0)\n self.program['u_projection'] = self.projection\n\n # ---------------------------------\n def on_draw(self, event):\n gloo.clear()\n\n # Filled cube\n\n gloo.set_state(blend=False, depth_test=True, polygon_offset_fill=True)\n self.program['u_color'] = 1, 1, 1, 1\n self.program.draw('triangles', self.filled_buf)\n\n # Outline\n gloo.set_state(blend=True, depth_test=True, polygon_offset_fill=False)\n gloo.set_depth_mask(False)\n self.program['u_color'] = 0, 0, 0, 1\n self.program.draw('lines', self.outline_buf)\n gloo.set_depth_mask(True)\n\n\n# -----------------------------------------------------------------------------\nif __name__ == '__main__':\n canvas = Canvas()\n app.run()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 0 }