Je veux créer une scène 3D avec le modeleur SceneKit
et ensuite le lire dans mon application Metal
. Je vois qu'il ya SceneKit
et ModelIO
API pour le faire mais je ne sais pas comment les pièces s'emboîtent. Donc, ce dont j'ai besoin est chemin de .scn
fichier ->MDL Mesh
-> géométrie + texture. Je ne suis pas clair sur la façon dont je voudrais synchroniser mes shaders Metal
avec des matériaux créés dans le modeleur SceneKit
.Comment charger/analyser un fichier SceneKit .scn dans mon application Metal?
Répondre
Il y a deux parties principales à ce que vous demandez ici: obtenir des données SceneKit dans ModelIO, et rendre les données ModelIO avec Metal.
Pour obtenir des scènes SceneKit dans Modelio, première API utilisation de SceneKit (
SCNScene
ouSCNSceneSource
pour charger le fichier.scn
, puis utilisez l'API Modelio pour obtenir les objets que vous voulez que les mailles. Vous pouvez créer unMDLAsset
de toute la scène en utilisantassetWithSCNScene:bufferAllocator:
puis marcher à travers la hiérarchie d'objets de l'actif dans Modelio pour trouver le maillage que vous voulez, ou marcher à travers la hiérarchie des noeuds dans SceneKit pour trouver leSCNNode
ouSCNGeometry
vous voulez, puis obtenir le maillage à Modelio en utilisantobjectWithSCNNode:bufferAllocator:
oumeshWithSCNGeometry:bufferAllocator:
.En ce qui concerne l'utilisation des maillages ModelIO dans une application Metal, Apple a un sample code project qui montre comment utiliser ModelIO pour charger un maillage OBJ, utiliser MetalKit pour obtenir les données de maillage dans les tampons GPU Metal et raccorder les informations matérielles de ModelIO au shader variables à utiliser dans votre propre moteur de rendu.
Vous devriez être en mesure de mettre les deux d'entre eux ainsi: où le code exemple charge un OBJ pour obtenir un MDLAsset
ou MDLMesh
, utilisez les méthodes (1) pour obtenir un bien ou d'un maillage d'un SceneKit fichier à la place.
Le modèle de matériau SceneKit est bien sûr beaucoup plus compliqué que le simple shader Phong utilisé dans l'exemple de code. Mais l'exemple de code montre comment parcourir les propriétés d'un MDLMaterial
et définir les arguments correspondants dans un Metal shader - si vous créez un shader plus compliqué, suivez les mêmes étapes pour mapper les propriétés du matériau à toutes les entrées de votre shader.
Ah ah! Donc - en un mot - je donne des noms de géométrie et de matériaux dans le modeleur: "my box", "cool material" puis récupérons la géométrie/matériau pendant la traversée - via les méthodes de parcours SceneKit ou ModelIO. La clé est d'étiqueter les choses. Est-ce que j'ai bien compris? – dugla
Vous pouvez itérer les documents, qu'ils soient étiquetés ou non, mais les étiquettes peuvent certainement vous aider à les suivre. – rickster
Attends, quoi? Comment identifier un élément de la scène sans étiquette Deux sphères texturées implique quatre (4) étiquettes (en supposant des descriptions matérielles distinctes) non? – dugla