Une question que je me pose souvent est: «comment puis-je charger des modèles 3D en OpenGL ES?".
Bien sûr, la réponse à cette question est loin d'être simple. Si vous avez suivi mes mes posts antérieurs sur l'importation de fichiers Wavefront OBJ, Vous êtes probablement au courant de cela déjà. Il ya plusieurs formats de fichiers, et aucun d'entre eux sont idéales pour les charger dans un appareil aux ressources limitées comme l'iPhone.
Apple recommande que les objets 3D sont stockées dans des fichiers en-tête comme des tableaux statiques. Ceci évite la nécessité de faire toute opération de chargement ou de transformer ou de conversion du tout. Mais ... il n'y a pas vraiment de moyen facile de créer ces fichiers d'en-tête de l'intérieur des logiciels 3D.
Eh bien, il ya un moyen maintenant. Le programme open source 3D appelé Blender a une architecture très extensible, ce qui rend relativement facile d'écrire des modules d'exportation personnalisé. L'architecture de Blender est basé sur des scripts Python, un langage que je ne suis pas particulièrement familier, mais je piraté quelque chose qui fonctionne. Alors, disons que vous avez un objet dans Blender:

Cliquez pour voir agrandir
Et vous voulez le charger dans un programme que vous écrivez pour votre iPhone:

Cliquez pour voir agrandir
Remarque, je sais que les screenshots ne correspondent effectivement - je recadrée de la texture après l'exportation de Blender pour le rendre plus iPhone de taille - je ne voulais pas pour le redimensionner, de peur que la texture serait trop petit pour voir.
Tout ce que vous avez à faire est de prendre ce script et l'installer dans le dossier des scripts de Blender.
Il ya un hic, cependant. La version Mac OS X de Blender ne suivent pas les règles SAMES comme il le fait pour les autres plateformes. Si vous cherchez comment installer un script dans Blender, il vous dira d'ajouter le script dans ~ / .blender / scripts /. Ce répertoire n'est pas créé sur le Mac, et si vous créer manuellement, vous perdrez tous les scripts livrés.
Au lieu de cela, vous devez effectivement installer le script dans le bundle Blender.app. Pour rendre les choses encore plus gnarley, les scripts sont stockés dans un dossier invisible à l'intérieur du faisceau de Blender. La meilleure façon de copier le script est d'utiliser Terminal.app et la commande unix cp. Le dossier des scripts est situé au:
Chaque fois que vous mettez à niveau votre installation de Blender, vous aurez à réinstaller ce script. La prochaine fois que vous lancez Blender, après la copie du script, vous trouverez une entrée dans le menu Exporter appelé Objective-C-tête (. H). Ceci est destiné à être utilisé avec une carte de texture des objets, et seules les exportations de l'objet actif, et non pas tous les objets sélectionnés ou tous les objets. Je vais créer une version distincte pour les non-texture des objets cartographiés. Ce script permet de créer une version inefficace des non texturées objets en raison de la façon dont OpenGL ES utilise les coordonnées de texture.
J'ai également créé une exemple de projet qui montre comment utiliser le fichier d'entête exportés. C'est en fait assez facile. Vous passez juste les tableaux de la tête dans les appels OpenGL diverses, comme ceci:
Vous pouvez alors soit utiliser glDrawArrays () ou glDrawElements () comme bon vous semble. Il ya des indices fournis par glDrawElements (), mais puisque l'objet est exporté sous forme de triangles, glDrawArrays () fonctionne très bien aussi.
Avant d'exécuter le script, assurez-vous mettre l'objet en mode édition et sélectionnez Mesh-> Visages-> Convertir Quads aux triangles. Ce script ne sera pas convertir en triangles pour vous, et OpenGL ES nécessite triangles. Vous avez également besoin de charger et lier la texture que vous avez utilisé dans Blender, ou que vous créé sur la base de modèle de Blender UV exportés.
Comme je l'ai dit avant, je ne suis pas un programmeur très expérimenté Python, donc si vous voulez suggérer des améliorations, je suis heureux d'entendre ces suggestions. Vous ne serez pas heurter mes sentiments d'un iota. C'est ce que j'appelle une "force brute" script - il fait le travail, mais peut-être pas avec l'élégance qu'il devrait avoir.
Si vous voulez jouer avec le simple projet Blender j'ai utilisé dans le projet de test Xcode, vous pouvez constater que ici (Clic droit et enregistrer sur le disque).
J'espère créer une version future qui entrelace les données tel que suggéré par Apple, mais pour l'instant, j'étais juste heureux de faire fonctionner quelque chose.
Bien sûr, la réponse à cette question est loin d'être simple. Si vous avez suivi mes mes posts antérieurs sur l'importation de fichiers Wavefront OBJ, Vous êtes probablement au courant de cela déjà. Il ya plusieurs formats de fichiers, et aucun d'entre eux sont idéales pour les charger dans un appareil aux ressources limitées comme l'iPhone.
Apple recommande que les objets 3D sont stockées dans des fichiers en-tête comme des tableaux statiques. Ceci évite la nécessité de faire toute opération de chargement ou de transformer ou de conversion du tout. Mais ... il n'y a pas vraiment de moyen facile de créer ces fichiers d'en-tête de l'intérieur des logiciels 3D.
Eh bien, il ya un moyen maintenant. Le programme open source 3D appelé Blender a une architecture très extensible, ce qui rend relativement facile d'écrire des modules d'exportation personnalisé. L'architecture de Blender est basé sur des scripts Python, un langage que je ne suis pas particulièrement familier, mais je piraté quelque chose qui fonctionne. Alors, disons que vous avez un objet dans Blender:
Et vous voulez le charger dans un programme que vous écrivez pour votre iPhone:
Remarque, je sais que les screenshots ne correspondent effectivement - je recadrée de la texture après l'exportation de Blender pour le rendre plus iPhone de taille - je ne voulais pas pour le redimensionner, de peur que la texture serait trop petit pour voir.
Tout ce que vous avez à faire est de prendre ce script et l'installer dans le dossier des scripts de Blender.
Il ya un hic, cependant. La version Mac OS X de Blender ne suivent pas les règles SAMES comme il le fait pour les autres plateformes. Si vous cherchez comment installer un script dans Blender, il vous dira d'ajouter le script dans ~ / .blender / scripts /. Ce répertoire n'est pas créé sur le Mac, et si vous créer manuellement, vous perdrez tous les scripts livrés.
Au lieu de cela, vous devez effectivement installer le script dans le bundle Blender.app. Pour rendre les choses encore plus gnarley, les scripts sont stockés dans un dossier invisible à l'intérieur du faisceau de Blender. La meilleure façon de copier le script est d'utiliser Terminal.app et la commande unix cp. Le dossier des scripts est situé au:
/path/to/Blender.app/Contents/MacOS/.blender/scriptsDonc, si Blender est installé dans votre dossier Applications à l'intérieur d'un dossier appelé Blender, vous pouvez utiliser la commande suivante pour copier le script dans Blender dézippé:
cp objc.py /Applications/Blender/Blender.app/Contents/MacOS/.blender/scripts/
Chaque fois que vous mettez à niveau votre installation de Blender, vous aurez à réinstaller ce script. La prochaine fois que vous lancez Blender, après la copie du script, vous trouverez une entrée dans le menu Exporter appelé Objective-C-tête (. H). Ceci est destiné à être utilisé avec une carte de texture des objets, et seules les exportations de l'objet actif, et non pas tous les objets sélectionnés ou tous les objets. Je vais créer une version distincte pour les non-texture des objets cartographiés. Ce script permet de créer une version inefficace des non texturées objets en raison de la façon dont OpenGL ES utilise les coordonnées de texture.
J'ai également créé une exemple de projet qui montre comment utiliser le fichier d'entête exportés. C'est en fait assez facile. Vous passez juste les tableaux de la tête dans les appels OpenGL diverses, comme ceci:
glVertexPointer(3, GL_FLOAT, 0, CubeVertices);
glNormalPointer(GL_FLOAT, 0, CubeNormals);
glTexCoordPointer(2, GL_FLOAT, 0, CubeTexCoords);Vous pouvez alors soit utiliser glDrawArrays () ou glDrawElements () comme bon vous semble. Il ya des indices fournis par glDrawElements (), mais puisque l'objet est exporté sous forme de triangles, glDrawArrays () fonctionne très bien aussi.
Avant d'exécuter le script, assurez-vous mettre l'objet en mode édition et sélectionnez Mesh-> Visages-> Convertir Quads aux triangles. Ce script ne sera pas convertir en triangles pour vous, et OpenGL ES nécessite triangles. Vous avez également besoin de charger et lier la texture que vous avez utilisé dans Blender, ou que vous créé sur la base de modèle de Blender UV exportés.
Comme je l'ai dit avant, je ne suis pas un programmeur très expérimenté Python, donc si vous voulez suggérer des améliorations, je suis heureux d'entendre ces suggestions. Vous ne serez pas heurter mes sentiments d'un iota. C'est ce que j'appelle une "force brute" script - il fait le travail, mais peut-être pas avec l'élégance qu'il devrait avoir.
Si vous voulez jouer avec le simple projet Blender j'ai utilisé dans le projet de test Xcode, vous pouvez constater que ici (Clic droit et enregistrer sur le disque).
J'espère créer une version future qui entrelace les données tel que suggéré par Apple, mais pour l'instant, j'étais juste heureux de faire fonctionner quelque chose.
Aucun commentaire:
Enregistrer un commentaire