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.
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
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