Traversal
A BSP tree is traversed in a linear time, in an order determined by the particular function of the tree. Again using the example of rendering double-sided polygons using the painter's algorithm, to draw a polygon P correctly requires that all polygons behind the plane P lies in must be drawn first, then polygon P, then finally the polygons in front of P. If this drawing order is satisfied for all polygons in a scene, then the entire scene renders in the correct order. This procedure can be implemented by recursively traversing a BSP tree using the following algorithm. From a given viewing location V, to render a BSP tree,
- If the current node is a leaf node, render the polygons at the current node.
- Otherwise, if the viewing location V is in front of the current node:
- Render the child BSP tree containing polygons behind the current node
- Render the polygons at the current node
- Render the child BSP tree containing polygons in front of the current node
- Otherwise, if the viewing location V is behind the current node:
- Render the child BSP tree containing polygons in front of the current node
- Render the polygons at the current node
- Render the child BSP tree containing polygons behind the current node
- Otherwise, the viewing location V must be exactly on the plane associated with the current node. Then:
- Render the child BSP tree containing polygons in front of the current node
- Render the child BSP tree containing polygons behind the current node
Applying this algorithm recursively to the BSP tree generated above results in the following steps:
- The algorithm is first applied to the root node of the tree, node A. V is in front of node A, so we apply the algorithm first to the child BSP tree containing polygons behind A
- This tree has root node B1. V is behind B1 so first we apply the algorithm to the child BSP tree containing polygons in front of B1:
- This tree is just the leaf node D1, so the polygon D1 is rendered.
- We then render the polygon B1.
- We then apply the algorithm to the child BSP tree containing polygons behind B1:
- This tree is just the leaf node C1, so the polygon C1 is rendered.
- This tree has root node B1. V is behind B1 so first we apply the algorithm to the child BSP tree containing polygons in front of B1:
- We then draw the polygons of A
- We then apply the algorithm to the child BSP tree containing polygons in front of A
- This tree has root node B2. V is behind B2 so first we apply the algorithm to the child BSP tree containing polygons in front of B2:
- This tree is just the leaf node D2, so the polygon D2 is rendered.
- We then render the polygon B2.
- We then apply the algorithm to the child BSP tree containing polygons behind B2:
- This tree has root node C2. V is in front of C2 so first we would apply the algorithm to the child BSP tree containing polygons behind C2. There is no such tree, however, so we continue.
- We render the polygon C2.
- We apply the algorithm to the child BSP tree containing polygons in front of C2
- This tree is just the leaf node D3, so the polygon D3 is rendered.
- This tree has root node B2. V is behind B2 so first we apply the algorithm to the child BSP tree containing polygons in front of B2:
The tree is traversed in linear time and renders the polygons in a far-to-near ordering (D1, B1, C1, A, D2, B2, C2, D3) suitable for the painter's algorithm.
Read more about this topic: Binary Space Partitioning