3D modelling of the built environment
Course Content
The main topics described in the course are:
- voxel models and voxelisation;
- constructive solid models (CSG) and Nef polyhedra;
- (constrained) tetrahedralisation;
- the industry foundation classes (IFC);
- CityGML and CityJSON; and
- applications of 3D models (eg calculation of volumes and solar potential).
Checkout my lab repository
A1: Simple polyhedron processing
For this assignment I implemented a method to simplify a 3D city model by merging neighbouring buildings into blocks. This method involved the following steps:
- read the triangles in the input 3D city model from an OBJ file and load it into a data structure;
- for each triangle, compute its (expanded) bounding box;
- use the bounding boxes to find pairs of neighbouring triangles;
- assign groups of neighbouring triangles to blocks;
- in each block, store all the points of its triangles’ vertices;
- for each block’s points, compute its convex hull and its min/max z values;
- using each block’s convex hull and min/max, create triangles for its output roof, floor and wall geometries;
- output the triangles to an OBJ file.
A2: Enriching the 3DBAG with new attributes
In its current form, the 3DBAG dataset contains for each of the 10M+ buildings in the Netherlands:
- the 3D geometry at three LoDs: 1.2+1.3+2.2
- several attributes, eg the construction year, the height of the ground, the type of roof, current status of the building, etc.
For this assignment, we are asked to calculate a few useful attributes (those can be useful for others when processing the 3DBAG files) and to add them to the file. The attributes are namely:
- volume
- orientation
- area+orientation of the "RoofSurface" surfaces
- geometric difference between the LoD1.3 and LoD2.2 (with Hausdorff distance)
The updated model must be delivered in the CityJSON format.
A3: BIM to Geo conversion using Boolean set operations on Nef polyhedra




The aim of this assignment is to implement a BIM to Geo conversion for one building. In short, this will involve five steps:
- converting the BIM model to OBJ using IfcConvert;
- loading each object in the OBJ file(s) into a CGAL Nef polyhedron;
- processing the Nef polyhedra into a single big Nef polyhedron representing the space filled by the building’s floors, walls, windows and so on;
- extracting the geometries representing the building’s exterior surface and individual rooms;
- writing the geometries to a CityJSON file with correct semantics.
Everything was implemented in C++ with the help of packages from the CGAL library and Niels Lohmann’s JSON for Modern C++ library.