Block Geometry Limits vs Entity Models
Before deciding how to present a structure, you have to choose between a custom block model and an entity model. Custom blocks using the `minecraft:geometry` component are bound by a strict 30x30x30 pixel size limit, positioned within a narrow boundary around the block space. If your structure is a small shrine, a two-block-tall statue, or a compact crafting station, a single block geometry will handle it cleanly.
For anything larger—such as a house preview, a bridge, or a multi-block altar—block geometry will fail validation or clip out of existence. In these cases, you must use an entity. Entity models have no hard pixel dimension cap in their JSON definitions, allowing you to represent an entire building as a single `.geo.json` file anchored to an invisible, stationary dummy entity.
| Approach | Size Limit | Best Used For |
|---|---|---|
| Block (`minecraft:geometry`) | 30x30x30 model units | Small props, 1x2x1 machines, detailed single-block furniture |
| Entity (`minecraft:client_entity`) | Unrestricted (bound by render distance) | Building placement previews, large structures, animated gates |
| Structure Block Wireframe | 64x384x64 blocks | In-game debugging and exporting, not stylable via resource packs |
Converting a Structure to Bedrock Geometry
To present a structure as an entity or item, you first need it in the `minecraft:geometry` format (`format_version` `1.12.0` or `1.16.0`). You cannot point a client entity definition at a `.mcstructure` file in a behavior pack. Instead, capture your build in-game using a Structure Block, export the `.mcstructure` file, and convert the block data into a `.geo.json` mesh using an external modeling tool like Blockbench, or reconstruct the simplified hull of the building by hand.
When converting a build into a single geometry file, keep face counts under control. An exported structure that retains every hidden interior block face will cause severe frame drops when rendered as an entity. Strip out unseen interior cubes, merge coplanar faces where possible, and group logical parts of the structure (such as roofs, walls, or moving doors) into distinct bones so they can be animated or toggled independently.
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.wiki.watchtower_preview",
"texture_width": 128,
"texture_height": 128,
"visible_bounds_width": 8.0,
"visible_bounds_height": 12.0,
"visible_bounds_offset": [0.0, 5.0, 0.0]
},
"bones": [
{
"name": "root",
"pivot": [0.0, 0.0, 0.0]
},
{
"name": "foundation",
"parent": "root",
"pivot": [0.0, 0.0, 0.0],
"cubes": [
{
"origin": [-24.0, 0.0, -24.0],
"size": [48.0, 16.0, 48.0],
"uv": [0, 0]
}
]
},
{
"name": "upper_tower",
"parent": "foundation",
"pivot": [0.0, 16.0, 0.0],
"cubes": [
{
"origin": [-16.0, 16.0, -16.0],
"size": [32.0, 64.0, 32.0],
"uv": [0, 64]
}
]
}
]
}
]
}Setting Up a Hologram Preview Entity
A common gameplay pattern is showing a translucent preview of a structure before committing to placing the real blocks via `/structure load` or the Script API's `StructureManager`. To achieve the ghostly hologram look, assign your structure geometry to a client entity and use a translucent material such as `entity_alphablend`.
Make sure your texture file has an alpha channel set to partial opacity (around 40% to 60% opacity works well in most lighting conditions). When the player moves or rotates the preview marker, the entity renders the entire structure footprint in real time without modifying a single block in the world until they confirm placement.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "wiki:watchtower_preview",
"materials": {
"default": "entity_alphablend"
},
"textures": {
"default": "textures/entity/watchtower_preview"
},
"geometry": {
"default": "geometry.wiki.watchtower_preview"
},
"animations": {
"align_to_grid": "animation.wiki.watchtower_preview.align"
},
"scripts": {
"animate": [
"align_to_grid"
]
},
"render_controllers": [
"controller.render.default"
]
}
}
}Locking Structure Orientation with Animations
By default, entities can rotate smoothly across any yaw angle, and their bodies may interpolate rotation when spawned or teleported. Real block structures, however, only ever sit aligned to the world grid in 90-degree increments. If your preview entity turns smoothly with the player's head rotation, it will not match where the `.mcstructure` actually lands.
You can force a structure model to snap to the cardinal grid or scale it down into a miniature projection using a resource pack animation. Using Molang inside the animation's bone rotation, you can counteract the entity's natural body yaw or snap it to 90-degree steps using `math.round`. The example below locks the `root` bone to 90-degree increments based on the entity's `query.body_y_rotation`, ensuring the visual preview matches actual structure placement rules.
{
"format_version": "1.8.0",
"animations": {
"animation.wiki.watchtower_preview.align": {
"loop": true,
"bones": {
"root": {
"rotation": [
0.0,
"math.round(query.body_y_rotation / 90.0) * 90.0 - query.body_y_rotation",
0.0
],
"scale": 1.0
}
}
}
}
}Preventing Frustum Culling on Large Models
The biggest hurdle when rendering a structure-sized model on an entity is frustum culling. Minecraft decides whether to draw an entity by checking if its bounding box is currently inside the player's camera view. If a player stands right next to a massive watchtower preview and looks up at the roof, the entity's foot position at the ground might leave the bottom of the screen, causing the entire structure to vanish instantly.
To prevent this, you must configure `visible_bounds_width`, `visible_bounds_height`, and `visible_bounds_offset` inside the `description` block of your `.geo.json` file. These values are measured in blocks (not model pixels; 1 unit equals 16 model pixels). Set the width and height large enough to enclose the entire structure, and raise the Y value of `visible_bounds_offset` to sit at the vertical center of your building.
Which versions this applies to
Applies to Bedrock Edition 1.16.0 and newer. Geometry format 1.12.0+ and Client Entity 1.10.0 are completely stable and do not require any experimental toggles.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The entire structure preview disappears when looking up or walking close to its edges. | The `visible_bounds_width` and `visible_bounds_height` in the geometry description are too small, causing the rendering engine to cull the model when the entity's origin leaves the screen. | Increase `visible_bounds_width` and `visible_bounds_height` in your `.geo.json` file to match the structure's size in blocks, and adjust the Y value of `visible_bounds_offset` to half the structure's height. |
| Content Log Error: [Blocks][error]-block_name | minecraft:geometry | Block geometry exceeds maximum allowed size. | You attached a large structure model directly to a custom block using `minecraft:geometry`, exceeding the 30x30x30 pixel boundary rule for blocks. | Move the large geometry onto a dummy entity for presentation, or slice the model into multiple 16x16x16 block geometries and place them adjacent to each other. |
| The hologram preview renders completely solid instead of semi-transparent, or flickers weirdly through itself. | The client entity is using the `entity` or `entity_alphatest` material, which only supports fully opaque or fully invisible pixels, or interior cube faces are fighting for depth sorting. | Change the material in the client entity definition to `entity_alphablend` and remove hidden interior faces from the geometry mesh. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
