Subterranean Sydney: A cross-section of Town Hall Station made with iPhone LiDAR

Image and poster is licensed CC BY-NC 4.0. Feel free to share it, but don’t sell it! Better yet, share this blog post.

The above poster is an orthographic (ie. no perspective) render of a 3D model of the underground train station.

I created a 3D model by walking around the station holding an iPhone 14 Pro running the 3D Scanner App, combining the segments in the 3d modelling software Blender and rendering it out as an image.

Aren’t the escalator and staircase crossovers a beautiful symmetrical pattern? I had no idea that’s how they were arranged. I think it’s a wonderful way to visualise architecture.

If you would like to download and print your own A3 poster, here are some high resolution copies. All are licensed CC BY-NC 4.0.

Enjoy!

Read on if you’d like to learn more about how to create a model of your own local train station or a multi-story building.

Subscribe to Jake’s blog

Or follow on Mastodon – @[email protected]

* indicates required

Continue reading below

Table of contents

Behind the scenes

Different segments, ordered front (left) to back (right)
Front (left) to back (right)
View from the front, north end
View from the front, south end

Overview of method

  • install the 3D Scanner App on an iPhone that supports LiDAR (iPhone Pro 12 or later, 2020+ iPad Pro)
  • slowly walk around with the app to generate a 3D LiDAR model
  • importing the 3D models into Blender
  • align the models
  • cleaning up any “noise” and chopping off half of some objects
  • render the model to an image
  • create a nice poster in Adobe InDesign!

Detailed method

Setting up your iPhone

These instructions are similar to those for my blog post on Generating aerial imagery with your iPhone’s LiDAR sensor.

I recommend using the app titled 3d Scanner App as it allows considerable customisation of the scan settings, though other scanning apps like Polycam would also work. It allows finishing a scan and extending later, though this can be buggy. I haven’t had a crash during capture – I’ve had Polycam crash halfway through a large scan losing all data.

Download 3d Scanner App and use the LiDAR Advanced mode. I recommend the using the following options for scanning streets:

  • Confidence to low if you need the maximum 5 metre range for the sensor, otherwise set it to medium for a less noisy model
  • Range to 5.0 metres
  • Masking to None
  • Resolution to 50mm (the lowest – for large models like buildings or streets)

In the app settings, make sure to set:

  • Units to metric
  • GPS can be turned on but likely won’t help you underground!

Capturing the model

Note that any commercial photography in a train station will require paperwork and special permission. Amateur/hobbyist/student use of a hand-held mobile device appears to be permitted in Sydney train stations, just treat it like taking a photo/video for Instagram or Tiktok – don’t photograph people and keep an eye on your surroundings.

The safety precautions are common sense, but have a read. Be careful not to cross over the yellow line when scanning. People will introduce artefacts into the model, so go in off peak or on a weekend to minimise crowds. The resolution and accuracy of the LiDAR scanning is not high enough to present any security concerns (any more than an Instagram photo).

When scanning, walk slowly with a sweeping motion to increase the maximum scanned width. If the area is wide enough to require a grid pattern, follow the same shape as a drone survey (an S-shape with considerable overlap). Not enough overlap or higher speeds mean the linear passes don’t connect correctly due to (I assume) inertial measurement unit drift.

Aligning and cleaning the models

You will likely need to do multiple takes of your desired building, and then combine them together.

Share your models from 3D scanner app as OBJ via Airdrop (or your preferred method), decompress the ZIP file and then import the OBJ into Blender (File -> Import -> Wavefront (.obj)).

Some basic Blender skills come in handy here – it’s not an easy program to use, and I am no expert. If you haven’t used it before I recommend following a beginner blog post or video tutorial. A few specific tips:

  • Make liberal use of the numpad preset views: 1 for front on, 3 for side view, 7 for top, and 5 for toggling perspective
  • To remove noise or parts you don’t want, select the object, change into edit mode (tab key), and then change the Viewport Shading to Wireframe (with the globe button in the top right). Dragging with the left mouse button will select areas, or click c to drag a circle to select vertices (with +/- keys enlarging the circle).
    • Changing the shading to Wireframe means that you can select vertices “hiding” behind others that may not be directly visible
  • I couldn’t figure out how to disable perspective and get the framing I wanted in a proper render, so I did a Viewport render with the background set to white, Material Preview as the Viewport Shading mode and Toggle X-Ray to remove the grid
    • The background still wasn’t perfectly white even though I set it to be, I had to use levels in Photoshop to get the background #FFFFFF. This may just be an error on my part!

Possible future improvements

  • Capturing pointclouds instead of meshes, aligning them in Cloudcompare (I believe there are tools for aligning pointclouds), then either rendering straight to an image or generating a mesh and rendering only faces/normals facing the camera
  • Reducing drift in capturing models. This would be algorithm heavy; maybe utilising survey markers or just known positions in a station, using Record3D, exporting sequences of .obj models (1 per frame), then constructing offline.
  • A cross section from the north or south would be interesting! (this view is from the west looking east)
  • Is it possible to create an accurate model with less takes? This would require less stitching in Blender
  • Are there ways to create a full 3D model, then just not render faces/normals that aren’t facing the camera?
    • Better yet, not rendering faces/normals that are less than x degrees incident to the camera to reduce noise for flat surfaces
  • How to handle glass surfaces better (LiDAR isn’t great with glass out of the box)
  • 3D printing models

Please let me know if you use this as inspiration for modelling stations elsewhere!

Related/further reading

  • 3D maps (orthographic projection) of every London Underground station
Diagram by TfL

6 responses to “Subterranean Sydney: A cross-section of Town Hall Station made with iPhone LiDAR”

  1. This is awesome! I have enough trouble finding the platform I’m going to; I admire your dedication to finding all the routes!

  2. Super cool to see it like that, thanks! Now I understand a bit more why the escalators are always at the end of my platform. Do you think they’ll ever upgrade the station to make the people part more spacious, or is the assumption that Metro will solve that by moving people across to it?

    • Thanks!

      > Do you think they’ll ever upgrade the station to make the people part more spacious, or is the assumption that Metro will solve that by moving people across to it?

      I think it would be incredibly hard & expensive to upgrade the station. From memory the Metro was intentionally not routed via Town Hall to relieve congestion.

Leave a Reply

Your email address will not be published. Required fields are marked *