Belle-Ve Bricks

Your Imagination

lego moc brickheadz introduction

Designing a LEGO® BrickHeadz MOC (Complete Guide)

Create Your

We help you from start to finish to create and deliver your tailor-made custom model.
Custom model
Continue

This is nothing new, but seeing that LEGO® Brickheadz are the theme I have been focusing on the most at the moment, I decided to write up a few articles on them, so you can eventually build your very own models!

History of LEGO® Brickheadz

Starting off: what even is a Brickheadz? Brickheadz is collectible, buildable figures, with a particular big-headed blocky style (along with the likes of another collectible figure series that shall remain nameless!).

They began as gifts from LEGO® designer Austin Carlson. He started giving them away to his co-workers and they were eventually pitched to LEGO® as an official theme, eventually setting Marcos Bessa as lead designer.

The theme was first announced at SDCC back in 2016, with 4 exclusive 2-packs from DC and Marvel Comics. The official line started in 2017 and has been growing ever since. The theme now includes characters from Disney, Marvel, DC, Harry Potter, and even some seasonal builds. With the new Mandalorian 2-pack coming out later this year, the total comes up to 114 models!

LEGO BrickHeadz Anatomy

An average Brickheadz is 23 plates tall, depending on any hair or headgear which would give it an additional plate or two.

The head is composed of 12 (bricks) giving a 4×4 stud building area on every side and on top of the head. The face itself has a 2-plate thickness that allows a bit more flexibility with hairstyle/face combos when building.

Connecting the head to the torso there’s usually a 4×4 plate that can represent different parts of the body depending on the build, but in the vast majority, it is used for collars.

The torso itself is 7 plates tall, with a 2×2 building area on the sides where the arms will be attached.

Under the torso, we have a 4-tall leg build, which usually has a 2×4 plate with three 1×2 plates for the legs.

These are the “basic” Brickheadz guidelines. Obviously, there are a lot of options when building these, and there have been several official builds that stray off the norm, giving us very cool unconventional models. Some examples would be:

  • The Hulk’s arms (which I call “buff arms”), which later became a bit shorter with Infinity War Thanos
  • The small builds (which I call “3x3s”) like Yoda, Rocket, or Hedwig.
  • The floating builds like the ghost, scarecrow, and Slimer.
  • The chubby Homer Simpson shares a belly compartment built with Santa.
  • Bigger feet like on Mickey/Minnie and the Scarecrow.
  • The limited-edition Nonnie BrickHeadz was given to attendees of the 2017 LEGO® Inside Tour.



There were rumors of this series being discontinued last year, but the series is still strong. As I said before, there’s a new Mandalorian 2-pack coming up later this year, and some talk on the rumor mill says there are even more coming up. Official or not, LEGO® still is at heart a creative medium, so there will always be custom builds!

Hello everybody! I had a very hard time choosing who to use as an example for my building process. I asked around on Instagram and among my AFOL friends. Seeing that I have been doing a lot of Marvel builds, after a suggestion from a fellow RLUG member I decided to honor the great Stan Lee.

Starting off, I would like to remind you that in theory, if you are planning to make a BrickHeadz model, there is a certain standard, which I explained previously in my article. Obviously, you are free to do as you like, however, adding too much height/width, using different eyes, or even changing the orientation of the eye print (!) would make your model stand out from the others in a weird way.

Using Nonnie as an example, I colored certain parts of his body to show what each of them would represent to help you out while creating your original design.

Examples of LEGO® BrickHeadz MOCs

https://www.youtube.com/watch?v=jqHafG7hFTA
https://www.youtube.com/shorts/dyAyz2rrd4Y

Designing a LEGO® BrickHeadz MOC

Designing a LEGO® BrickHeadz MOC – Head Build (Face)

For the front of the head, I divided it into 3 colors: the top two rows red, the third-row yellow, and the fourth row green.

The red area represents the forehead. Anything under the hairline and above the eyes would go in here. Stan doesn’t have any hair on his forehead or any headgear, so this goes blank.

The yellow area represents anything eye-level. Brickheadz does not usually have noses so I didn’t add any. I used Dumbledore’s glasses (from LEGO® set 41621) because I love them and because using the huge Brickheadz glasses will collide with the mustache.

The green area represents anything below the eyes and above the neck. Stan has his mustache so it is the only thing I added for this level.

Designing a LEGO® BrickHeadz MOC – Head Build (Side)

Here I divided the area into three colors. The aqua tile represents the side of the head above the ears. Here you would add any hair or headgear that goes around the side of the head. For Stan, I just made the sides of his hair. Since his hair is graying/turning white, I decided to color it white and have the top of the hair gray so you can have that color transition.

The orange tile represents anything in front of the ear. Here you would add any sideburns or extra hair – I just added a bit of sideburn.

The magenta tile on the back is for anything behind the ear. Here is where you would add, for example, any long hair tucked or flowing behind the ear.

Designing a LEGO® BrickHeadz MOC – Torso Build

The blue 4×4 plate under the head can be the neck or collar, usually the collar. For Stan, I used it as the collar of his jacket, with 1×2 tile in white to represent the collar of his shirt in a VERY simple way.

The green parts of the torso I usually use for anything above the belt, the black parts represent the belt, and the white under the torso would represent underwear (that’s why I made them white!)

For Stan, his Jacket is a bit long so I made it go farther down the sides, going over the belt. I left the chest green and added a black 1×2 tile to represent the belt.

Designing a LEGO® BrickHeadz MOC – Torso Build – Side/Arms

Here I added just two colors for the simple arm build. I like to imagine the red tile being the top half of the arm, the orange clip being the lower half of the arm. You can use the clip as a hand/glove too if you’d like. Here I made both the simple build and the bracket arms I love to use so I am able to add a bit more detail. (The white cuff of his shirt.)

Designing a LEGO® BrickHeadz MOC – Leg Build

The legs are usually 4 plates tall. I like to divide the legs into two halves, the gray plates representing details above the knee, and the white plates representing everything below the knee. You could use both white tiles to represent a boot, or just the lowest tile (as I did here) to represent regular shoes.

Designing a LEGO® BrickHeadz MOC – Finishing Off

Now that the design is done, I added the usual Cap’s shield (from LEGO® set 41589) and Mjolnir so you can kind of tell it’s Stan Lee and not just a regular guy.

Hope this helped shed a bit of light on my design process and I hope this gave you a better understanding of the basics. Next week I will get into instruction-making on Stud.io 2 and will make the file available for you guys.

Play well!




<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
  /**
  * Renders all unrendred LinkedIn Badges on the page
  */
  window.LIRenderAll = function () {
    var CALLBACK_NAME     = 'LIBadgeCallback', //Must match callback on helpers.js
        BADGE_NAMES       = '.LI-profile-badge, .LI-entity-badge',
        // TODO -- tracking param for other badge types
        TRACKING_PARAM    = 'profile-badge',
        responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
        expectedResponses = 0, //Keeps track of number of responses to expect
        scripts           = [ ], //Keeps track of scripts added for proper cleanup when finished
        childScripts      = {}, //Keeps track of child scripts to render
        badges            = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));

    var i, len, badge, rendered;
    for (i = 0, len = badges.length;  i < len; i++) {
      badge    = badges[i];
      rendered =  badge.getAttribute('data-rendered');
      if (!rendered) {
        expectedResponses++;
        badge.setAttribute('data-rendered', true);
        renderBadge(badge);
      }
    }

    function isCNDomain() {
      if (typeof window !== "undefined") {
        var hostName = window.location && window.location.hostname ||  '';
        return (/linkedin(-ei)?.cn$/).test(hostName);
      }

      return false;
    }

    function generateUrl(isEI) {
      var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
      if (isCNDomain()) {
        return domainPrefix + ".cn/";
      }

      return domainPrefix + ".com/";
    }

    function getBadgeKeyQueryParams(badge) {
      return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
        return attr.name.lastIndexOf('data-key-', 0) !== -1;
      }).map(function (attr) {
        // Most browsers automatically lowercase the attribute name when its being read
        // We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
        return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
      });
    }

    /*
    * Renders a single badge on the page
    * @param badge: div element of badge to render
    */
    function renderBadge(badge) {
      var size       = badge.getAttribute('data-size'),
          locale     = badge.getAttribute('data-locale'),
          type       = badge.getAttribute('data-type'),
          theme      = badge.getAttribute('data-theme'),
          vanity     = badge.getAttribute('data-vanity'),
          version    = badge.getAttribute('data-version'),
          isEI       = badge.hasAttribute('data-ei'),
          entity     = badge.getAttribute('data-entity'),
          isCreatePage = badge.hasAttribute('data-iscreate'),
          uid        = Math.round(1000000 * Math.random()),
          baseUrl = generateUrl(isEI),
          queryParams = [
            'locale=' + encodeURIComponent(locale),
            'badgetype=' + encodeURIComponent(type),
            'badgetheme=' + encodeURIComponent(theme),
            'uid=' + encodeURIComponent(uid),
            'version=' + encodeURIComponent(version)
          ],
          url;

      if (version === 'v2') {
        baseUrl += 'view';
        queryParams.push('badgesize=' + encodeURIComponent(size));
        queryParams.push('entity=' + encodeURIComponent(entity));
        queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
      } else {
        baseUrl += 'profile';
        queryParams.push('maxsize=' + encodeURIComponent(size));
        queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
        queryParams.push('vanityname=' + encodeURIComponent(vanity));
      }

      if (isCreatePage) {
        queryParams.push('fromCreate=true');
      }

      url = baseUrl + '?' + queryParams.join('&');
      badge.setAttribute('data-uid' , uid);
      jsonp(url); //Calls responseHandler when done
    }

    /**
    * Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
    * @param badgeHtml: String representing contents of the badge
    * @param badgeUid: UID of the badge to target
    **/
    function responseHandler(badgeHtml, badgeUid) {
      responsesReceived ++;

      var i, badge, uid, isCreate;
      var defaultWidth = 330 // max possible width
      var defaultHeight = 300 // max possible height

      for (i = 0, len = badges.length; i < len; i++) {
        badge = badges[i];
        // isCreate needed to prevent reloading artdeco script tag
        isCreate = badge.getAttribute('data-iscreate');
        uid   = parseInt(badge.getAttribute('data-uid'), 10);
        if (uid === badgeUid) {
          var badgeMarkup = `<body>${badgeHtml}</body>`
          var iframe = document.createElement('iframe');
          iframe.onload = function() {
            var iframeBody = iframe.contentWindow.document.body;
            // 5 px buffer to avoid the badge border being cut off.
            iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
            iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
          };
          iframe.setAttribute('frameBorder', '0');
          iframe.style.display = 'block';
          badge.appendChild(iframe);
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(badgeMarkup);
          iframe.contentWindow.document.close();
          replaceScriptTags(badge, isCreate);
        }
      }
      tryClean();
    }

  // These functions are needed because badge markup is added via innerHtml property which does not run script tags
  function replaceScriptTags(node, isCreate) {
    if (shouldReplaceNode(node, isCreate)) {
      node.parentNode.replaceChild(cloneScriptNode(node), node);
      childScripts[node.src] = true;
    } else {
      var i = 0,
          children = node.childNodes;
      while (i < children.length) {
        replaceScriptTags(children[i++], isCreate);
      }
    }
    return node;
  }

  function shouldReplaceNode(node, isCreate) {
    return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
  }

  function isScriptNode(node) {
    return node.tagName === 'SCRIPT';
  }

  function cloneScriptNode(node){
    var script  = document.createElement("script");
    for( var i = node.attributes.length-1; i >= 0; i-- ) {
      script.setAttribute( node.attributes[i].name, node.attributes[i].value );
    }
    return script;
  }

    // Gets all incoming responses
    window[CALLBACK_NAME] = responseHandler;

    /**
    * Tries to clean added tags
    **/
    function tryClean() {
      //Clean up after all requests are done..
      //Accounts for people including script more than once
      var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
      if (done) {
        delete window[CALLBACK_NAME];

        // remove all script tags
        scripts.map(function(script){
          document.body.removeChild(script);
        });

      }
    }

    /*
    * Makes Jsonp request, responses handles by CALLBACK_NAME
    * @param url String: url of server to make request to
    */
    function jsonp(url) {
      var script = document.createElement('script');
      script.src = url;
      scripts.push(script);
      document.body.appendChild(script);
    }
  };

  if (document.readyState === 'complete') {
    window.LIRenderAll();
  } else {
    window.addEventListener('load', window.LIRenderAll, false);
  }

})(window);
Popular Posts