[SWIFT] Comment transformer des figurines ARKit et SceneKit avec Metal Shader

Je vais vous présenter comment transformer librement les formes d'ARKit et de SceneKit.

De plus, en utilisant cette méthode, j'ai finalement créé un processus tel que faire flotter de l'eau dans l'air avec AR, alors veuillez également consulter cet article.

Comment faire flotter de l'eau dans les airs avec ARKit + Metal

manière

Cette fois, nous transformerons une sphère comme celle-ci.

Comment dessiner des matériaux SceneKit avec Metal Shader

Vous pouvez dessiner un shader en créant un nœud sphérique et en définissant la fonction Metal shader à l'aide de SCNProgram.

GameViewController.swift


//Ajouter une sphère à un nœud
let sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 2)
sphereNode.position.y += Float(0.05)
sphereNode.name = "my_node"

//Spécifiez le nuanceur de métal
let program = SCNProgram()
program.vertexFunctionName = "vertexShader"
program.fragmentFunctionName = "fragmentShader"
sphereNode.geometry?.firstMaterial?.program = program
//Passer les informations de temps écoulé au shader
let time = Float(Date().timeIntervalSince(startDate))
globalData.time = time
let uniformsData = Data(bytes: &globalData, count: MemoryLayout<GlobalData2>.size)
sphereNode.geometry?.firstMaterial?.setValue(uniformsData, forKey: "globalData")

Si vous souhaitez en savoir plus sur ce domaine, veuillez lire ici.

Introduction au métal

Essayez de transformer avec Vertex shader

Tout d'abord, faisons une simple transformation. Ajoutons la coordonnée y à la coordonnée x.

Shader.metal


vertex ColorInOut vertexShader(VertexInput2          in       [[ stage_in ]],
                               constant SCNSceneBuffer& scn_frame [[buffer(0)]],
                               constant NodeBuffer& scn_node [[ buffer(1) ]],
                               device GlobalData2 &globalData [[buffer(2)]])
{
    //Variables de sortie
    ColorInOut out;
    //Coordonnées des informations des sommets
    float3 pos = in.position;
    //Y est ajouté à x du sommet. Telle est la substance du processus de transformation
    pos.x += pos.y;
    //Effectuer la conversion MVP pour SceneKit
    float4 transformed = scn_node.modelViewProjectionTransform * float4(pos, 1.0);
    //Mettez les coordonnées converties dans la variable de sortie
    out.position = transformed;
    //Mettez les coordonnées de texture dans la variable de sortie sans rien faire
    out.texCoords = in.texCoords;
    
    //Production
    return out;
}

Ça ressemble à ça.

Vous pouvez voir que plus la valeur de la coordonnée y est élevée (la coordonnée y augmente de bas en haut), plus la coordonnée x est grande (l'augmentation de la gauche vers la droite).

Pour plus de détails sur la façon de déclarer les shaders et modelViewProjectionTransform, veuillez vous référer à l 'Introduction à Metal présentée précédemment.

Donnez du cos et essayez de le transformer.

Changeons l'endroit où pos.x + = pos.y; a été défini comme suit.

Shader.metal


    pos.x += cos(pos.y);

Ça ressemble à ça.

C'est intéressant. Si cos est donné, il ondulera dans la plage de -1 à 1.

L'idée de ces formules a été écrite dans ce livre d'une manière facile à comprendre.

Comprenez avec Unity! Mathématiques du jeu

Donnez le temps écoulé et essayez d'animer

Changeons l'endroit où pos.x + = cos (pos.y); a été défini comme suit.

Shader.metal


    pos.x += cos(pos.y + globalData.time);

Cela fait des mouvements intéressants comme celui-ci. qiita用動画.gif

Dans la méthode de l'eau flottante dans l'air introduit au début, la sensation de l'eau est donnée en effectuant un tel traitement pour chacun des x, y et z.

Note publie régulièrement sur le développement iOS, alors suivez-nous. https://note.com/tokyoyoshida

Nous envoyons des conseils simples sur Twitter. https://twitter.com/jugemjugemjugem

Recommended Posts

Comment transformer des figurines ARKit et SceneKit avec Metal Shader
Camouflage optique avec ARKit + SceneKit + Metal ①
Navigation Web avec ARKit + SceneKit + Metal
Camouflage optique avec ARKit + SceneKit + Metal ②
Comment créer une API avec GraphQL et Rails
Comment sérialiser et désérialiser le type LocalDateTime avec GSON
Comment installer Gradle et Kotlin avec SDKMAN (Mac)
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
Effondrement du sol avec ARKit + SceneKit
Comment gérer différentes versions de rbenv et Ruby
[Astuces] Comment résoudre les problèmes avec XCode et Swift pour les débutants
Comment utiliser StringBurrer et Arrays.toString.
Comment démarrer avec Slim
Comment utiliser EventBus3 et ThreadMode
Comment entourer n'importe quel caractère avec "~"
Comment appeler des classes et des méthodes
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment utiliser mssql-tools avec Alpine
Comment connecter Heroku et Sequel
Comment convertir LocalDate et Timestamp
Comment démarrer Camunda avec Docker
Comment déployer sur AWS à l'aide de NUXTJS S3 et CloudFront officiels? Avec docker-compose
Comment réaliser une recherche hybride en utilisant l'analyse morphologique et Ngram avec Solr
[Swift] Comment connecter TabBar avec Storyboard Reference et également utiliser NavigationController
Comment utiliser les fichiers args:, environment:, env_file: et .env avec la commande docker-compose
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Reproduction de "Vous êtes devant le roi Laputa" avec ARKit + SceneKit + Metal
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Java8 / 9 Beginners: Streaming API addiction points et comment les gérer
Comment recadrer une image avec libGDX
Comment ajuster TextPosition avec l'extension de clavier iOS
Comment partager des fichiers avec Docker Toolbox
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
[Android] Comment gérer les thèmes sombres
Comment utiliser BootStrap avec Play Framework
Comment changer d'images miniatures avec JavaScript
[Note] Comment démarrer avec Rspec
[Java] Comment sortir et écrire des fichiers!
Essayez de vous serrer la main avec ARKit + Metal
Comment faire un contrôle basé sur l'API avec cancancan
Comment configurer et utiliser kapt
Comment réaliser le téléchargement de fichiers avec Feign
Comment créer SquashTM et comment prendre en charge le japonais
Comment mettre à jour les modèles associés avec accepte_nested_attributes_for
Comment définir JAVA_HOME avec l'appassembler-maven-plugin de Maven
Comment implémenter TextInputLayout avec la fonction de validation
Comment trouver les dizaines et les unités
Comment gérer les erreurs de connexion avec l'appareil
Comment supprimer des données avec une clé externe
[Facile] Comment mettre à niveau Ruby et le bundler
Comment tester l'étendue privée avec JUnit
Comment surveiller nginx avec docker-compose avec datadog