Lesson 2.3Lesson 2.3 · Bringing CAD & BIM Into Unreal
Geometry Cleanup & Tessellation
Turning NURBS and CAD into well-behaved polygons - polycount, normals, coplanar faces, pivots and collision - and fixing the common import artifacts
Unreal does not draw your curves - it draws triangles that approximate them. Controlling that translation is the difference between smooth and faceted, light and heavy.
A real-time engine cannot render a mathematically perfect NURBS surface or a CAD spline. It draws one thing: triangles. So the moment your Rhino sphere or Revit dome crosses into Unreal, it is diced into a polygon mesh - and how finely it is diced decides whether it looks smooth or blocky, and whether it costs you a thousand triangles or a million.
This lesson is about owning that translation. You will learn to control tessellation, set a sensible polycount budget, and fix the artifacts imports leave behind - flipped normals, z-fighting coplanar faces, wrong pivots and missing collision. This is the craft that turns a raw import into geometry the rest of the pipeline can actually build on.
Smooth where the camera looks, light where it does not. Tessellation is aimed, never uniform.
Tessellation: math surfaces become triangle meshes
Your CAD and BIM tools describe form in two broad ways. NURBS modellers like Rhino store surfaces as exact mathematical descriptions - a curve is an equation, infinitely smooth at any zoom. BIM tools like Revit mix precise solids with procedural families. Real-time engines store and draw neither; they draw polygon meshes made of triangles. Tessellation is the conversion: approximating a smooth surface with enough flat triangles that the eye reads it as curved.
The key insight is that tessellation is a trade, and you control the dial. Dice a curve into a handful of segments and it renders fast but visibly faceted - you see the flats. Dice it into hundreds and it looks perfectly smooth but carries a heavy triangle load. Neither extreme is right; the sweet spot depends on how close the camera gets and how curved the surface is. The tessellation figure shows the same arc as true NURBS, as a coarse low-poly chain, and as a fine high-poly chain - same shape, wildly different triangle counts.
Datasmith and the CAD importer expose this through tessellation settings, usually as chord tolerance (how far the flat triangle may deviate from the true surface, in millimetres) and angle/normal tolerance (how many degrees the surface may turn before a new triangle is forced). Tighter tolerances mean more triangles and smoother results. As a feel for numbers: a chord tolerance around 0.1mm is extremely fine (reserve it for surfaces the camera pushes right up to), something in the 0.2-0.5mm range suits most hero architectural curves, and a looser value is plenty for background geometry. Angle tolerance works alongside it - a smaller angle catches tight curvature that a chord value alone would miss. The professional habit is to tessellate for the viewing distance: generous triangles on the hero curved facade the camera caresses, few on the distant curved railing nobody inspects.
There is a subtlety worth internalising: tessellation and the smoothness you see are two different things. Even a moderately faceted mesh can read as smooth if its normals are shaded smoothly (interpolated across the flats) rather than flat-shaded - the silhouette will still show facets, but the surface across the middle looks curved. So the honest rule is: tessellate enough that the outline of a curved form reads clean at its viewing distance, and let smooth normals do the rest. You can always re-import a surface with different settings if it facets in shot, so start moderate and tighten only where the camera demands it rather than cranking everything to maximum and drowning in triangles.
Chord tolerance = max gap between flat triangle and true curve. Angle tolerance = max turn before a new triangle.
Polycount: budgeting triangles like money
Every triangle costs something to draw, and real-time lives inside a hard frame budget - roughly 16ms per frame at 60fps, and tighter still for VR's ~90fps. So polycount (the triangle count in view) is a currency you spend deliberately. Blow the budget and the scene stutters; VR, which renders the world twice (once per eye), punishes it hardest of all.
Where does the budget go wrong? Almost always in over-tessellated small stuff. A single fully-modelled door handle with threaded screws can carry more triangles than an entire wall. Imported trees, ornate railings, bolts, pipes and duplicated furniture quietly balloon the count. The polycount figure sketches a rough interior budget - comfortable under a couple of million triangles in view, watchful into the mid-single-millions, and trouble beyond without help. Treat those as feel, not law; they move with your hardware.
Two forces relieve this. First, discipline: tessellate sensibly, delete unseen geometry, reuse (instance) repeated objects rather than duplicating unique copies, and use LODs - lower-detail versions of a mesh that swap in with distance (Module 9). Instancing deserves a moment: if your scene has two hundred identical chairs, importing them as two hundred unique meshes is far heavier than referencing one mesh two hundred times, both in memory and in draw calls (the per-object cost of telling the GPU to render something). Repeated architectural elements - balusters, mullions, pavers, light fittings - are exactly where instancing rescues a scene, so prefer components and blocks in the source app that Datasmith can bring across as instances.
Second, Nanite, Unreal Engine 5's virtualized geometry system, which streams and renders enormous triangle counts efficiently and dramatically relaxes the old polycount ceiling for opaque, rigid meshes. Nanite is genuinely transformative - a Nanite-enabled CAD import that would once have crippled the viewport can now spin smoothly - but it is not a licence to be careless: it has limits (it historically did not cover translucency, foliage or skinned meshes cleanly), it costs some memory and disk, and clean, sensibly built geometry still profiles better and behaves better in every case. Budget first; lean on Nanite second.
VR renders the world TWICE, once per eye - so its triangle budget is effectively halved. Respect it.
The usual suspects: normals, coplanar faces, pivots, collision
Beyond tessellation, four artifacts recur in almost every architectural import. Learn to spot and fix each.
Flipped normals. A face's normal is the direction it considers 'out'. If it points the wrong way, the surface renders dark, invisible or inside-out - the Unreal cousin of SketchUp's reversed faces. Fixes: correct it at the source, flip normals in Unreal, or as a quick patch assign a two-sided (double-sided) material so the face draws from both sides (at a small cost). Coplanar faces / z-fighting. When two surfaces occupy the exact same plane - a rug laid dead-flush on a floor, a decal coincident with a wall - the engine cannot decide which is in front and they flicker as the camera moves. This z-fighting is fixed by nudging one surface a few millimetres off the other so there is a clear winner.
Wrong pivots (origins). Datasmith often sets a mesh's pivot at the world origin or bounding-box centre, not where you would want to grab it. A door that should rotate about its hinge instead spins about its middle; a lamp you want to place by its base lifts off by its centre. Set pivots meaningfully - especially for anything you will move, rotate or make interactive with Blueprints in Module 7. Missing or wrong collision. Imported meshes may arrive with no collision, so in a walkthrough you fall through floors and walk through walls, or with auto-collision so crude it blocks doorways. Add appropriate collision - simple box or convex hulls for most architecture, and 'use complex as simple' sparingly for genuinely intricate shapes - so people can actually navigate the space. None of these are hard; they are just the standard tidy-up list every import needs.
Dark face? Check normals. Flicker? Coplanar z-fight - nudge it. Spins wrong? Fix the pivot. Fall through floor? Add collision.
A repeatable cleanup routine in Unreal
Put it together into a pass you run on every fresh import, ideally in this order.
One - triangulate the scale of the problem. Turn on the viewport's triangle statistics and wireframe view to see where the polycount actually lives; the offenders are usually obvious and few. Two - retessellate the heavy curved offenders by re-importing them with looser tolerances, or replace an over-detailed imported prop (that threaded handle) with a lighter version. Three - sweep for dark and inside-out surfaces, fixing normals at the source where you can, or applying two-sided materials as a stopgap. Four - hunt z-fighting by orbiting the camera and watching for flicker on floors, rugs, signage and stacked panels; nudge the loser off the shared plane. Five - set pivots on anything you will place, array or animate, and add collision to floors, walls and stairs so the space is walkable.
A note on tooling: Unreal ships a Datasmith / geometry cleanup toolkit and the broader modelling tools that let you do much of this in-engine - retessellate, weld, fix normals, set pivots, generate collision and simplify meshes - without a round-trip to the source app. For deep structural fixes, still prefer the source; for import tidy-up, the in-engine tools are fast. Either way, the goal is the same: hand the next stages of the pipeline - materials, lighting, interactivity, VR - geometry that is smooth where it should be, light enough to stay interactive, correctly lit, flicker-free, sensibly pivoted and walkable. Get the geometry right and everything downstream gets easier.
Stats + wireframe first - the polycount offenders are always a handful of objects, not the whole scene.
Tessellation
Converting NURBS/CAD surfaces into triangle meshes
Controlled by chord and angle tolerance; a trade between smoothness and triangle weight, tuned per viewing distance.
Polycount budget
The triangle count you can afford in view per frame
Currency against the frame budget; VR renders twice so it is effectively halved. Spend it on what the camera sees.
Normals
The 'outward' direction of each face
Flipped normals render dark or inside-out; fix at source, flip in-engine, or patch with a two-sided material.
Collision & pivots
Navigability and the point a mesh transforms about
Imports often lack collision (you fall through floors) and set pivots at the origin; set both, especially for interactive meshes.
Nanite
UE5 virtualized geometry for very high triangle counts
Relaxes the polycount ceiling for opaque rigid meshes; still excludes some cases and never excuses dirty geometry.
Workshop — take one messy import to production-clean
Bring in a curved, detailed model - a Rhino or CAD piece is ideal - and run the full geometry cleanup routine until it is smooth, light and walkable.
Unreal Engine 5 (its in-editor geometry/Datasmith cleanup tools); a curved or detailed source model, ideally from Rhino or a CAD format.
Goal: fix tessellation, normals, z-fighting, pivots and collision on a real import Inputs: a NURBS/CAD or detailed model; Unreal Engine 5 Time: ~50 minutes
- 1Import the model, then turn on triangle statistics and wireframe view. Identify the two or three objects carrying most of the polycount.
- 2Re-import (or retessellate) a heavy curved surface with looser and then tighter tolerances. Find the setting where it reads smooth in shot without exploding the triangle count.
- 3Orbit the camera slowly and hunt for dark inside-out surfaces (flipped normals) and flickering coplanar faces (z-fighting). Fix normals, and nudge one of each flickering pair a few millimetres apart.
- 4Pick an object you would want to interact with - a door or a lamp - and move its pivot to a meaningful point (the hinge, the base).
- 5Add simple collision to the floor, walls and stairs, then walk the scene in play mode and confirm you no longer fall through anything.
You’ll walk away with
One cleaned import with a documented before/after triangle count, at least one retessellated surface, fixed normals and z-fighting, one meaningfully-set pivot, and working collision you can walk on - plus a note on which fix made the biggest difference.
Three altitudes on the same idea
Read the band that fits you — or all three.
Curved and complex forms are where your imports get heavy and where they facet - so tessellation is your lever. A sweeping timber roof or a doubly-curved facade can look either glassy-smooth or crudely blocky depending purely on the tolerance you set, and it can cost you a thousand triangles or a million. Tessellate generously where the camera lingers, sparingly where it does not, and your signature forms read true without sinking the frame rate.
Interiors are full of the exact things that break imports: rugs on floors, panels on walls, decorative railings, detailed furniture. Coplanar flicker on a rug and z-fighting on stacked panels are interior-specific headaches - fix them by nudging surfaces apart a few millimetres. Set pivots on furniture and lamps so you can place and swap them cleanly, and your room stays crisp instead of shimmering.
Geometry cleanup is unglamorous and completely essential - it is the plumbing every archviz job runs on. Being fluent with tessellation tolerances, normals, z-fighting, pivots and collision means you can take any raw import and make it production-ready, which is precisely the reliability studios pay for. Practise the five-step cleanup routine until it is automatic, and heavy real-world imports stop scaring you.
“Nanite means polycount no longer matters, so I can import geometry at maximum tessellation and forget about it.”
Do it yourself
Think in triangles.
- 1Why must a Rhino NURBS surface be tessellated before Unreal can render it?
- 2What do chord tolerance and angle tolerance each control?
- 3Why is a VR polycount budget effectively half a desktop one?
- 4A rug on your floor flickers as you move. What is happening and how do you fix it?
- 5Give one thing Nanite helps with and one thing it does not fix at all.
The one line to carry out
Peer-reviewed journals & authoritative standards
- 01Tessellation (computer graphics) — Wikipedia, 2026.
- 02Non-uniform rational B-spline — Wikipedia, 2026.
- 03Polygon mesh — Wikipedia, 2026.
- 04Nanite Virtualized Geometry in Unreal Engine — Epic Games Developer Documentation, 2026.
- 05Level of detail (computer graphics) — Wikipedia, 2026.
You now have clean, well-behaved geometry in Unreal. Next we make it manageable and durable - a disciplined Content Browser, sensible sublevels, and using re-import and Direct Link to keep the scene alive as the design changes.
The author
Amogh N P
Architect, interior designer, and creative polymath. Studio Matrx began in his notebooks — his vision of design made honest, useful, and open to everyone. Its Academy is written and taught in his memory, and free, forever.
More about Amogh →