<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 3d - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 3d - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 22:21:08 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/3d/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Three.js Tutorial – How to Render 3D Objects in the Browser ]]>
                </title>
                <description>
                    <![CDATA[ If you have ever wanted to build a game with JavaScript, you might have come across Three.js.  Three.js is a library that we can use to render 3D graphics in the browser. The whole thing is in JavaScript, so with some logic you can add animation, int... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/render-3d-objects-in-browser-drawing-a-box-with-threejs/</link>
                <guid isPermaLink="false">66c4c8174173ed342943d0c2</guid>
                
                    <category>
                        <![CDATA[ 3d ]]>
                    </category>
                
                    <category>
                        <![CDATA[ #Game Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Game Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ three.js ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Hunor Márton Borbély ]]>
                </dc:creator>
                <pubDate>Wed, 03 Feb 2021 23:06:37 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/02/Stack.002-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you have ever wanted to build a game with JavaScript, you might have come across Three.js. </p>
<p>Three.js is a library that we can use to render 3D graphics in the browser. The whole thing is in JavaScript, so with some logic you can add animation, interaction, or even turn it into a game. </p>
<p>In this tutorial, we will go through a very simple example. We'll render a 3D box, and while doing so we'll learn the fundamentals of Three.js. </p>
<p>Three.js uses WebGL under the hood to render 3D graphics. We could use plain WebGL, but it's very complex and rather low level. On the other hand, Three.js is like playing with Legos. </p>
<p>In this article, we'll go through how to place a 3D object in a scene, set up the lighting and a camera, and render the scene on a canvas. So let’s see how we can do all this.</p>
<h2 id="heading-define-the-scene-object">Define the Scene Object</h2>
<p>First, we have to define a scene. This will be a container where we place our 3D objects and lights. The scene object also has some properties, like the background color. Setting that is optional though. If we don't set it, the default will be black.</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> THREE <span class="hljs-keyword">from</span> <span class="hljs-string">"three"</span>;

<span class="hljs-keyword">const</span> scene = <span class="hljs-keyword">new</span> THREE.Scene();
scene.background = <span class="hljs-keyword">new</span> THREE.Color(<span class="hljs-number">0x000000</span>); <span class="hljs-comment">// Optional, black is default</span>

...
</code></pre>
<h2 id="heading-geometry-material-mesh">Geometry + Material = Mesh</h2>
<p>Then we add our 3D box to the scene as a mesh. A mesh is a combination of a geometry and a material.</p>
<pre><code class="lang-js">...

<span class="hljs-comment">// Add a cube to the scene</span>
<span class="hljs-keyword">const</span> geometry = <span class="hljs-keyword">new</span> THREE.BoxGeometry(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">3</span>); <span class="hljs-comment">// width, height, depth</span>
<span class="hljs-keyword">const</span> material = <span class="hljs-keyword">new</span> THREE.MeshLambertMaterial({ <span class="hljs-attr">color</span>: <span class="hljs-number">0xfb8e00</span> });
<span class="hljs-keyword">const</span> mesh = <span class="hljs-keyword">new</span> THREE.Mesh(geometry, material);
mesh.position.set(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// Optional, 0,0,0 is the default</span>
scene.add(mesh);

...
</code></pre>
<h3 id="heading-what-is-a-geometry">What is a Geometry?</h3>
<p>A geometry is a rendered shape that we’re building - like a box. A geometry can be build from vertices or we can use a predefined one. </p>
<p>The BoxGeometry is the most basic predefined option. We only have to set the width, height, and depth of the box and that’s it. </p>
<p>You might think that we can't get far by defining boxes, but many games with minimalistic design use only a combination of boxes. </p>
<p>There are other predefined geometries as well. We can easily define a plane, a cylinder, a sphere, or even an icosahedron.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/freecodecamp-4.001.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-work-with-material">How to Work with Material</h3>
<p>Then we define a material. A material describes the appearance of an object. Here we can define things like texture, color, or opacity. </p>
<p>In this example we are only going to set a color. There are still different options for materials. The main difference between most of them is how they react to light. </p>
<p>The simplest one is the MeshBasicMaterial. This material doesn't care about light at all, and each side will have the same color. It might not be the best option, though, as you can’t see the edges of the box.</p>
<p>The simplest material that cares about light is the MeshLambertMaterial. This will calculate the color of each vertex, which is practically each side. But it doesn't go beyond that.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/freecodecamp-4.002.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you need more precision, there are more advanced materials. The MeshPhongMaterial not only calculates the color by vertex but by each pixel. The color can change within a side. This can help with realism but also costs in performance. </p>
<p>It also depends on the light settings and the geometry if it has any real effect. If we render boxes and use directional light, the result won't change that much. But if we render a sphere, the difference is more obvious.</p>
<h3 id="heading-how-to-position-a-mesh">How to Position a Mesh</h3>
<p>Once we have a mesh we can also position it within the scene and set a rotation by each axis. Later if we want to animate objects in the 3D space we will mostly adjust these values. </p>
<p>For positioning we use the same units that we used for setting the size. It doesn't matter if you are using small numbers or big numbers, you just need to be consistent in your own world. </p>
<p>For the rotation we set the values in radians. So if you have your values in degrees you have to divide them by 180° then multiply by PI.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/freecodecamp-3.004.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-add-light">How to Add Light</h2>
<p>Then let's add lights. A mesh with basic material doesn’t need any light, as the mesh will have the set color regardless of the light settings. </p>
<p>But the Lambert material and Phong material require light. If there isn't any light, the mesh will remain in darkness.</p>
<pre><code class="lang-js">...

<span class="hljs-comment">// Set up lights</span>
<span class="hljs-keyword">const</span> ambientLight = <span class="hljs-keyword">new</span> THREE.AmbientLight(<span class="hljs-number">0xffffff</span>, <span class="hljs-number">0.6</span>);
scene.add(ambientLight);

...
</code></pre>
<p>We'll add two lights - an ambient light and a directional light. </p>
<p>First, we add the ambient light. The ambient light is shining from every direction, giving a base color for our geometry. </p>
<p>To set an ambient light we set a color and an intensity. The color is usually white, but you can set any color. The intensity is a number between 0 and 1. The two lights we define work in an accumulative way so in this case we want the intensity to be around 0.5 for each.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/freecodecamp-3.003.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The directional light has a similar setup, but it also has a position. The word position here is a bit misleading, because it doesn’t mean that the light is coming from an exact position. </p>
<p>The directional light is shining from very far away with many parallel light rays all having a fixed angle. But instead of defining angles, we define the direction of a single light ray. </p>
<p>In this case, it shines from the direction of the 10,20,0 position towards the 0,0,0 coordinate. But of course, the directional light is not only one light ray, but an infinite amount of parallel rays. </p>
<p>Think of it as the sun. On a smaller scale, light rays of the sun also come down in parallel, and the sun’s position isn't what matters but rather its direction. </p>
<p>And that’s what the directional light is doing. It shines on everything with parallel light rays from very far away.</p>
<pre><code class="lang-js">...

const dirLight = <span class="hljs-keyword">new</span> THREE.DirectionalLight(<span class="hljs-number">0xffffff</span>, <span class="hljs-number">0.6</span>);
dirLight.position.set(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// x, y, z</span>
scene.add(dirLight);

...
</code></pre>
<p>Here we set the position of the light to be from above (with the Y value) and shift it a bit along the X-axis as well. The Y-axis has the highest value. This means that the top of the box receives the most light and it will be the shiniest side of the box. </p>
<p>The light is also moved a bit along the X-axis, so the right side of the box will also receive some light, but less. </p>
<p>And because we don’t move the light position along the Z-axis, the front side of the box will not receive any light from this source. If there wasn't an ambient light, the front side would remain in darkness. </p>
<p>There are other light types as well. The PointLight, for instance, can be used to simulate light bulbs. It has a fixed position and it emits light in every direction. And the SpotLight can be used to simulate the spotlight of a car. It emits light from a single point into a direction along a cone.</p>
<h2 id="heading-how-to-set-up-the-camera">How to Set up the Camera</h2>
<p>So far, we have created a mesh with geometry and material. And we have also set up lights and added to the scene. We still need a camera to define how we look at this scene. </p>
<p>There are two options here: perspective cameras and orthographic cameras.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/Stack.010.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Video games mostly use perspective cameras, because how they work is similar to how you see things in real life. Things that are further away appear to be smaller and things that are right in front of you appear bigger. </p>
<p>With orthographic projections, things will have the same size no matter how far they are from the camera. Orthographic cameras have a more minimal, geometric look. They don't distort the geometries - the parallel lines will appear in parallel.</p>
<p>For both cameras, we have to define a view frustum. This is the region in the 3D space that is going to be projected to the screen. Anything outside of this region won't appear on the screen. This is because it is either too close or too far away, or because the camera isn't pointed towards it.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/freecodecamp-2.001.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>With perspective projection, everything within the view frustum is projected towards the viewpoint with a straight line. Things further away from the camera appear smaller on the screen, because from the viewpoint you can see them under a smaller angle.</p>
<pre><code class="lang-js">...

<span class="hljs-comment">// Perspective camera</span>
<span class="hljs-keyword">const</span> aspect = <span class="hljs-built_in">window</span>.innerWidth / <span class="hljs-built_in">window</span>.innerHeight;
<span class="hljs-keyword">const</span> camera = <span class="hljs-keyword">new</span> THREE.PerspectiveCamera(
  <span class="hljs-number">45</span>, <span class="hljs-comment">// field of view in degrees</span>
  aspect, <span class="hljs-comment">// aspect ratio</span>
  <span class="hljs-number">1</span>, <span class="hljs-comment">// near plane</span>
  <span class="hljs-number">100</span> <span class="hljs-comment">// far plane</span>
);

...
</code></pre>
<p>To define a perspective camera, you need to set a field of view, which is the vertical angle from the viewpoint. Then you define an aspect ratio of the width and the height of the frame. If you fill the whole browser window and you want to keep its aspect ratio, then this is how you can do it. </p>
<p>Then the last two parameters define how far the near and far planes are from the viewpoint. Things that are too close to the camera will be ignored, and things that are too far away will be ignored as well.</p>
<pre><code class="lang-js">...

<span class="hljs-comment">// Orthographic camera</span>
<span class="hljs-keyword">const</span> width = <span class="hljs-number">10</span>;
<span class="hljs-keyword">const</span> height = width * (<span class="hljs-built_in">window</span>.innerHeight / <span class="hljs-built_in">window</span>.innerWidth);
<span class="hljs-keyword">const</span> camera = <span class="hljs-keyword">new</span> THREE.OrthographicCamera(
  width / <span class="hljs-number">-2</span>, <span class="hljs-comment">// left</span>
  width / <span class="hljs-number">2</span>, <span class="hljs-comment">// right</span>
  height / <span class="hljs-number">2</span>, <span class="hljs-comment">// top</span>
  height / <span class="hljs-number">-2</span>, <span class="hljs-comment">// bottom</span>
  <span class="hljs-number">1</span>, <span class="hljs-comment">// near</span>
  <span class="hljs-number">100</span> <span class="hljs-comment">// far</span>
);

...
</code></pre>
<p>Then there’s the orthographic camera. Here we are not projecting things towards a single point but towards a surface. Each projection line is in parallel. That’s why it doesn’t matter how far objects are from the camera, and that’s why it doesn’t distort geometries. </p>
<p>For orthographic cameras, we have to define how far each plane is from the viewpoint. The left plane is therefor five units to the left, and the right plane is five units to the right, and so on.</p>
<pre><code class="lang-js">...

camera.position.set(<span class="hljs-number">4</span>, <span class="hljs-number">4</span>, <span class="hljs-number">4</span>);
camera.lookAt(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);

...
</code></pre>
<p>Regardless of which camera are we using, we also need to position it and set it in a direction. If we are using an orthographic camera the actual numbers here don’t matter that much. The objects will appear the same size no matter how far away they are from the camera. What matters, though, is their proportion. </p>
<p>Through this whole tutorial, we saw all the examples through the same camera. This camera was moved by the same unit along every axis and it looks towards the 0,0,0 coordinate. Positioning an orthographic camera is like positioning a directional light. It's not the actual position that matters, but its direction.</p>
<h2 id="heading-how-to-render-the-scene">How to Render the Scene</h2>
<p>So we managed to put together the scene and a camera. Now only the final piece is missing that renders the image into our browser. </p>
<p>We need to define a WebGLRenderer. This is the piece that is capable of rendering the actual image into an HTML canvas when we provide a scene and a camera. This is also where we can set the actual size of this canvas – the width and height of the canvas in pixels as it should appear in the browser.</p>
<pre><code class="lang-js"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> THREE <span class="hljs-keyword">from</span> <span class="hljs-string">"three"</span>;

<span class="hljs-comment">// Scene</span>
<span class="hljs-keyword">const</span> scene = <span class="hljs-keyword">new</span> THREE.Scene();

<span class="hljs-comment">// Add a cube to the scene</span>
<span class="hljs-keyword">const</span> geometry = <span class="hljs-keyword">new</span> THREE.BoxGeometry(<span class="hljs-number">3</span>, <span class="hljs-number">1</span>, <span class="hljs-number">3</span>); <span class="hljs-comment">// width, height, depth</span>
<span class="hljs-keyword">const</span> material = <span class="hljs-keyword">new</span> THREE.MeshLambertMaterial({ <span class="hljs-attr">color</span>: <span class="hljs-number">0xfb8e00</span> });
<span class="hljs-keyword">const</span> mesh = <span class="hljs-keyword">new</span> THREE.Mesh(geometry, material);
mesh.position.set(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
scene.add(mesh);

<span class="hljs-comment">// Set up lights</span>
<span class="hljs-keyword">const</span> ambientLight = <span class="hljs-keyword">new</span> THREE.AmbientLight(<span class="hljs-number">0xffffff</span>, <span class="hljs-number">0.6</span>);
scene.add(ambientLight);

<span class="hljs-keyword">const</span> directionalLight = <span class="hljs-keyword">new</span> THREE.DirectionalLight(<span class="hljs-number">0xffffff</span>, <span class="hljs-number">0.6</span>);
directionalLight.position.set(<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// x, y, z</span>
scene.add(directionalLight);

<span class="hljs-comment">// Camera</span>
<span class="hljs-keyword">const</span> width = <span class="hljs-number">10</span>;
<span class="hljs-keyword">const</span> height = width * (<span class="hljs-built_in">window</span>.innerHeight / <span class="hljs-built_in">window</span>.innerWidth);
<span class="hljs-keyword">const</span> camera = <span class="hljs-keyword">new</span> THREE.OrthographicCamera(
  width / <span class="hljs-number">-2</span>, <span class="hljs-comment">// left</span>
  width / <span class="hljs-number">2</span>, <span class="hljs-comment">// right</span>
  height / <span class="hljs-number">2</span>, <span class="hljs-comment">// top</span>
  height / <span class="hljs-number">-2</span>, <span class="hljs-comment">// bottom</span>
  <span class="hljs-number">1</span>, <span class="hljs-comment">// near</span>
  <span class="hljs-number">100</span> <span class="hljs-comment">// far</span>
);

camera.position.set(<span class="hljs-number">4</span>, <span class="hljs-number">4</span>, <span class="hljs-number">4</span>);
camera.lookAt(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);

<span class="hljs-comment">// Renderer</span>
<span class="hljs-keyword">const</span> renderer = <span class="hljs-keyword">new</span> THREE.WebGLRenderer({ <span class="hljs-attr">antialias</span>: <span class="hljs-literal">true</span> });
renderer.setSize(<span class="hljs-built_in">window</span>.innerWidth, <span class="hljs-built_in">window</span>.innerHeight);
renderer.render(scene, camera);

<span class="hljs-comment">// Add it to HTML</span>
<span class="hljs-built_in">document</span>.body.appendChild(renderer.domElement);
</code></pre>
<p>And finally, the last line here adds this rendered canvas to our HTML document. And that’s all you need to render a box. It might seem a little too much for just a single box, but most of these things we only have to set up once. </p>
<p>If you want to move forward with this project, then check out my YouTube video on how to turn this into a simple game. In the video, we create a stack building game. We add game logic, event handlers and animation, and even some physics with Cannon.js.</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/hBiGFpBle7E" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>If you have any feedback or questions on this tutorial, feel free to Tweet me <a target="_blank" href="https://twitter.com/HunorBorbely">@HunorBorbely</a> or leave a comment on <a target="_blank" href="https://www.youtube.com/channel/UCxhgW0Q5XLvIoXHAfQXg9oQ">YouTube</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I designed a famous building in isometric 3D using Figma ]]>
                </title>
                <description>
                    <![CDATA[ By Gbolahan Taoheed Fawale This article does not quite follow the conventional tutorial format. This is a blend of storytelling and broad explanations, a well-documented expression of my thoughts. Since I designed my first 3D object in Figma, I’ve be... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-designed-a-popular-landmark-building-in-isometric-3d-using-figma-f059fe333459/</link>
                <guid isPermaLink="false">66c34d9230aba6677fb9f9e6</guid>
                
                    <category>
                        <![CDATA[ 3d ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ figma ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Nigeria ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 02 Jul 2018 07:54:23 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*sYwy-QJFd-ZJmGMr76ifWw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gbolahan Taoheed Fawale</p>
<p>This article does not quite follow the conventional tutorial format. This is a blend of storytelling and broad explanations, a well-documented expression of my thoughts.</p>
<p>Since I designed my <a target="_blank" href="https://medium.com/@GbMillz/creating-realistic-3d-objects-in-figma-carton-box-example-f674c21c3452">first 3D</a> object in <a target="_blank" href="https://www.figma.com">Figma</a>, I’ve become more interested in recreating different complex objects and illustrations. This will ultimately help me better my design skills. I want make designs that make people go “Wow! Did you really use Figma to do that?” I want to hear them express their surprise, as they thought Figma was only a UI design tool.</p>
<p>That is how I personally want to position Figma within and beyond my immediate community. Just like developers say, “it’s not about the available tools but how well those tools can be put to good use.” Indeed, it’s about how these tools can be used for the desired results. Besides, the most important aspect of software development is what determines your level of proficiency in a particular programming language. I also do little front-end as well, though.</p>
<p>I have some design projects as well as accompanying posts that I will be preparing in an effort to document how I created them. I will be pushing these to the public as soon as I am done.</p>
<p>Though isometric designs are gradually getting popular, I want to push my designs beyond the conventional isometric 3D designs. I want them to head towards something more realistic while also keeping their originality.</p>
<p>Now, let’s get back to business. I want to take it back to the roots (Africans, a-woo! I know some of us know that popular JJC song. Lol.) Well, this is the first design from my Isometric Nigeria 3D landmark project, and it’s also one of the most complex. I believed that if I could successfully design this building (the National Theater, in Lagos) I could easily design any other isometric 3D object.</p>
<h3 id="heading-stage-1-pre-design"><strong>Stage 1: Pre-design</strong></h3>
<p>I started out by spending some time studying the building. I used a picture I got off Google as a reference point by bringing the picture into my Figma workspace. While I worked on the design, I kept studying the reference image and continued to tweak the design until I got something nicely crafted.</p>
<p>I approach my designs like I want to draw or paint them on paper. I study the shadows, perspective, contrast, direction, and reflection of light. These are some of the most important elements and features to look out for when creating isometric 3D objects and realistic illustrations. Strategically applying gradient layers give objects that solid appearance.</p>
<h3 id="heading-stage-2-design-proper-creating-upper-seat-section-of-the-theater"><strong>Stage 2: Design proper (Creating upper seat-section of the theater)</strong></h3>
<p>First, I created the body of the upper part of the building using a rectangle. I then modified the rectangle to give me a shape similar to what I have in the reference photo. After that, I did something similar for the other part (rectangle) of the building that looks like it’s behind the first, check the second image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/BYH0t8jp-PoVmlULTBvYPwE-hA7mqCca7V7G" alt="Image" width="619" height="528" loading="lazy">
<em>Step 1 of design.</em></p>
<p>Now we need to replicate these two shapes, edit them to make them appear bigger and place them behind the initial/original layers. This lays a foundation for what will later look like a roof/top of a real building structure. This process is demonstrated in the images below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Neu8RSh8UkvEJ7SS8Bxrq1R4yZkBIT3Ix-Eo" alt="Image" width="709" height="368" loading="lazy">
<em>Step 2 of design: laying foundation</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/cypJDUWFr7txnAGTjf0H7vNm1905NsszkVCT" alt="Image" width="526" height="163" loading="lazy">
<em>Gradient fill.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YrQTWjawMGBFL34Nkd8qTLZGepOPNb1UOq2I" alt="Image" width="524" height="231" loading="lazy">
<em>Gradient fill 2.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0cusFCQp55dfxRI7YQ5Ry2dFybFKSTmSbGQW" alt="Image" width="515" height="194" loading="lazy">
<em>Gradient fill 3.</em></p>
<p>Once completed, the next stage was to create the lower part of the building.</p>
<h3 id="heading-stage-3-designing-the-outer-part-of-the-stage-of-the-theater"><strong>Stage 3: Designing the outer part of the stage of the theater</strong></h3>
<p>I created a rectangle, applied a corner radius of 100px to the upper left and right corners, and also applied a linear gradient fill. The corner radius and gradient are used to show that the structure is circular. The result is the image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FZQyWXCfV5wBWOgEh6vrkCaFwYxKz4Z-SKi1" alt="Image" width="749" height="414" loading="lazy"></p>
<p>Next, I added another rectangle with a gradient fill, and bent it outwardly towards the bottom. The two rectangles in this stage show that the concrete base of the first section we created above is also circular. The new rectangle has a wider circumference so it extends more outwardly than the section above it. This is also reflected in the width of the rectangles. The combined result is in the image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1R1ou1-eSbsQktblpfU5jOX3f1lh9vdcAzk3" alt="Image" width="800" height="365" loading="lazy"></p>
<p>Things are getting more interesting. In the image below, I created another rectangle, then applied a linear gradient fill. You can see the center is brighter and has a kind of shiny effect. This was done to give the next layer a glassy effect, as seen in the reference photo.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/t5ejchg827bKZ8PRWlmzQbK53KINY5GyvbmE" alt="Image" width="791" height="422" loading="lazy"></p>
<p>The glassy layer is a complex shape (a single layer of many similar shapes). I use complex shapes to reduce the number of layers I have in my layers panel, when designing without grouping or flattening layers. You can read my post on it <a target="_blank" href="https://medium.com/figma-africa/figma-tutorial-creating-complex-shapes-in-figma-chessboard-example-615c36ae0302"><strong>here</strong></a>. Right after this, I added another rectangle as seen in the next image. This part forms a wall used as a demarcation between the different openings and entrances of the building.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/M0ns6IXkxAathFKIxY6TVhnJWr7n0-PxNzTq" alt="Image" width="800" height="442" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UPa5emAj91tBY3c2rOdiwOthTCHp0Acxodzy" alt="Image" width="762" height="397" loading="lazy"></p>
<h3 id="heading-stage-4-ground-floor-design"><strong>Stage 4: Ground floor design</strong></h3>
<p>Next, I added another rectangular layer, which I edited and modified to look like what is in the picture below. This layer forms the top for the next layers. It, and the other layers I will be adding afterwards, all play a role in the look of the structure and how it’s perceived by the viewer.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/VMKuNRdLcMf4r83ABixKLBenQLPVdAczGTa5" alt="Image" width="703" height="333" loading="lazy"></p>
<p>I added another rectangle that was blurred to form the shadow for the next layers I created in the next image.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/3Ku83JUPN3bUv2hRdZ2txeAEYNGeoVOS06NM" alt="Image" width="800" height="483" loading="lazy"></p>
<p>In the image above, I created 12 rectangles placed neatly on top of each other which I modified to have the picture below</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZXLHjRdgboIgoA8LE6xEI71yPqmmeRAUhqdE" alt="Image" width="800" height="496" loading="lazy"></p>
<h3 id="heading-stage-5-adding-more-effects"><strong>Stage 5: Adding more effects</strong></h3>
<p>I applied a linear gradient fill and drop shadow to the six light grey rectangles above. The gradient gives it the realistic look of a block of walls with light bouncing off it. I added the drop shadow to buttress that look and effect. The darker rectangles below are just flat walls/the base of the building. The shadows of the six light grey rectangles outwardly extend to the curved walls/pillars above that it was casting on.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-4DWFO-ew66kTsqAPEgIYQk6Wc0sWAj7wmyW" alt="Image" width="414" height="291" loading="lazy">
<em>Gradient fill.</em></p>
<p>I also applied a gradient fill to the dark grey rectangles. These are darker because they are the lowest part of the building.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/A-wX2G6gCIaBplbbp0wfXcR8DS1SILpa-1HS" alt="Image" width="447" height="421" loading="lazy"></p>
<p>At this stage I needed to add some layers to perfect the look. I added another five narrow rectangles to fit the spaces between the 12 rectangles I created.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oBfPt42WqSUGImR6iP7ByclbR4d5xPe--clU" alt="Image" width="792" height="497" loading="lazy"></p>
<p>Then I added some narrow rectangles, and placed them vertically. This gives the thick block/pillar effect of a real building, at the point where the six grey rectangles meet with the flat layer above it. This is shown in the image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/AWPu85pTyB6vhp2r3SFFlMgVgPUZ1Etw2H8g" alt="Image" width="786" height="467" loading="lazy"></p>
<p>At this point there was something still missing. I added new rectangular layers and modified them to add that layer that looks like a wall at the far right of the 12 rectangles I created above. As captured in the reference photo, I modified the lightest rectangle and placed it behind the 12 rectangles. It now protrudes more towards the right. I modified the darker rectangles to look like the image below:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/sPBpUyVGW8OSHvfTX7RJEyQkkshcoW4MBYDm" alt="Image" width="482" height="263" loading="lazy"></p>
<h3 id="heading-stage-6-working-on-the-outer-pillars"><strong>Stage 6: Working on the outer pillars</strong></h3>
<p>I went back to the upper part and put some things in place. As shown in the image below, I created narrow-sized rectangles to represent the vertical pillars.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/aauqsoQsAH3EyIfsLYIaqkcBny0mf2QcZw9I" alt="Image" width="316" height="185" loading="lazy">
<em>vertical pillars</em></p>
<p>I then created another set of rectangles. These were modified, and one was flipped in the opposite direction. I grouped both shapes to form the horizontal inner pillars and replicated it to look like the picture below. Though they aren’t neatly arranged at this point, I worked on this later.</p>
<p>In the later parts of this post, you will observe that the upper part of each individual horizontal pillar is brighter than the lower parts. Also, the ones closer to the left side of the building are brighter than the ones on the right — remember the building is circular in structure ?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/nge-viTdiWZIgeoydp1Of7OQCXJLutfsFXNf" alt="Image" width="699" height="318" loading="lazy">
<em>Horizontal pillars</em></p>
<h3 id="heading-stage-7-designing-the-rooftop"><strong>Stage 7: Designing the rooftop</strong></h3>
<p>I did some magic at the top-most part of the vertical pillars. I created a new rectangle, and used the ‘edit object’ option to modify it to look like what we have below. I modified it to suit the different parts of the circular structure of the rooftop. You can see they are different sizes and also reflect how much light is hitting them from the top.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/WHp6g1StHKi--4bm8Z60SfZs36nLpcX0hPfv" alt="Image" width="800" height="448" loading="lazy">
<em>Creating roof tops</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NIw04MrqwXpNtpbLVCSG1hcrVcovE-h9icDL" alt="Image" width="800" height="422" loading="lazy">
<em>Rooftops</em></p>
<p>The rooftops in the image below are just rectangles I modified, and filled with color to blend with the surface of the roof itself. I created another copy, shifted it up a little to have a kind of stroke at the topmost edges, giving it a contrasting effect with the sky. If I didn’t do that, it would disappear into the sky at the background.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/cOqXgyShCWY5DhLJaBz4s3cytn4quTRVq7Fn" alt="Image" width="800" height="342" loading="lazy"></p>
<p>In the image below, the yellow arrows show the direction and curvature of the building. Light rays falling on the roof of the building reflect quite differently, making us see some parts of the building darker while others are lighter. The areas marked blue are brighter and sizes are bigger as the building curves towards the right. Towards the left side, they are darker and shorter until the building’s circular structure becomes more visible and higher behind, at the left.</p>
<p>It’s just like when you are driving on roads with sharp corners — you only see further ahead when you drive past the curve. It’s all these little things that make the eye perceive the building as a circular structure.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-2vgXCqeD-Hh2LyCB93xeRv4Wc0f21g5JAt2" alt="Image" width="800" height="174" loading="lazy"></p>
<h3 id="heading-stage-8-adding-effects-to-the-pillars"><strong>Stage 8: Adding effects to the pillars</strong></h3>
<p>Here are images of the different ways I applied linear gradient fill to the vertical pillars. This gives them a solid look. You will also observe that the vertical pillars were tilted to follow the direction of the curvature of the building ?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UrQOmQUJIw5pbpKcarWaE4c6I0EQClHqZfRg" alt="Image" width="800" height="233" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FC2w5bFcBALRHEjvP3CjOgljR6AenGFRJNeQ" alt="Image" width="800" height="271" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/TI0gk-tL9PXZrrfHpAfEM1Fk0pfyw9HOGBUj" alt="Image" width="800" height="325" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/IevRRdvUZzjFVwKg9nujaZYMN1xfk8maunN1" alt="Image" width="800" height="310" loading="lazy"></p>
<h3 id="heading-stage-9-adding-the-windows-and-glass-walls"><strong>Stage 9: Adding the windows and glass walls</strong></h3>
<p>Just before adding the vertical pillars that spread around the building, I created complex shapes of lines. These represent what look like blocks of polished wood, neatly arranged side by side. I used this as a sort of padding layer on the outer walls of the upper section of the building, then blurred it. The result is shown in the image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1Hks1F-5xWbzJle4RiszrLtpLcF7DDz4aiLA" alt="Image" width="800" height="285" loading="lazy">
<em>Blurred black lines</em></p>
<p>I also did something similar to create the glass windows in the image below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oOv1QWRszqfHkVVmpC1CoCgP1YI39q8SOARX" alt="Image" width="501" height="181" loading="lazy"></p>
<p>You will notice a black background behind the white lines in the image below. In this layer, I applied a gradient fill to give the shining bright effect of the glass walls/windows, and to give that circular structure of the building. That’s the reason why the right and left sides of the rectangle are darker that the bright center part. You will also notice that the white lines were bent and tilted parallel to the vertical pillars.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/nBYvJdNxoKqC8LPK2Z1NDx23K-j1dAH5Ftfv" alt="Image" width="541" height="104" loading="lazy"></p>
<p>The final result is shown below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oWCLDkZeZOv9rhghjTr3-tZU49NegZx6pvSg" alt="Image" width="800" height="302" loading="lazy"></p>
<p>The glass makes the center appear brighter because that’s the only part of the building our eyes can see. It’s reflecting the sky and surrounding environment, but gets a little darker moving towards the left and right due to the circular structure of the building. If this was a normal non-circular glass building or skyscraper, all the glass will be shining bright!</p>
<p>I kept on tweaking the design by applying gradients on the vertical pillars to give them a solid look. The lower portion of the vertical pillars are bent outwardly to support the structure. I thought of how I was going to achieve this for a while, considering the fact that the vertical pillars were rectangles and not a shape I created with a pen tool. Upon further review, I found it was necessary to add another rectangle, and blend them using gradient at the intersection of both rectangles.</p>
<h4 id="heading-something-from-behind-the-scenes"><strong>Something from behind the scenes</strong></h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gopvR68T4POEA9h1lZwB7hC0ocn81BtAsbt9" alt="Image" width="689" height="407" loading="lazy">
<em>Behind the scenes ? lower portion of the pillar</em></p>
<p>You will notice that I made some changes to the horizontal pillars to reflect the effect and direction of light in the pictures below. The upper part of each horizontal pillar is lighter than its lower part. The overall appearance of the horizontal pillar gets darker/duller towards the right part of the building.</p>
<p>At the lower portion of the building at the right, I added some rectangles to represent the entrance/driveway of the building. I did this by applying inner shadow to depict an entrance tunnel.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wdc2NOg6U5T055a9bNseRXaSnTAIG51DPsBk" alt="Image" width="649" height="310" loading="lazy"></p>
<p>Then I worked on the sky image below and surrounding landscape. The green flat surface that represents the vegetation around the building is just a large rectangle with single color fill ( you can see the image of the grass layer in the second image).</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/k-JjsilSrJ1XbtuoTbeyAwIAxd6sPD8BiXeJ" alt="Image" width="788" height="374" loading="lazy">
<em>Gradient to form the sky.</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/17Xo689mALGv8zI8pKVLRK2AYqUSGVEeY9yp" alt="Image" width="800" height="260" loading="lazy">
<em>reactangular grass layer</em></p>
<h3 id="heading-stage-10-nigerian-coat-of-arms"><strong>Stage 10: Nigerian Coat of Arms</strong></h3>
<p>At this stage, I was almost done with the design. Because I wasn’t satisfied, I tried to create the Nigerian Coat of Arms. It was a fast one, though, as I preferred to design something not perfect than not put anything there at all.</p>
<p>The horses and eagle were created using pen tool. For the the ‘Y’ part, the layers below the shield and the shield background were modified shapes. I also applied a drop shadow to the grouped Coat of Arms to make it “pop” out of the background.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tkFr75JxP2qSVKysGXaw6cytfKuQghTyDvlw" alt="Image" width="543" height="304" loading="lazy">
<em>Rough sketch (Coat of Arms).</em></p>
<h3 id="heading-stage-11-vegetation-and-geography"><strong>Stage 11: Vegetation and geography</strong></h3>
<p>And the trees! The reason for using circles with shadows and gradient layers is to depict different hidden branches and leaves casting shadows on each other at different parts of the trees. I also made the tree with circles much bigger, closer, and strategically placed. The trees cast shadows underneath to give the building a distant effect in the eyes of the viewer.</p>
<p>The shadows below the trees are just circles which were stretched to have a saucer look and flat appearance. These were then blurred to look like real shadows.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/R9nYJUdxlT168YqIcJhwM7tnR79ZMIsyS7Fy" alt="Image" width="445" height="138" loading="lazy">
<em>Tree shadows.</em></p>
<p>I also created some objects in the design to represent shrubs and green flowers. These were planted at different locations to look like the reference image. The shrubs and flowers are rectangles that I created, applied round corners at the upper parts, filled with a gradient layer, and blurred to give that distant effect. Objects get sharper and more distinct the closer you get, but the shrubs and flowers are far away. This is also the reason for their small sizes.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/qgNIXhNj-5dWBxrIWyzflINaakDUnZRsi0Xs" alt="Image" width="649" height="245" loading="lazy">
<em>Shrubs when zoomed.</em></p>
<p>The final design is shown below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tFmlyNx0fye3NMVwU51SnrCmn7HU5wE-8wOA" alt="Image" width="800" height="600" loading="lazy"></p>
<p>The link to the design is <a target="_blank" href="https://www.figma.com/file/KryQQ5UI7zCjM1drN5qmQ3hM/national-theater-lagos"><strong>here</strong></a><strong>.</strong></p>
<p>Thanks for reading</p>
<p>You can reach out to me on twitter <a target="_blank" href="https://twitter.com/GbMillz"><strong>here</strong></a></p>
<p>Don’t forget to join Figma Africa Community on Slack <a target="_blank" href="https://figma-africa.slack.com"><strong>here</strong></a><strong>.</strong></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
