A while ago I experimented with 3D SpaceSyntax and efficient computation of 3D isovists and other local properties like signed distance volume voxels, etc… .
It was part of my GI-Radiosity Program and uses the same core algorithm to get a massive amount of scene-intersections and texture updates in reasonable interactive times.
The datapoints were computed for all surface texture locations as well as a regular 3D grid of voxels.
Now, it can be quite difficult to develop and verify these evaluations and results in 3D.
So to further improve the 3D algorithms it feels like a good idea to use a similar approach in 2D. I’ve already built a 2D GI-Radiosity solver which works in real time, and also uses (more or less) the same global-line algorithm as the 3D version does. This is really neat, because without any overhead I can basically port the 2D evaluations directly to 3D and vice versa.
This post starts off with some local isovist properties I have been working on lately. The Model used in the screenshots is the “gallery.dxf” scene that comes with DepthMapX.
My implementation uses the aforementioned 2D “Global Line Radiosity” method and is built in Java/Processing and iterates entirely on the GPU using OpenGL and GLSL shaders.
This is one of the most common evaluations. At each location the area of the visible space is computed. https://en.wikipedia.org/wiki/Isovist
An approach to visualize the “compactness” or roundness of the isovists. Red areas for example mark “strechted out” locations that have access to very large areas and at the same time are somewhat squeezed in its surroundings.
This is still WIP as I am still experimenting here.
Average Axis Length
At each location the average length of all axis passing through is computed. It also gives somehow a useful shading for Ambient Occlusion.
Average Axis Length, normalized by the Isovist radius
At each location the average axis length is computed and normalized by the Isovist.
I Find this one particularly interesting since it somehow shows the level of “blobbiness” of a space and its separation through straight axis.
Maximum Axis Length
For each location the longest axis passing through is computed.
Maximum Axis Length, clamped
For each location the longest axis passing through is computed. The maximum axis length is clamped to a smaller value.
Interestingly this very simply change (in contrast to no clamping) kind of uncovers a network of paths and transition zones.
Maximum Axis Length, normalized by the Isovist
For each location the longest axis passing through is computed and normalized by the Isovist Axis.
The difference to computing the maximum-axis-only is, that it distinguishes a long axis from just a very long strechted but still compact space.
Maximum Axis Length, clamped and normalized by the Isovist
Same as above, but again with a clamped maximum length.
Minimum Axis Length
Mimum Axis Length at each location. (Much less interesting than i expected it to be.)
Maximum distance from a location to its surrounding space.
Mimimum distance from a location to its surrounding space. This basically returns the classic signed distance field.
For developing and comparing I’ve integrated a couple more test-scenarious. One of those is this simple 2D Layout and Isovist mapping.
It actually was a while ago and a result of a conversation I had with Sam McElhinney since I started this 2D space syntax analysis to create these simple local evaluations.
Sam gives a nice overview of further more specialized spatial isovist measures here:
The next post will cover some aspects of 2D global measures.