
When it comes to creating brick-based designs in Grasshopper, most tutorials focus on rotating bricks along their axes to generate an image. In this project, I wanted to take a different approach by using the corbel technique, where bricks are gradually offset outward to create depth and shadow effects. This method allows us to project an image onto a facade in a unique and dynamic way.

Step 1: Creating a Parametric Box
Before we generate the brick facade, we need a base geometry. In this case, we will start with a simple cube using the Domain Box component. This method ensures that our box is fully parametric, allowing us to adjust its dimensions easily.
- Add three Construct Domain components.
- Connect each domain to a Number Slider to control the width, depth, and height of the box.
- Add a Domain Box component.
- Connect the three Construct Domain outputs to the X, Y, and Z inputs of the Domain Box.
If all sliders are set to 10,000 mm, the output is a 10m x 10m x 10m cube. Since we used domains, changing the slider values will dynamically adjust the box size, which is useful for scaling our brick facade later.

Step 2: Selecting a Surface and Positioning the Brick
Now that we have a parametric box, the next step is to select a specific surface from the box and position a brick on it.
- Add a Deconstruct Brep component. (This breaks the box into individual faces, edges, and vertices.) Connect the Box to the Brep input of the Deconstruct Brep.
- Add a List Item component. (This allows you to pick a specific face from the list of faces.) Connect the F (Faces) output of the Deconstruct Brep to the L (List) input of List Item.
Use a Slider to set the i (index) input of List Item and select the face you want. (For example, i = 0 will select the front face, i = 4 will select the top face, etc.) - Add an Evaluate Surface component. Connect the selected face from List Item to the S (Surface) input of Evaluate Surface.
- Right-click on the S input of Evaluate Surface and click Reparameterize. (This normalizes the surface so that it ranges from 0 to 1 in both U and V directions.)
- Add a MD Slider to control the U and V parameters of the surface.
Set the MD Slider to a value of 0 at the beginning. (This will position the brick at the bottom-left corner of the surface.) Connect the MD Slider to both the U and V inputs of the Evaluate Surface component. This determines the exact position of the brick on the selected surface. - To create and place the brick:
Add a Center Box component. (This creates a box, which will represent the brick.)
Use MD Slider to define the size of the brick and its position.
Connect the X, Y, and Z outputs of Center Box to control the position and size of the brick.
Connect the Center Box output to the Evaluate Surface’s F (Face) input, placing the brick correctly on the surface.

Step 3: Arranging Bricks Along the Horizontal Axis
Now that we have positioned a brick on the selected surface, the next step is to arrange the bricks horizontally along the surface. This process ensures that as the surface size changes, the number of bricks will adjust accordingly.
- Add a Vector component. (This provides a direction vector to control the spacing between the bricks.) Connect the output of the Evaluate Surface (U) to the A (Vector) input of a Multiplication component.
- Set the B input of the Multiplication component to 400. (Since each brick is 200 mm wide, setting the spacing to 400 mm ensures that the bricks will be placed side by side without overlapping.)
- Add a Linear Array component. Connect the output of the Multiplication component to the Direction (D) input of the Linear Array.
This will distribute the bricks in the horizontal direction along the surface. - Add a Division component. (This component divides the surface width by the spacing value to determine the number of bricks.)
Connect the Y output from the Deconstruct Box component (this gives the surface’s horizontal length) to the A input of the Division component.
Set the B input to 400 (the spacing between the bricks). This will divide the surface length by the brick spacing.
Connect the Division output to the Count input of the Linear Array component. This will automatically adjust the number of bricks based on the surface’s width.

Step 4: Duplicating the Bricks Vertically with Offset
Now that we’ve arranged the bricks horizontally, we will proceed to duplicate the bricks vertically in a similar manner. The goal is to align the bricks in such a way that each new row will be centered over the row beneath it.
- Add a Linear Array component. (This component will be used to duplicate the bricks along the vertical direction.) Connect the previously created brick’s position to the Base Point input of the Linear Array.
- For the Direction, connect a Vector along the y-axis (vertical direction). In the Count input, use a Slider to control how many rows of bricks you want. Set this value accordingly.
- To create a gap between rows, increase the value in the Slider for the Count input. This creates an extra gap between the rows, which will allow the bricks to be placed offset from the row below.
- Next, we want to shift the bricks horizontally so that each brick in the new row aligns with the brick in the row below. Connect the output of the Linear Array to a Move component.
- The move will be calculated using a vector with half the width of the brick, shifting the bricks to the right (or left) depending on the row number. This process ensures that the bricks in the odd-numbered rows are shifted, while the even-numbered rows stay in their original positions, creating a nice staggered effect.

Step 5: Image Projection
In this step, we will manipulate the bricks so that they create a visual effect based on the image loaded into Image Sampler. The bricks will be moved outward according to the brightness values of the image.
- Add a Merge component. (This combines multiple geometries into a single output for easier processing.) Connect the outputs of Move (the offset bricks) and the second Linear Array (the regularly placed bricks) into the Merge component. (This ensures that all bricks are considered together.)
- Add a Bounding Box component. (This generates a box enclosing the entire brick structure.) Connect the Merge component to the Bounding Box. Right-click on the Bounding Box component and select Union Box. (This ensures we get a single bounding box instead of individual ones for each brick.)
- Add a Deconstruct Brep component. (This extracts the faces, edges, and vertices of the bounding box.)
- Add a List Item component and connect it to the F (Faces) output of Deconstruct Brep. (This selects a specific face of the bounding box.) Set the i (index) value to 3 using a Slider.
- Add a Surface Closest Point component. (This finds the closest location on the selected face for each brick.) Connect the selected face from List Item to the S (Surface) input of Surface Closest Point. Right-click the S input and select Reparameterize.
- Add a Volume component and connect the Merge component to it. Connect the Volume output to the P (Point) input of Surface Closest Point.
- Add an Image Sampler component. (This allows us to extract grayscale or color values from an image based on coordinates.) Upload an image to the Image Sampler. Connect the UVP of Surface Closest Point to the Image Sampler input.
- Add a Bounds component to find the range of values from the Image Sampler. Connect its output to the Remap Numbers S input.
- Add a Construct Domain component to set a new range (e.g., 5 to 150). Connect it to the T input of ReMap to control brick movement.
- Add a Move component. (This will shift the bricks outward based on image brightness.) Add a Unit X vector and connect it to the Move component’s T input. (This ensures movement is along the X-axis.)


