Conception
Plusieurs points sont à noter quand à la réalisation du programme. D'une part, il faut lire les fichiers de modèle 3D puis faire un affichage multi-plateforme en OpenGL. Ce programme est aussi l'occasion de parler de la programmation Objective C++.
Par où commencer ?
Pour concevoir un lecteur de modèle 3D (ou mesh) en OpenGL. Un mesh est un objet constitué de polygones et derrière cette notion se cache un modèle mathématique impressionnant tel que la représentation du maillage, le calcul des volumes, les collisions, la déformations des polygones, la topologie et les espaces vectoriels, et j'en passe... L'idée est donc de partir d'une bibliothèque qui contient des outils sur la modélisation et le traitement des triangles et meshes. Ainsi cela facilite le travail et il n'est pas nécessaire de réinventer la roue. Il existe plusieurs bibliothèques de modélisation que vous pourrez choisir selon vos besoins. Ici, j'ai utilisé la bibliothèque VCG sous licence GPL, qui est très performante et facile à intégrer dans un projet.
Objective C++
L'utilisation de VCG nécessite de travailler en C++. Cependant, ici, nous travaillons sur un projet en Cocoa (Objective C). Alors comment s'en sortir? Et bien c'est ici qu'intervient l'Objective C++. En effet, ce langage va nous permettre de combiner Objective C et C++, ce sont les fameux fichiers d'extensions '.mm' que l'on retrouve dans le projet xCode. Cependant, il n'est pas nécessaire de renommer tous le fichiers '.m' (Objective C) en '.mm' (Objective C++). En effet, dans ce projet les interfaces tels que les menus, et écrans intermédiaires pour l'iPhone/iPad restent inchangée et seul les classes maniant l'OpenGL passerons en extension de fichier '.mm'. Ainsi la seule variable dans le code qui fera le pont entre l'objective C et C++ sera 'renderWindow', la fenêtre de rendu en OpenGL déclarée dans le contrôleur de classe ZMeshCGLViewController et qu'il faudra forcément allouer, manier et détruire en temps que pointeur (car l'objective C n'accepte pas des instances d'objet sans pointeur d'objet).