<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aiden</title>
    <description>The latest articles on DEV Community by Aiden (@head_stone_f66beaf45231f9).</description>
    <link>https://dev.to/head_stone_f66beaf45231f9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3871781%2F2d221bae-6ae0-42ff-822e-30cb758dfd42.png</url>
      <title>DEV Community: Aiden</title>
      <link>https://dev.to/head_stone_f66beaf45231f9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/head_stone_f66beaf45231f9"/>
    <language>en</language>
    <item>
      <title>Demystifying 3D Graphics: I Built a Mini-Renderer in Python</title>
      <dc:creator>Aiden</dc:creator>
      <pubDate>Fri, 10 Apr 2026 12:43:16 +0000</pubDate>
      <link>https://dev.to/head_stone_f66beaf45231f9/demystifying-3d-graphics-i-built-a-mini-renderer-in-python-13ae</link>
      <guid>https://dev.to/head_stone_f66beaf45231f9/demystifying-3d-graphics-i-built-a-mini-renderer-in-python-13ae</guid>
      <description>&lt;p&gt;If you want to learn 3D graphics programming today, the learning curve is a cliff. You either spend months learning the intricacies of Vulkan/OpenGL in C++, or you use a massive engine like Unity where the actual graphics math is hidden behind a heavy user interface.&lt;/p&gt;

&lt;p&gt;I wanted something different. I wanted a way to write basic Python, understand the math from first principles, and get immediate visual feedback.&lt;/p&gt;

&lt;p&gt;So, I built Aiden3DRenderer, an open-source, real-time 3D function visualizer and GPU playground written in Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visualizing Math with One Function:&lt;/strong&gt;&lt;br&gt;
The core philosophy of the project is that you shouldn't need a graphics background to build a 3D scene. If you can write a loop in Python, you can render a 3D surface.&lt;/p&gt;

&lt;p&gt;Instead of messing with vertex buffers, you just write a function that returns a matrix of (x, y, z) tuples and use the &lt;code&gt;@register_shape&lt;/code&gt; decorator. Here is how easy it is to generate a 3D Gaussian Hill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiden3drenderer&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;register_shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Renderer3D&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderer_type&lt;/span&gt;

&lt;span class="nd"&gt;@register_shape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gaussian Hill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_animated&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;gaussian_hill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;half&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;grid_size&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid_size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;half&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid_size&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;half&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid_size&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;matrix&lt;/span&gt;

&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Renderer3D&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;renderer_type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POLYGON_FILL&lt;/span&gt;
&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Writing Your First Shader in 5 Minutes:&lt;/strong&gt;&lt;br&gt;
One of the most intimidating parts of graphics programming is shaders. I built a headline feature that lets you write a small GLSL compute shader, plug it right into a Python script, and run it without any heavy boilerplate.&lt;/p&gt;

&lt;p&gt;You just define your GLSL as a string:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight glsl"&gt;&lt;code&gt;&lt;span class="cp"&gt;#version 430
&lt;/span&gt;&lt;span class="k"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local_size_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;local_size_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std430&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;binding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="n"&gt;pixels&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;vec4&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gl_GlobalInvocationID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gl_GlobalInvocationID&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;uint&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And dispatch it directly from the Python engine using the CustomShader class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the Code:&lt;/strong&gt;&lt;br&gt;
Because the engine is built for education, the projection pipeline is implemented manually. You can read the source code and actually understand how 3D coordinates are mapped to a 2D screen. It also includes camera controls, OBJ loading, and a compact physics system.&lt;/p&gt;

&lt;p&gt;If you are learning, tinkering, or teaching 3D math, I would love for you to try it out. You can check out the source code, see the gallery of animations, and read the full documentation on GitHub here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AidenKielby" rel="noopener noreferrer"&gt;
        AidenKielby
      &lt;/a&gt; / &lt;a href="https://github.com/AidenKielby/Aiden3DRenderer" rel="noopener noreferrer"&gt;
        Aiden3DRenderer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A real-time 3D function visualizer with a plug-and-play GPU pipeline—write simple compute shaders to create custom effects without dealing with complex rendering internals.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://pepy.tech/projects/aiden3drenderer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/04b44bb07f89fcd0a5e66e36f4cec1eeca3b5df6d987dbe79fe00397c10ed565/68747470733a2f2f7374617469632e706570792e746563682f706572736f6e616c697a65642d62616467652f616964656e336472656e64657265723f706572696f643d746f74616c26756e6974733d494e5445524e4154494f4e414c5f53595354454d266c6566745f636f6c6f723d475241592672696768745f636f6c6f723d475245454e266c6566745f746578743d646f776e6c6f616473" alt="PyPI Downloads"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/aiden3drenderer/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/efce50d614844dfb75a8b7fd0cb88a53a09c1c1de05ba5f5c855cd5700db1640/68747470733a2f2f696d672e736869656c64732e696f2f707970692f762f616964656e336472656e64657265723f636f6c6f723d677265656e" alt="PyPI version"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/aiden3drenderer/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c7f457ff49791eace47d81524d144d58ff644d7abe1f29eb9c60059af35c022/68747470733a2f2f696d672e736869656c64732e696f2f707970692f707976657273696f6e732f616964656e336472656e6465726572" alt="Python Versions"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6aa0db5783572b549fb154cca4940fb7679c64bebb562bf34081c019e10b0a3a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f646d2f616964656e336472656e6465726572"&gt;&lt;img src="https://camo.githubusercontent.com/6aa0db5783572b549fb154cca4940fb7679c64bebb562bf34081c019e10b0a3a/68747470733a2f2f696d672e736869656c64732e696f2f707970692f646d2f616964656e336472656e6465726572" alt="Per Month"&gt;&lt;/a&gt;
&lt;a href="https://github.com/AidenKielby/3D-mesh-Renderer/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c54d92cfe508523d6070168e96d9c012446bc9bc14640e8cd4cd82f9c137433d/68747470733a2f2f696d672e736869656c64732e696f2f707970692f6c2f616964656e336472656e6465726572" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://pypi.org/project/aiden3drenderer/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/98f43abfe9223a52d08057797cdbc1c34db75a376f5364d6202c04bf1aacd145/68747470733a2f2f696d672e736869656c64732e696f2f707970692f7374617475732f616964656e336472656e6465726572" alt="PyPI status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/AidenKielby/3D-mesh-Renderer/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/062143b164695f7b32563bbd0e6cb00fe165f11f13012eef16dffdba900b8f24/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f416964656e4b69656c62792f33442d6d6573682d52656e64657265723f7374796c653d736f6369616c" alt="GitHub stars"&gt;&lt;/a&gt;
&lt;a href="https://github.com/AidenKielby/3D-mesh-Renderer/commits/main" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f81fbf0d44214d87fcbaa7b671ea817a2071724376845bc2b4f7cbfc318c76f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f416964656e4b69656c62792f33442d6d6573682d52656e6465726572" alt="Last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Aiden3DRenderer&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Interactive 3D playground for learning math, Python, and GPU shaders from first principles.&lt;/p&gt;

&lt;p&gt;No graphics background required. If you can write basic Python, you can build and understand 3D scenes here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If this project teaches you something useful, please give it a star. It helps a ton and keeps this passion project growing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;A quick note&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;I built this because I wanted 3D graphics to feel less "mystical" and more hands-on
So instead of hiding the pipeline behind a giant engine, this project keeps the core ideas visible: projection math, shape generation, shader logic, and simulation.&lt;/p&gt;
&lt;p&gt;If you are learning, tinkering, or teaching with this repo, that is exactly what it was made for.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Who is this for?&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Math/CS students&lt;/strong&gt; who want to visualize 3D functions by writing one Python function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python learners&lt;/strong&gt; who want a visual project with instant feedback instead of only terminal output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspiring graphics developers&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AidenKielby/Aiden3DRenderer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
