Blockbench

  • It is open-source.

  • It was initially developed for Minecraft.

  • Used to create low-poly models with pixel art.

Review (2024-06-21)
  • Compatibility:

    • Only supports other models exported in .obj.

  • Modeling:

    • It has a very simple and straightforward interface.

    • Moving things within the program is satisfying and precise due to its "pixel" snap.

    • I really like the 'Cube' and 'Mesh' objects. The Cube gives great freedom to create voxel-style things. It’s very practical.

  • UV:

    • I really like the feature that allows moving the UV and cropping the texture simultaneously.

    • The Unwrapping isn’t anything special. There are not many options beyond 'smart uv with texture' and 'project from view'.

    • I didn’t see any unwrapping that enhances pixel art aesthetics, though there was a visible effort from the app to make the UV symmetrical and horizontal, which is good for painting faces.

    • I liked that the UV is created right when a texture is made, and that its properties are based on Texel Density rather than a poor unit like 'texture size'.

  • Painting:

    • I like the ability to view the pixel grid while painting.

    • The interface is much friendlier and provides more comfort when painting.

  • Rigging and animation:

    • Quite underwhelming, though simple. Many tools are missing.

    • I usually prefer Blender since it at least supports deformations with weight painting and IKs.

    • Still, it’s quite relaxing and pleasant. Inferior but peaceful.

  • Importing:

    • .obj:

      • Works without issues. Sometimes you might need to fix the scale.

      • Textures also export correctly, kind of. I find textures a bit volatile when dealing with .obj.

  • Exporting:

    • .gltf:

      • Importing as .obj (scale x16) and exporting as .gltf (scale x16) gives a result identical to the original in Blender.

      • Everything in Blockbench is exported, not just the selection.

      • Result from Blender -> Blockbench (.obj) -> Blender (.gltf):

        • The mesh is correct but triangulated.

          • (.gltf does not support quads or n-gons).

        • The texture is correct.

    • .obj:

      • Result from Blender -> Blockbench (.obj) -> Blender (.obj):

        • The mesh is correct and remains in quad format.

        • The texture appears blurred because it uses linear filtering; just change that.

    • .fbx:

      • Result from Blender -> Blockbench (.obj) -> Blender (.fbx):

        • Blender crashed when trying to import the .fbx, giving catastrophically broken results and lagging the engine badly.

Sources

Websites
Tutorials

Interface

Blockbench Units (pixel block)

Pixel block (simplified as PB)
  • 1 'pixel block' is defined as the pixel of the Pixel Grid (if the Pixel Grid is in the default 16 mode) in edit mode.

    • A Cube can have a size smaller than 1 PB when using shift or ctrl.

  • "In Minecraft, a pixel on the texture corresponds to a pixel on the model (1 unit of scale in Blockbench)."

  • "The dimensions of a Minecraft block are 16x16x16 pixels, representing 1mÂł, meaning a single pixel is 6.25cm long."

Block
  • 1 'block' = 16x16x16 PB by default.

  • By default, the grid of the 2D Painting mode is also defined as 1 '2D Block' = 16x16 px.

Grid

  • Changing the grid alters snap options but not the definition of what a Blockbench Unit (pixel block) is.

    • This is valid whether the grid is set to Pixel Grid or something else.

Limit Box
  • Represents a 48x48x48 PB region, which symbolizes a 3x3x3 meter  area, if  you export the object using a 'Model Export Scale' of 16.

  • This relates only to Minecraft version limitations .

    • "The limit isn't imposed by Blockbench itself but by Minecraft rendering mechanics. If you remove the limit, you’ll most likely end up with a purple cube."

Scaling

Model Export Scale
  • "How many PBs are there in 1 meter?"

  • Defines the reduction  factor from the original model to Blockbench.

  • Default reduction factor is 16, meaning a model 16 PB high in Blockbench will be 1 meter tall when exported.

Geometry

Cube
  • 2x2x2 PB

  • I changed it to 16x16x16 PB .

    • This makes the cube 1x1x1 meter , if  exported using a 'Model Export Scale' of 16.

  • Resize only moves the selected face.

  • Does not allow selecting edges or vertices.

Meshes
  • Resize performs a "scale" of the selected face.

  • Edges and vertices can be selected, allowing Merge, Dissolve, etc.

UV

Auto Scale
  • "In per-face UV mapping, Blockbench offers the Auto UV feature, which correctly scales the mapping of a face."

  • Apparently makes the UV pixel-perfect, keeping the correct scale given the chosen px/m density.

Conditions for Unwrapping
  • Cube:

    • Can be Box UV or Per-face UV.

  • Meshes:

    • Only Per-face UV.

Techniques
Box UV
  • "In box UV mapping, the map of the elements is unwrapped automatically and works for all faces by default."

    • No idea what that means.

  • "That means the texture mapping will only use whole numbers and round down if needed. To avoid stretched or invisible faces, ensure cube sizes stick to whole numbers."

Project From View

Painting

Resolution
  • Indicates the number of pixels (px) in 1 Block.

  • "16x is the default resolution of Minecraft."

Techniques
  • Sample Color:

    • Use Alt + Left Click to sample.

  • Gradient:

    • Always goes from selected color to transparent.

  • Straight lines:

    • "Click at the start of the line, then hold shift at the end of the line."

  • Tiling:

    • "The best way to preview tiling is by creating a wall of 3x3 blocks."

External Workflow
  • "You can open it in your image editor. Any changes will appear in Blockbench as soon as you save the texture."

Minecraft Style Guide

Materials

  • Apparently, PBR Material settings are automatically saved if exported as .gltf.

PBR Material uses
  • Texture:

    • Closest.

  • Roughness:

    • 1.0

  • Alpha:

    • Alpha Clip (for opaque) or Alpha Blend (for translucent).

  • Backface Culling:

    • Disabled.

Emission
  • Using Emissive Textures .

    • Two methods are explained:

      1. Simply paint a generic texture used in the Blender shader as Emission; this texture cannot display brightness in Blockbench.

      2. Set up an Emissive Texture in Blockbench itself, allowing the brightness to be seen there.

Rigging

Limitations and doubts
  • It is not possible to do 'Deform with Weights', meaning animations can only move parts, not deform them.

  • % I don’t know how to make a "rotation target" (e.g., elbows).

  • I imagine some kind of baking is needed for animations to work correctly.

Concepts and best practices
  • "'Groups' and 'Bones' are essentially the same in this context."

  • "Root bone":

    • "A good practice is to use a root bone for each model and place everything inside it. This allows animating the entire model or specific parts later."

  • Ideal naming:

    • "You can right-click a group or press F2 to rename it. Bone names should be in 'snake_case' (lowercase letters, numbers, underscores). Each bone name must be unique for future animation reference."

Rig
IK
  • *How to make:

    • Uses an Anchor (Locator) and a Null Object.

    • Anchor (Tip):

      • Placed at the lowest Bone in the chain.

      • It’s an "empty Bone", serving as the Null Object target.

      • You can use a Bone instead of an Anchor, but Anchor is more intuitive.

    • Null Object (IK Controller):

      • Placed at the top Bone in the chain.

      • "Reposition the Null object circle a bit away from the tip of the lowest bone in the chain."

      • Right-click the Null Object and select 'IK Target -> Anchor'.

    • *Example:

      • Null Object  + (leg_r  -> shin_r -> Anchor ).

        • The Null Object is a sibling of leg_r.

  • How to create an IK-controlled chain .

Animation

Animation
  • The interface is definitely simple and intuitive.

  • Animations only consider folders ("Bones") created during rigging.

  • The editor includes a 'Graph Editor', allowing interpolation, Bezier curves, etc. Quite nice. You can even define curves using math functions, e.g., math.cos(query.anim_time * 90) * 32 .

  • To reuse an animation on another character, folder ("Bone") names must match exactly; classic.

  • Tutorial {4:27 -> end} .

Walkthrough
  • https://www.youtube.com/watch?v=y0ees2j17AY

  • https://www.youtube.com/watch?v=INMAlO5tiIA

  • https://www.youtube.com/watch?v=sc-dsCZ-2Ck

  • https://www.youtube.com/watch?v=fcvKOpI3o88

Format

.bbmodel
  • ".bbmodel files are JSON-based. That does not mean they are compatible with other types of JSON files. The exact specifications of the format are listed below. The format is mainly intended as an internal format for saving Blockbench projects. If you want to create a model loader or a similar system that works with Blockbench, it’s recommended to create a separate custom format via a Blockbench plugin instead of relying on bbmodel files. However, in some cases, it makes sense to work directly with .bbmodel files."

Import 'something -> Blockbench'

.obj
  • .

Export 'Blockbench -> something'

.gltf
  • *General:

    • '.gltf Binary (.glb)' vs  '.gltf ASCII (Embedded .gltf)':

      • '.gltf ASCII' doesn’t generate a .bin. It’s an 'Embedded .gltf', partially binary and partially .json.

      • They work identically, but .glb is simply more optimized for games.

        • For the door  model:

          • .glb: 14 KB.

          • .gltf Embedded: 18.3 KB.

      • By default, neither format needs any other file; no .bin or texture files.

        • However, Godot  extracts the embedded textures from both formats.

    • By .gltf format default, geometry is converted from Quad/N-gon to Tri.

    • Scale:

      • Using 'Model Export Scale' of 16:

        • 16 PB == 1 meter.

  • *Godot:

    • Orientation:

      • The XYZ axis in Blockbench is identical to the XYZ axis in Godot.

    • File names:

      • The root Node3D name is 'blockbench_export'.

      • Then there’s a useless Node3D named Node containing the rest.

      • The remaining nodes are normal.

    • Texture:

      • Without using 'Embedded Textures' but with a texture assigned to a mesh:

        • No texture was used in the engine, even with it in the same directory as the .gltf.

      • Using 'Embedded Textures' with a texture assigned to a mesh:

        • The texture was applied correctly.

        • Godot  still exports a duplicate texture in the directory named {gltf_filename + _0 + .png}.

      • Material:

        • If a texture is used in a model, its Material differs from Godot’s default:

          • Transparency:

            • Alpha Scissor.

          • Cull mode:

            • Disabled.

          • Albedo:

            • Only texture application.

          • Sampling:

            • Nearest.

            • Repeat Off.

    • Animation:

      • *Independent of using 'Export Group as Armatures'.

      • Using 'Export Animations' with two Blockbench animations:

        • Both appeared in the exported AnimationPlayer.

        • Each was linked to its corresponding Node3D (bone) from Blockbench.

        • Postfixes:

          • Bone postfix:

            • No effect.

          • Mesh postfix:

            • Used like Blender does.

          • Animation postfix '-loop':

            • Animation loops in Godot.

            • Animation name excludes postfix.

            • Editing animation loop property in Blockbench does not  affect Godot.

        • Animation duration matches Blockbench exactly.

          • Ex: 0.5s in Blockbench == 0.5s in Godot.

        • Animation length defined by the last keyframe position; not  by the blue ]  marker.

        • Animation names are {animation_name}.

    • Armature:

      • .gltf (Binary):

        • Without 'Export Group as Armatures':

          • Each 'Group' (Bone) becomes a Node3D in Godot.

        • With 'Export Group as Armatures':

          • .

      • .gltf (ASCII):

        • Without using 'Export Group as Armatures':

          • Each 'Group' (Bone) becomes a Node3D in Godot.

        • Using 'Export Group as Armatures':

          • .

  • *Blender:

    • Texture:

      • Without using 'Embedded Textures', while using a texture associated with a mesh:

        • No texture was used on the object inside the engine, even though the texture was saved in the same directory as the .gltf.

      • Using 'Embedded Textures', while using a texture associated with a mesh:

        • The texture was correctly applied to the mesh.

        • Blender   does not  make a texture be “spat out” (duplicated) into the directory; only Godot  does that.

      • Material:

        • If the texture is used in a model, the Material used has the following settings:

          • Blend Mode:

            • Alpha Clip.

          • Backface Culling:

            • Disabled.

          • In the texture:

            • Nearest.

            • Extend.

    • Animation:

      • Independent of whether 'Export Group as Armatures' is used.

      • Using 'Export Animations', while 2 animations were made in Blockbench:

        • The 2 animations appeared in the NLA Editor linked to the Empty related to the created animation; that is, perfect.

        • The names of the “loose animations” are {animation_name + group_name_in_blockbench}.

        • The names of the animations in the NLA Editor are {animation_name}.

    • Armature:

      • .gltf (Binary):

        • Without using 'Export Group as Armatures':

          • Each 'Group' (Bone) becomes an Empty in Blender.

        • Using 'Export Group as Armatures':

          • .

      • .gltf (ASCII):

        • Without using 'Export Group as Armatures':

          • Each 'Group' (Bone) becomes an Empty in Blender.

        • Using 'Export Group as Armatures':

          • .

.obj (limiting)
  • Does not have a popup configuration interface, but is influenced by settings in 'Settings->Export'.

  • About:

    • Only supports basic geometry and does not even support object transforms.

  • For Blender / Godot:

    • Orientation:

      • .

    • Scale:

      • Using 'Settings->Export->Model Export Scale' of 16:

        • 16 PB == 1 meter.

      • Using 'Settings->Export->Model Export Scale' of 8:

        • 16 PB == 2 meters.

    • Geometry:

      • Using 'OBJ Face Export Mode' in 'Default':

        • Quads remained Quads.

        • Tris remained Tris.

    • Texture:

      • .

    • Animation:

      • When creating 2 default animations in Blockbench:

        • Does not  export any animation, only geometry.

    • Armature:

      • .

.dae / Collada (confusing, unpopular, do not use)
  • About:

    • Open-source like .gltf. Created by the same group that made .gltf.

    • Fell into disuse:

      • Not much used because it is laborious to parse:

        • Requires parsing .XML.

        • Has confusing specifications, making parsing more difficult.

      • Many exporters are old/broken.

      • It is text-based, which makes it slow.

.fbx (license problems, do not use)
  • About:

    • FBX is used via the FBX SDK, which has a very restrictive license. This license makes it very hard to use in open source projects (an EULA must be accepted by the user unless a special license is purchased from Autodesk).

    • Besides the legal issues, implementing the library is rather difficult and suffers many of the same format ambiguity issues Collada does.

  • .fbx (Binary) for Blender:

    • .

  • .fbx (Binary) for Godot:

    • .

  • .fbx (ASCII) for Blender:

    • In Blender: ERROR: "ASCII FBX files are not supported".

  • .fbx (ASCII) for Godot:

    • Orientation:

      • .

    • Scale:

      • Using 'Settings->Export->Model Export Scale' of 16:

        • 16 PB == 1 meter.

      • Using 'Settings->Export->Model Export Scale' of 8:

        • 16 PB == 2 meters.

    • Texture:

      • .

    • Animation:

      • Using 'Export Animations', while 2 animations were made in Blockbench:

        • The 2 animations appeared normally in the AnimationPlayer of the export.

        • Each animation was linked to its respective Node3D, corresponding to the 'Group' (bone) in Blockbench.

        • Suffixes:

          • If the 'Group' (Bone) in Blockbench has any suffix:

            • Nothing happens.

          • If the 'Mesh' in Blockbench has any suffix:

            • That prefix will be used, just as it is in Blender.

          • If an animation has the suffix '-loop':

            • The animation will loop in Godot.

            • The animation name will be only {animation_name}, without the suffix.

            • Editing the animation properties in Blockbench to indicate looping does not  affect anything in Godot.

        • The animation duration will be exactly the same as in Blockbench.

          • Ex: 0.5s in Blockbench == 0.5s in Godot.

        • The animation length is defined by the blue ] ; not  by the position of the last keyframe.

        • The animation names are {animation_name}.

    • Rigging:

      • .

    • File names:

      • The root Node3D name is the same as the .fbx file name.

      • The rest of the nodes are normal.

Plugins

  • MTools.

    • Very nice.

  • Colour Gradient Generator.

    • Very, very nice.

  • WASD Controls.

    • Doubtful. Only allows toggle of the button; does not allow button hold.