I've received the model you've send. I'll give a look to implement shader to support object space normal map in our engine.
You see #DOT3# when opening in the viewer due to the fact your mtl material file assign a normal map to a height map,
spec says:
The image used for a bump texture represents the topology or height of the surface relative to the average surface. Dark areas are depressions and light areas are high points. The effect is like embossing the surface with the texture.
We're converting the height map to a tangent space normal map on the fly with the #DOT3# appender.
To assign normal map in mtl file, you can use map_normal instead if you have control to the tool which generates the model.
1. After generating an orthonormal TBN for each face, do I then generate a TBN for each vertex by averaging the TBN's of all faces associated with a vertex?
After computing tangent vector of each face, you should compute the tangent for each vertex by averaging like for normal. Ie for a given vertex, sum tangents of all face using it and then average and normalize. To make sure tangent and normal are perpendicular, we're using a gram schmidt orthogonalization of the tangent relatively to the normal vector before the normalization.
2. Once I have a TBN system (ie after averaging) for each vertex, how do I compute the normal values of a pixel within the face, do I use some interpolation method where I interpolate the normals in tangent space of all the 3 vertices associated with that face?
To convert from object to tangent space, basically you'll have to convert the texture from the object space (which you can consider as the usual x/y/z axis) to the tangent space system which is local for each vertex. This means, you'll have to browse all triangle, lookup in the normal texture for the triangle area used by the triangle uv. For each pixels within this area, compute the tbn space (interpolated between the 3 triangle vertices) and convert the original normal in tangent space.
The most easy way to implement that is probably using opengl directly (which can be done offscreen inside a batch tool): render the model unwrapped (similarly to UV tab of the Mesh panel of the viewer) with a specific shader which will have output the normal in tangent space. Then just copy the contains of the framebuffer in an image file.