Dessin 3D avec SceneKit dans Pythonista

J'ai trouvé un script qui ne peut dessiner en 3D que sur iOS en utilisant SceneKit avec objc_util de Pythonista, donc je vais le présenter.

Article original

3d-omz.py Remarque: Si vous n’ajoutez pas load_framework (‘SceneKit’), vous obtiendrez une erreur. https://github.com/tdamdouni/Pythonista/blob/master/scenes/3d-omz.py

3D in Pythonista https://forum.omz-software.com/topic/1686/3d-in-pythonista

Image d'exécution

7BA22298-B587-42D0-8E6D-F17360AF67DC.png

Commentaire

from objc_util import *

Vous permet d'appeler directement la fonctionnalité fournie par le module objc_util.

Le module objc_util étant basé sur le module standard ctypes, cette ligne vous permet également d'utiliser la structure fournie par le module ctypes.

load_framework('SceneKit')

Chargez le framework SceneKit afin qu'il puisse être manipulé par programme.

Comme il n'a pas été décrit dans 3d-omz.py, il n'a peut-être pas été nécessaire de l'appeler dans le passé, mais dans iPadOS13, lors de la conversion de la classe SCNView, etc. fournie par SceneKit dans un format qui peut être utilisé en Python avec ObjCClass Je me fâche avec l'erreur qu'aucune classe Objective-C nommée «xxxxx» n'a été trouvée.

SCNView, SCNScene, SCNBox, SCNText, SCNNode, SCNLight, SCNAction, UIFont = map(ObjCClass, ['SCNView', 'SCNScene', 'SCNBox', 'SCNText', 'SCNNode', 'SCNLight', 'SCNAction', 'UIFont'])

Les classes fournies par SceneKit sont converties dans un format qui peut être utilisé en Python à l'aide de obj_util.ObjCClass.

Si vous utilisez la carte de fonctions standard, vous pouvez écrire le même processus en une seule fois, ce qui est facile.

class SCNVector3 (Structure):
    _fields_ = [('x', c_float), ('y', c_float), ('z', c_float)]

Utilisez ctypes.Structure pour définir une structure avec trois attributs (x, y, z) de type float. La structure définie ici sera utilisée plus tard pour obtenir le BoundingBox of Text.

    main_view = ui.View()
    main_view_objc = ObjCInstance(main_view)

J'obtiens un pointeur pour accéder à partir d'Objective-C en créant une ui.View vide et en passant cette instance de View à objc_util.ObjCInstance.

Il semble que vous puissiez plus tard accrocher la vue SceneKit en tant qu'enfant de cette vue principale afin que vous puissiez voir les dessins SceneKit dans l'interface utilisateur de Pythonista. (Les détails ne sont pas compris en raison du manque d'étude)

    scene_view = SCNView.alloc().initWithFrame_options_(((0, 0),(400, 400)), None).autorelease()
    scene_view.setAutoresizingMask_(18)
    scene_view.setAllowsCameraControl_(True)

Créez une instance de SCNView en appelant la méthode alloc (). Il appelle ensuite initWithFrame: options: pour l'initialiser à la taille (400,400) à la position (0,0). Enfin, en appelant autorelease () sur l'instance, il est configuré pour détruire automatiquement la mémoire lorsqu'elle n'est plus nécessaire.

SCNView.initWithFrame:options: https://developer.apple.com/documentation/scenekit/scnview/1524215-initwithframe?language=objc

setAutoresizeMask_ est une méthode pour définir ce qu'il faut faire lorsque la taille de la vue parent change. Le nombre 18 est la somme logique de 2 pour flexibleWidth et de 16 pour flexibleHeight, et en définissant cela, la largeur et la hauteur seront suivies lorsque la taille de la vue parent change.

Il est facile d'imaginer que c'est le même que l'attribut flex de la classe View du module ui de Pythonista.

UIView.AutoresizingMask https://developer.apple.com/documentation/uikit/uiview/1622559-autoresizingmask

La définition de setAllowsCameraControl_ sur True vous permet de faire glisser l'écran et de faire pivoter la caméra. Il est pratique et utile de définir ce paramètre sur True pour certains utilisateurs et les premiers tests de développement.

	scene = SCNScene.scene()
	node_root = scene.rootNode()

Les caméras, les lumières et les dessins gérés par SceneKit sont tous superposés dans Node. Le rootNode SCNScene est le parent de cette hiérarchie.

Après cela, en ajoutant divers nœuds au rootNode, ce qui sera affiché à l'écran et comment sera décidé.

Recommended Posts

Dessin 3D avec SceneKit dans Pythonista
Gérez les structures de données 3D avec les pandas
Battez ui.View.flex dans Pythonista3
Jusqu'à dessiner un graphe 3D avec Python dans Windows10
Dessiner une structure arborescente avec D3.js dans Jupyter Notebook
Graphique 2D dans matplotlib
Dessin en temps réel avec matplotlib
Dessiner avec Python Tinker
Graphique 3D avec matplotlib
3D ou D avec Py
[Petite histoire] [Python] Remplacez les chaînes de caractères dans un tableau à deux dimensions par des nombres
Jouons avec la 4e dimension 4e
Dessin de bougie avec python
Dessiner GoogLeNet avec draw_net de caffe
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Créer un gif 3D avec python3
Refaire Python dans Pythonista3 (1) --appex
Méthode de dessin graphique avec matplotlib
Gérer les sons en Python
Grattage avec du sélénium en Python
Résoudre ABC175 D en Python
Grattage avec Tor en Python
Nuage de points 3D avec PyQtGraph
Transfert de fichiers bidirectionnel dans Pythonista 3
Combiné avec ordinal en Python
Dessin graphique avec IPython Notebook
Comment afficher les marques de légende en un avec le tracé Python 2D