How Homework 2 was marked

First I compiled and ran your code to reproduce your submitted output. Then I checked if the bk.json was valid with cjio validate and val3dity. Next was a visual inspection of bk.json in ninja (orientation + grouping) and with blender (face merging + holes). Finally I read your report.

Compiles and runs

mesh grouping

correct mesh orientations

face merging

holes

CityJSON valid [1]

Report

Discussion with other group

General feedback

Based on the reports I really got the impression that almost everyone got a good grasp on the DCEL datastructure. I’m very pleased with that.

Basically everyone got the OBJ import, the orientation and the CityJSON more or less right. The face merging and hole detection was clearly a bit more tricky and not everyone did that. However even without that many teams still got a very good mark.

For the orientation people used different methods. The fastest method was based on selecting the highest vertex in a mesh, then finding the incident edge with the lowest slope and then picking the triangle with the highest vertex opposite to that edge. If this triangle points upward, it has the correct orientation. However, most people picked a method based on ray intersection testing (as described in the assignment). Notice that it is important in this case that you define a ray that is guaranteed to intersect the mesh (and ideally any manifold mesh). I have not been very critical on this point as it was not an explicit requirement in the assignment, but for some teams it probably would have been possible to create a mesh where their orientation test would fail.

Quite a few teams did a successful hole detection (in addition to proper face merging). Well done! The idea is basically to find the incident rings to a face after merging. And then decide for each ring if it is interior or exterior. I saw a few different methods to decide this. 1) based on the length of the rings. This is not very robust, as the interior ring can in theory be much long than the exterior ring that contains it. 2) based on the signed area of three consecutive points in the ring. This is also not robust, since a ring is often not convex. 3) based on the signed area of the entire ring. This is the way to go as that should always work.

Finally, not all teams seem to have validated their CityJSON output with cjio and val3dity. This was written in the assignment description! Eg. some teams had made BuildingParts without a parent Building, which is not schema valid CityJSON. Make sure to check these things for the next assignment!