Studio Matrx Monthly · Volume 1 · Issue 3 · August 2026
Amogh N P
 In loving memory of Amogh N P — Architect · Designer · Visionary 
Geometry Cleanup & TessellationLesson 2.3
RTV for Architecture, Planning & Urban Design/Module 2 · Bringing CAD & BIM Into Unreal

Lesson 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

14 min Interactive lessonFree · open lessonByAmogh N P· Architect & interior designer
The hook

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.

TESSELLATION: SMOOTH TO POLYGONSTRUE NURBSexact math curveCOARSE (low poly)faceted, few trianglesFINE (high poly)smooth, heavier meshReal-time draws triangles, not math. Chord and angle tolerance set how finely curves are diced.
Zoom
Tessellation as a trade. A true NURBS curve is exact math; real-time must approximate it with triangles. A coarse tessellation is faceted but cheap; a fine one is smooth but heavy. Chord and angle tolerance set how finely curves are diced - tune it for the viewing distance.

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.

POLYCOUNT BUDGET (typical interior)reads wellwatch ittoo heavyunder ~2M tris in view~2M to 6M tris in viewover ~6M without Nanite: expect stutter, especially in VRWHERE TRIS HIDEOver-tessellated railings, bolts, threaded pipes, imported trees, and duplicated furnitureblow the budget fast. Nanite (Module 9) relaxes this - but clean geometry still wins.
Zoom
A rough polycount budget for a real-time interior: comfortable under a couple of million triangles in view, watchful into the mid-millions, trouble beyond without help. Over-tessellated railings, hardware, pipes and duplicated furniture hide most of the cost. Nanite relaxes this, but clean geometry still wins.

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.

Techniques & terms in this lesson

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.

Hands-on workshop

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.

Given & goal
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
  1. 1Import the model, then turn on triangle statistics and wireframe view. Identify the two or three objects carrying most of the polycount.
  2. 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.
  3. 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.
  4. 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).
  5. 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.

The worked example

Three altitudes on the same idea

Read the band that fits you — or all three.

For the architectImmersive design & client experience

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.

For the interior designerWalkable interiors & material studies

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.

For the studentReal-time skills, portfolio & archviz jobs

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.

Misconception check

Nanite means polycount no longer matters, so I can import geometry at maximum tessellation and forget about it.

Nanite genuinely relaxes the old triangle ceiling - its virtualized geometry streams and renders very high polycounts efficiently for opaque, rigid meshes, and it is one of the reasons UE5 handles CAD-dense scenes so well. But 'relaxed' is not 'irrelevant'. Nanite has boundaries: it has historically not covered translucency, foliage cards or skinned/deforming meshes cleanly, so glass, plants and animated objects still live on the classic budget. It also does not excuse flipped normals, z-fighting, bad pivots or missing collision - none of which Nanite touches. And a scene of clean, sensibly built geometry still profiles better, imports faster and behaves more predictably. Treat Nanite as a powerful safety net that lets you keep more detail, not as permission to stop thinking about geometry.
Try it

Do it yourself

Think in triangles.

  1. 1Why must a Rhino NURBS surface be tessellated before Unreal can render it?
  2. 2What do chord tolerance and angle tolerance each control?
  3. 3Why is a VR polycount budget effectively half a desktop one?
  4. 4A rug on your floor flickers as you move. What is happening and how do you fix it?
  5. 5Give one thing Nanite helps with and one thing it does not fix at all.
Take this with you

The one line to carry out

Real-time draws triangles, not math, so you own the translation: tessellate curves for the viewing distance, budget polycount against the frame time, and clean up normals, z-fighting, pivots and collision before handing the geometry downstream.
Take it further
References & further reading

Peer-reviewed journals & authoritative standards

  1. 01Tessellation (computer graphics)Wikipedia, 2026.
  2. 02Non-uniform rational B-splineWikipedia, 2026.
  3. 03Polygon meshWikipedia, 2026.
  4. 04Nanite Virtualized Geometry in Unreal EngineEpic Games Developer Documentation, 2026.
  5. 05Level of detail (computer graphics)Wikipedia, 2026.
Related lessons
Recap
Real-time engines draw triangles, so every NURBS and CAD surface is tessellated into a polygon mesh on import, and you control the smoothness-versus-weight trade with chord and angle tolerance, tuned per viewing distance. Polycount is a budget against the frame time - halved again for VR - so spend it deliberately, lean on LODs and Nanite but do not get careless. Then fix the recurring artifacts: flipped normals, coplanar z-fighting, wrong pivots and missing collision. Clean geometry makes every later stage easier.
Carry forward →

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.

A

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 →