Ich habe ein Skript gefunden, das 3D nur unter iOS mithilfe von SceneKit mit objc_util von Pythonista zeichnen kann, daher werde ich es vorstellen.
3d-omz.py Hinweis: Wenn Sie load_framework ("SceneKit") nicht hinzufügen, wird eine Fehlermeldung angezeigt. 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 *
Ermöglicht das direkte Aufrufen der vom Modul objc_util bereitgestellten Funktionalität.
Da das objc_util-Modul auf den Standardmodul-ctypes basiert, können Sie in dieser einen Zeile auch die vom ctypes-Modul bereitgestellte Struktur verwenden.
load_framework('SceneKit')
Laden Sie das SceneKit-Framework, damit es programmgesteuert bearbeitet werden kann.
Da es nicht in 3d-omz.py beschrieben wurde, war es in der Vergangenheit möglicherweise nicht erforderlich, es aufzurufen, sondern in iPadOS13, wenn die von SceneKit bereitgestellte SCNView-Klasse usw. in ein Format konvertiert wurde, das in Python mit ObjCClass verwendet werden kann Ich ärgere mich über den Fehler, den keine Objective-C-Klasse namens 'xxxx' gefunden hat.
SCNView, SCNScene, SCNBox, SCNText, SCNNode, SCNLight, SCNAction, UIFont = map(ObjCClass, ['SCNView', 'SCNScene', 'SCNBox', 'SCNText', 'SCNNode', 'SCNLight', 'SCNAction', 'UIFont'])
Die von SceneKit bereitgestellten Klassen werden in ein Format konvertiert, das in Python mit obj_util.ObjCClass verwendet werden kann.
Wenn Sie die Standardfunktionszuordnung verwenden, können Sie denselben Prozess auf einmal schreiben, was einfach ist.
class SCNVector3 (Structure):
_fields_ = [('x', c_float), ('y', c_float), ('z', c_float)]
Verwenden Sie ctypes.Structure, um eine Struktur mit drei Attributen (x, y, z) vom Typ float zu definieren. Die hier definierte Struktur wird später verwendet, um die BoundingBox of Text abzurufen.
main_view = ui.View()
main_view_objc = ObjCInstance(main_view)
Ich erhalte einen Zeiger für den Zugriff von Objective-C, indem ich eine leere ui.View erstelle und diese View-Instanz an objc_util.ObjCInstance übergebe.
Es scheint, dass Sie die SceneKit-Ansicht später als untergeordnetes Element dieser main_view aufhängen können, damit Sie die SceneKit-Zeichnungen in der Pythonista ui.View sehen können. (Details werden wegen mangelnder Studien nicht verstanden)
scene_view = SCNView.alloc().initWithFrame_options_(((0, 0),(400, 400)), None).autorelease()
scene_view.setAutoresizingMask_(18)
scene_view.setAllowsCameraControl_(True)
Erstellen Sie eine Instanz von SCNView, indem Sie die Methode alloc () aufrufen. Anschließend wird initWithFrame: options aufgerufen, um es an Position (0,0) auf Größe (400.400) zu initialisieren. Durch Aufrufen von autorelease () für die Instanz wird der Speicher automatisch zerstört, wenn er nicht mehr benötigt wird.
SCNView.initWithFrame:options: https://developer.apple.com/documentation/scenekit/scnview/1524215-initwithframe?language=objc
setAutoresizeMask_ ist eine Methode zum Festlegen, was zu tun ist, wenn sich die Größe der übergeordneten Ansicht ändert. Die Zahl 18 ist die logische Summe von 2 für flexibleWidth und 16 für flexibleHeight. Wenn Sie diese Option festlegen, werden Breite und Höhe berücksichtigt, wenn sich die Größe der übergeordneten Ansicht ändert.
Es ist leicht vorstellbar, dass dies dasselbe ist wie das Flex-Attribut der View-Klasse des UI-Moduls von Pythonista.
UIView.AutoresizingMask https://developer.apple.com/documentation/uikit/uiview/1622559-autoresizingmask
Wenn Sie setAllowsCameraControl_ auf True setzen, können Sie über den Bildschirm wischen und die Kamera drehen. Es ist praktisch und gut, dies für einige Zuschauer und frühe Entwicklungsprüfungen auf True zu setzen.
scene = SCNScene.scene()
node_root = scene.rootNode()
Die von SceneKit verwalteten Kameras, Lichter und Zeichnungen sind alle in Node überlagert. Der SCNScene-RootNode ist das übergeordnete Element dieser Hierarchie.
Anschließend wird durch Hinzufügen verschiedener Knoten zum rootNode festgelegt, was auf dem Bildschirm angezeigt wird und wie entschieden wird.
Recommended Posts