../

Core 3D concepts

The ideas every 3D tool shares, without the tool: scenes, axes and units, transforms, meshes and normals, topology and polygon budgets, UVs, draw calls, how a renderer turns triangles into pixels, and which file format keeps what. Surfaces and light are in Materials, textures & lighting, motion in Animation & rigging concepts. For the how-to, see Blender and the export sheets.

The mental model

A scene is a tree of objects. Each object has a transform (where it is, how it is turned, how big it is) and may carry mesh data (the shape), materials (how the surface reacts to light), or be a light or camera. A renderer looks through the camera and turns all of it into pixels, one frame at a time.

 Scene
  ├─ Object  (transform: position · rotation · scale)
  │    ├─ Mesh      vertices, edges, faces, normals, UVs
  │    └─ Material  base color, roughness, metallic, textures…
  ├─ Object (child)  inherits its parent's transform
  ├─ Lights          sun, point, spot, area, sky (HDRI)
  └─ Camera ──► renderer ──► pixels (one frame; 60 per second in a game)
ConceptBlenderthree.jsGodot 4
SceneScene (with collections)Scenescene tree (a root Node3D)
Object with a transformObjectObject3DNode3D
Empty / groupEmptyGroupNode3D
Mesh shapeMesh data-blockBufferGeometry inside a MeshMesh resource in a MeshInstance3D
MaterialMaterial (node tree, Principled BSDF)MeshStandardMaterialStandardMaterial3D
LightLight objectDirectionalLight, PointLight…DirectionalLight3D, OmniLight3D…
CameraCamera objectPerspectiveCameraCamera3D

Object and data are separate: many objects can share one mesh (Blender "linked duplicates"), which is the same idea engines call instancing.

Coordinate systems & handedness

Every tool picks an up axis and a handedness. Right-handed: point your right thumb along +X and your index finger along +Y; your middle finger is +Z. Left-handed tools flip one axis, which mirrors everything.

Blender Z-up, right-handed +Z up +X +Y back −Y: model front Front view (numpad 1) looks toward +Y glTF · three.js · Godot Y-up, right-handed +Y up +X −Z: cameras look here +Z: model front Godot: FORWARD = −Z, MODEL_FRONT = +Z glTF export with +Y Up: (x, y, z) → (x, z, −y), so Blender −Y becomes +Z boxed: the way a character or car should face · dashed: a negative axis
Blender is Z-up; glTF, three.js and Godot are Y-up. The exporter rotates between them.
Tool / formatUpHandedForward conventionUnits
Blender+Zrightmodel front faces −Y (Front view looks toward +Y)1 unit = 1 m
glTF 2.0+Yrightasset front faces +Zmeters
three.js+Yrightcameras look down −Z; lookAt turns other objects' +Z to the targetunitless, use meters
Godot 4+YrightVector3.FORWARD = −Z (cameras, nodes); imported models face +Z (MODEL_FRONT)1 unit = 1 m
Unity+Yleft+Zmeters
Unreal+Zleft+X (Epic has announced a move to right-handed Y-up, starting with UEFN)centimeters
GTA V (RAGE)+Zright+Y (heading 0 = north)meters

How exporters convert:

  • Blender → glTF: the exporter's +Y Up option (on by default) maps (x, y, z) to (x, z, −y). Model facing −Y in Blender, and it arrives facing +Z: what glTF, three.js and Godot's MODEL_FRONT expect.
  • Blender → FBX: the exporter has Forward / Up axis settings; Unity and Unreal convert on import. The classic symptom of a mismatch is a model lying on its back, or a root object rotated −90° on X.
  • Blender → GTA V: same axes, so Sollumz (the Blender add-on for GTA files) exports without a swap; see GTA V.
  • A negative scale on one axis mirrors the object, which flips handedness, face winding and normals. Apply it and recalculate normals before export.

Units & scale

Tool1 unitNote
Blender1 m (Unit Scale 1.0, Metric)keep the default
glTF, Godot, three.js1 mthree.js has no units; physics and lights assume meters
Unreal1 cmexporters multiply by 100
FBXcarries a unit-scale fieldmismatches show up as 100× or 0.01×

Why an object's scale should read 1.0 before export:

  • Modifiers (bevel width, solidify thickness, array offsets) and physics use the scaled size, so an object scaled 0.1 behaves like something ten times smaller than its numbers say.
  • Non-uniform scale (e.g. 2, 1, 1) skews normals and distorts children and rotations.
  • Rigs, retargeting, collision shapes and lightmap UV density all expect scale 1.
  • Exporters carry object scale inconsistently; a mesh with scale baked in is the same everywhere.

Apply scale bakes the object's scale into the vertex positions and resets the scale to 1 (Blender: Object > Apply > Scale, Ctrl A). Apply rotation the same way for static props; see Blender modeling.

Real-world sizes for blocking out scenes and buildings (rules of thumb):

ThingSize
Adult person1.6–1.9 m tall; eye height ~1.6 m
Interior door~2.0–2.1 m tall, 0.8–0.9 m wide
Ceiling height (home)2.4–3.0 m; one story ≈ 3 m floor to floor
Stair step~0.17–0.19 m rise, ~0.25–0.30 m run
Table / counter~0.75 m / ~0.9 m high
Car~4.5 m long, ~1.8 m wide, ~1.5 m tall

Transforms & hierarchies

TermMeaning
Position (location, translation)where the object's origin is, in meters
Rotationhow it is turned: Euler angles or a quaternion
Scalesize multiplier per axis; 1 = as modeled
Transform matrixthe three combined into one 4×4 matrix (applied as scale, then rotate, then translate)
Local spacerelative to the parent (what the inspector shows)
World spacerelative to the scene origin
Parent / childa child's world transform = parent's world transform × child's local transform
Origin / pivotthe point an object rotates and scales around; the mesh's (0, 0, 0)
Car (root) local (10, 0, 0) world (10, 0, 0) Body local (0, 0, 0) world (10, 0, 0) Wheel_FL local (0.8, 0.35, 1.3) world (10.8, 0.35, 1.3) Door_L, hinge origin local (0.9, 0.6, 0.2) world (10.9, 0.6, 0.2) Handle local (−0.4, 0.1, 0.05) world (10.5, 0.7, 0.25) world = parent's world transform × local transform Move Car: every child follows. Rotate Door_L: it swings around its origin (the hinge), and Handle swings with it.
Children store positions relative to their parent; world positions are computed down the tree.

Put the origin where the object pivots: a door at its hinge, a character or building at floor level (center of the feet), a wheel at its axle. Engines rotate around the mesh's origin, so a misplaced origin means doors that orbit and characters that float.

Euler angles vs quaternions

Euler anglesQuaternion
Stored asthree angles, applied in an order (XYZ, YXZ…)four numbers (x, y, z, w)
Readableyes: "rotate 90° on Z"no
Gimbal lockyes: when the middle axis turns 90°, two axes line up and one degree of freedom is lostno
Interpolationcan spin the long way or flipsmooth shortest path (slerp)
WhereBlender objects default to XYZ Euler; three.js rotation; Godot rotation (YXZ order by default)Blender bones default; glTF stores all rotations; three.js quaternion; Godot quaternion / basis

Edit in Euler, let the engine store quaternions. If an animated rotation flips at 180°, switch it to quaternions or run Blender's Euler discontinuity filter.

Mesh anatomy

A mesh: 12 vertices, 17 edges, 6 faces vertex a point (x, y, z) edge: joins 2 vertices face normal face direction Face types quad tri n-gon quad: 4 sides; engines split it into 2 triangles (dashed) tri: 3 sides, what GPUs draw n-gon: 5+ sides, splits oddly; flat faces that never bend
Vertices, edges, faces and a face normal; quads split into two triangles.
TermMeaning
Vertexa point: position (x, y, z), plus per-vertex data (normal, UVs, color, bone weights)
Edgea straight line between two vertices
Face (polygon)a flat surface bounded by 3+ edges
Tri / quad / n-gona face with 3 / 4 / 5 or more sides
Face corner (loop)a vertex as used by one face; UVs and split normals live here
Winding orderthe order a face's vertices are listed in; counter-clockwise seen from the front is the front side (glTF, OpenGL)
Vertex colora color stored per vertex or corner; masks, tinting, cheap AO
Manifold / watertightevery edge is shared by exactly two faces: a closed surface with no holes

GPU vertex count ≠ modeling vertex count. The GPU needs one vertex per unique combination of position, normal and UV, so every UV seam and hard edge splits vertices. A 1,000-vertex model can upload as 1,500.

Non-manifold geometry (holes, an edge shared by 3+ faces, interior faces, zero-area faces, duplicate vertices) breaks booleans, 3D printing, volume and collision generation, and some bakes. Fix it with Merge by Distance and by deleting interior faces; see Blender modeling.

Normals

A normal is a unit vector saying which way a surface faces. Lighting is computed from it.

TermMeaningLooks like
Face normalperpendicular to a faceone flat shade per face
Vertex normalaverage of the surrounding faces, interpolated across each facesmooth shading
Flat shadingeach face uses its face normalfaceted, low-poly look
Smooth shadingvertex normals blended across facescurved look on the same geometry
Hard edge / sharp edgenormals split along chosen edgescrisp corners, smooth elsewhere (Blender 4.1+: Smooth by Angle)
Flipped normalnormal points into the objectdark or missing faces, inverted lighting
Backface cullingskip faces whose back side faces the cameraflipped faces become holes
ToolCulls back faces by default?Setting
Blender viewport and rendersno: both sides rendermaterial Backface Culling checkbox
glTFyes, unless the material is doubleSidedexported from the Blender material setting
three.jsyesmaterial.side = THREE.DoubleSide
GodotyesStandardMaterial3D Cull Mode

That table explains the most common beginner bug: a model looks fine in Blender and has holes in the engine. Turn on Blender's Face Orientation overlay (blue = outside, red = inside) and recalculate normals outward; use double-sided materials only for truly thin things (leaves, paper, cloth).

Topology & polygon budgets

Topology is how faces are laid out across a surface, independent of its shape.

TermMeaning
Edge loopa ring of edges running around a form (around an eye, a limb, a column)
Edge ringthe edges crossed by a loop, side by side
Polea vertex with 3 or 5+ edges; loops end or split there; keep poles off bending areas
Subdivision surfacesmooths a cage by splitting every quad into 4 (Catmull-Clark)
Retopologyrebuilding a dense sculpt or scan as a clean, light mesh
Decimate / simplifyautomatic triangle reduction; fine for static props, bad for deforming ones

Why quads while modeling:

  • Loop cuts and loop selection work, so you can add detail where it is needed.
  • Subdivision smooths quads predictably; triangles and n-gons pinch.
  • Deforming parts (joints, faces) bend cleanly with loops around them: give an elbow or knee ~3 loops.

Why engines triangulate: GPUs only draw triangles, so every quad becomes 2 tris and an n-gon becomes n − 2. A quad's split direction changes how it shades when it bends, so triangulate before baking a normal map so the bake and the game use the same triangles. Count budgets in triangles.

Triangle budgets (rules of thumb, not limits; test on your weakest target device):

TargetTrianglesAlso watch
Mobile web, whole scene100k–300kdraw calls in the low hundreds, textures ≤ 2K
Desktop web, whole scene500k–2Mtexture memory, shadows
Indie game hero character15k–60kbone count, 1–3 materials
Hero prop (weapon in first person)5k–20knormal map carries the detail
Background prop (crate, chair, rock)50–2,000share one texture atlas or trim sheet (see UV mapping)
Building exterior at mid distance1k–20kLODs (lighter distance versions), trim sheets
GTA V vehicle, highest LOD (community figure)60k–120klower LODs down to ~1k; see GTA V

UV mapping

UVs are 2D coordinates stored per face corner that say which pixel of a texture lands on which part of the surface. U runs horizontally, V vertically, 0 to 1 across the image. Unwrapping is flattening the mesh like a cardboard box cut open.

TermMeaning
Seaman edge where the mesh is cut open; textures may show a line there, so hide seams in creases and undersides
Island (shell)one connected flat piece of the unwrap
Stretching / distortionan island's shape doesn't match the 3D face; a checker texture shows it
Texel densitytexture pixels per meter of surface; keep it consistent so nothing looks blurrier than its neighbor
Padding (margin)empty pixels between islands so mipmaps don't bleed colors across seams
Overlapping UVsseveral faces share the same texture area: mirrored halves, tiling, repeated bolts; saves memory
Unique UVsevery face has its own area; required for baked AO, normal maps and lightmaps
UV channel (UV map)a mesh can hold several; the second is often the lightmap UV
Tiling texture / trim sheeta repeating texture, or one texture with strips (trims) many meshes map onto; standard for buildings

Lightmaps need unique, non-overlapping UVs, usually in a second UV channel (Godot can generate one on import for LightmapGI). Texel density rules of thumb: first-person games ~512–1024 px/m, third-person ~256–512 px/m, web product views: whatever keeps a 1K–2K texture sharp at the closest zoom.

The V axis points up in Blender and OpenGL but down in glTF; exporters and GLTFLoader handle the flip, so don't flip it by hand. How to unwrap: Blender materials & UVs.

Draw calls, instancing & LOD

A draw call is one command from the CPU telling the GPU "draw this mesh with this material". Each mesh × material is at least one draw call, and each costs CPU time regardless of triangle count, so 2,000 tiny objects are slower than one 200k-triangle mesh. The web is the most sensitive: aim for draw calls in the low hundreds on phones.

TechniqueWhat it doesthree.jsGodotBlender side
Mergejoin static meshes that share a material into onemergeGeometries (BufferGeometryUtils)merge before exportJoin (Ctrl J)
Atlas / trim sheetmany objects share one material and texturefewer materialssamepack UVs into one texture
Instancingdraw one mesh many times in one call, each with its own transformInstancedMesh, BatchedMeshMultiMeshInstance3Dlinked duplicates; glTF "GPU Instances" (EXT_mesh_gpu_instancing)
LOD (level of detail)swap in lighter meshes with distanceLODautomatic mesh LOD on import; visibility rangesmodel or decimate LOD1, LOD2…
Frustum cullingskip objects outside the camera's viewautomatic per objectautomatickeep huge meshes split so parts can cull
Occlusion cullingskip objects hidden behind othersmanual / librariesOccluderInstance3Doccluder meshes
Impostor / billboarda camera-facing picture of a far objectspritesSprite3D, billboardsrender to texture

Transparent surfaces cost extra: they are drawn back to front, can't be merged freely, and overlapping layers shade the same pixel many times (overdraw). Prefer alpha-clip (cutout) for leaves and fences.

Rendering: rasterization vs ray tracing

RasterizationRay / path tracing
Howproject each triangle onto the screen and shade the pixels it coversshoot rays from the camera, bounce them off surfaces toward lights
Speedreal time (milliseconds per frame)offline (seconds to minutes per frame) unless GPU-accelerated and denoised
Shadows, reflections, bounce lightapproximated: shadow maps, screen-space effects, probes, baked lightmapsfall out of the physics: soft shadows, true reflections, global illumination
Noisenonegrainy until enough samples; denoisers help
Wheregames, three.js, Godot, Blender EEVEE, Blender viewportBlender Cycles, film and product renders, baking; hybrid RT in some games

Blender has both: EEVEE (rasterizer with screen-space ray tracing since 4.2; seconds per frame, close to what an engine shows) and Cycles (path tracer; the reference for realism and the engine used for baking). A Cycles render will always look richer than the same scene in three.js or Godot; bake lighting into textures to close the gap. See Lighting & rendering in Blender.

The real-time GPU pipeline, once per frame:

 CPU   scene graph ─► cull ─► sort ─► draw calls (mesh + material + uniforms)
                                          │
 GPU   vertex shader      per vertex: object → world → camera → clip space
          ▼
       primitive assembly, clipping, perspective divide → screen coordinates
          ▼
       rasterizer         triangles → fragments; interpolate UVs, normals
          ▼
       fragment shader    per pixel: material + lights → color
          ▼
       depth test, blending → framebuffer → post-processing → display

Watch for how vertex shading, rasterization and pixel shading map onto the steps above:

How do Video Game Graphics Work? (opens in a new tab) (Branch Education, YouTube)

Frame budget: the CPU and GPU work in parallel, and the slower one sets the frame rate.

TargetFrame time
30 fps (cinematic, low-end mobile)33.3 ms
60 fps (standard for games and web)16.7 ms
90 fps (VR minimum)11.1 ms
120 fps (high-refresh displays)8.3 ms

File formats

FormatKeepsLoses / limitsUse it for
.blendeverything: modifiers, node materials, rigs, constraints, drivers, scenesBlender only (Godot can import it by running Blender headless)your working source file; keep it
glTF 2.0 (.gltf + .bin + images, or one .glb)meshes, PBR metal/rough materials and textures, hierarchy, skins, morph targets, TRS animation, cameras; lights, compression, instancing via extensionsprocedural node materials (bake), modifiers (applied), constraints / IK / drivers (bake), particlesthe default for web and Godot; the "JPEG of 3D"
FBX (.fbx)meshes, skins, animation, blend shapes, basic materialsproprietary, versioned SDK; materials unreliable; axis and unit surprisesUnity / Unreal pipelines, Mixamo
OBJ (.obj + .mtl)geometry, UVs, normals, simple non-PBR materialno animation, rigs, hierarchy transforms or PBRstatic meshes, quick interchange, many AI generators
USD (.usd, .usda, .usdc) / USDZwhole scenes with layers, references, variants, materials, animationheavy for games; engine support variesfilm/VFX pipelines; USDZ (zipped USD) for Apple AR Quick Look
STL (.stl)triangles onlyno UVs, colors, units or materials3D printing
GTA V (.ydr, .yft, .ytd…)game-specificneed Sollumz + CodeWalkersee GTA V

Loading glTF in code is in three.js models & animation; the Blender side is in Export to three.js and Export to Godot.

Glossary

TermMeaning
Albedobase color with no lighting or shadow in it
Alphaopacity channel; clip (cutout) or blend (see-through)
Armature / skeletonthe bone hierarchy that deforms a mesh
Bakerender something expensive (lighting, detail, procedural texture) into an image
Bounding boxthe smallest box around an object; used for culling and picking
DCCdigital content creation tool: Blender, Maya, 3ds Max, Houdini
Draw callone CPU → GPU request to draw a mesh with a material
Frustumthe pyramid-shaped volume a perspective camera sees, cut by near and far planes
Gimbal locklosing a rotation axis when two Euler axes line up
GI (global illumination)light that bounces off surfaces onto others
HDRIa 360° high-dynamic-range photo used as sky and light source
Instancingdrawing one mesh many times in a single call
Keyframea stored value at a point in time; the computer fills in between
LODlevel of detail: lighter versions of a mesh for distance
Lightmapa texture holding precomputed lighting
Manifoldclosed surface where every edge joins exactly two faces
Materialthe description of a surface's look: color, roughness, metalness, maps
Meshvertices, edges and faces that form a shape
Mipmappre-shrunk copies of a texture for distant surfaces
Modifiera non-destructive operation stacked on a mesh (Blender)
Morph target / shape key / blend shapea stored alternate vertex layout, blended by weight
N-gona face with more than four sides
Normalthe direction a surface faces
Normal mapa texture of normals that fakes small detail
Origin / pivotthe point an object transforms around
PBRphysically based rendering: materials described by real-world properties
Polycounttriangle (or face) count of a model or scene
Quaternionfour-number rotation without gimbal lock
Rasterizationdrawing triangles by filling the pixels they cover
Retopologyrebuilding a mesh with clean, light topology
Shadera GPU program that computes positions (vertex) or colors (fragment)
Skinningdeforming a mesh with bones via per-vertex weights
Texelone pixel of a texture as it lands on a surface
Topologyhow faces and edge loops are arranged on a surface
Transformposition, rotation and scale
Triangulatesplit every face into triangles
UV2D texture coordinates on a mesh
Z-fightingtwo surfaces at the same depth flicker through each other

Recipes

Before you export anything

Run this on every asset before it leaves Blender; most "broken model" reports come from skipping one line.

  • Real-world size; object scale 1.0 and rotation applied on static meshes
  • Origin where the object pivots or stands (feet, hinge, axle, building base)
  • Front faces −Y in Blender (so it faces +Z in glTF / Godot)
  • Normals point outward (Face Orientation overlay all blue); no stray double-sided surfaces
  • Merge by Distance done; no interior or zero-area faces
  • Every mesh unwrapped; lightmapped meshes have a unique second UV map
  • Triangle count inside your budget; LODs made for anything seen at distance
  • Materials are Principled BSDF + image textures only; procedurals baked
  • Clear, unique object names (engines look nodes up by name)
  • Hidden helpers, unused materials and cameras removed, or excluded with Limit to Selected
  • Open the export in a second viewer (three.js editor, Godot, a glTF viewer) before building on it

Why does my model look faceted, inside-out or full of holes?

Match the symptom to the cause before touching topology.

SymptomLikely causeFix
Faceted, "low-poly" look on a curved surfaceflat shadingShade Smooth, then Smooth by Angle for hard edges
Smooth surface with dark smudges or streaksbad custom normals, n-gons or long thin trianglesclear custom split normals; add supporting loops; triangulate evenly
Faces missing in the engine, fine in Blenderflipped normals + backface cullingrecalculate outside; check Face Orientation
Whole model inside-out after exportnegative scaleapply scale, recalculate normals
Black seams along UV edgesno padding, or mip bleedingmore island margin; dilate/bleed the texture
Flickering where two surfaces meetZ-fighting (coplanar faces) or near plane too smalldelete one surface or offset it; raise the camera's near clip

Pick a poly budget

Use when starting an asset, so detail goes where the camera will see it.

  1. Name the target and frame rate (phone browser at 60 fps, desktop game at 60, offline render).
  2. Take the whole-scene figure from the budget table and split it: hero objects get most, background props share the rest.
  3. Ask how close the camera gets: silhouette detail needs geometry; surface detail goes in the normal map.
  4. Model to the budget, then triangulate and read the triangle count (Blender: Statistics overlay).
  5. Build LODs for anything that is also seen far away (roughly half the triangles per step).
  6. Profile on the real device; cut draw calls and texture size before cutting triangles.

Model arrives at the wrong size or rotation

Use when an export is tiny, huge, lying down or facing backwards.

SymptomCauseFix
100× too big or smallcm vs m (FBX, Unreal, Mixamo)set unit scale on export or import; keep Blender at 1 unit = 1 m
Lying on its backY-up vs Z-up not convertedglTF: keep +Y Up on; FBX: set Forward / Up axes
Faces away from the cameramodeled facing +Y in Blenderrotate 180° on Z and apply rotation
Rotates around a far-away pointorigin not on the objectset the origin (to geometry or 3D cursor) and re-export
Children offset or skewedunapplied or non-uniform parent scaleapply scale on parents first, then children

Speed up a slow scene

Use when frame time is over budget; measure first (three.js renderer.info, Godot's Monitors and Visual Profiler).

  1. Draw calls: merge static meshes, share materials via atlases or trim sheets, instance repeats.
  2. Transparency and overdraw: switch blend to alpha-clip where possible.
  3. Shadows: fewer shadow-casting lights, smaller shadow distance.
  4. Textures: KTX2 or other GPU-compressed formats, ≤ 2K on mobile, mipmaps on.
  5. Triangles: LODs, decimate background props.
  6. Lighting: bake static lighting instead of computing it every frame.

References