# Custom BufferGeometry From Scratch **Track:** Advanced 3D — Advanced Creative Coding — proposed (50) **Framework / surface:** three.js **Level:** Medium **Prerequisites:** 3D Coordinate Space & Meshes **In one line:** Hand-build position/normal/uv/index attributes; compute normals. ## Theory, aesthetics & inspiration A mesh, stripped to essentials, is a set of parallel arrays: vertex positions, surface normals, texture coordinates, and an index list that stitches them into triangles by reference rather than duplication. Building a BufferGeometry by hand—filling typed arrays directly—reveals the contract beneath every model loader and primitive in three.js, Ricardo Cabello's library. Normals, which govern how light reads across a surface, derive from the cross product of two triangle edges and can be averaged per vertex for smooth shading or kept per face for faceting; computeVertexNormals automates the former. The understanding is foundational: procedural geometry, deformation, and custom topology all begin with authoring these attributes deliberately.