Чтобы вершина выглядела гладкой, ее нормаль должна быть средним из нормалей смежной грани (или чего-то подобного), но не перпендикулярно плоскости грани (кроме случаев, когда вы имели в виду среднюю плоскость всех смежных граней).
GL_FLAT означает, что цвет лица не интерполируется по треугольнику, а берется из одного угла треугольника (не знаю, какой, первый или последний).Этот цвет происходит либо от цветов вершин, либо от освещения вершин, так что на самом деле вы получаете нормали для каждой грани, но это не обязательно направление граней, а нормали угловой вершины.
Если вы получили для каждой вершины нормалив файле OBJ вам не нужны детали.Но вы можете использовать их для вычисления вершинных нормалей.Части s являются группами сглаживания и должны интерпретироваться как 32-битные битовые поля.Таким образом, на самом деле существует 32 различных группы сглаживания, и каждое лицо может быть частью более чем одной.Таким образом, все грани после линии "s 5" являются частью групп сглаживания 1 и 3 (установлены первый и третий биты).Когда две соседние грани являются частью одной и той же группы сглаживания, ребро между ними является гладким (вершины имеют общие нормали).Таким образом, вы можете восстановить необходимые нормали для каждой вершины.