3D-Zeichnung mit SceneKit in Pythonista

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.

Originaler Artikel

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

Ausführungsbild

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

Kommentar

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

3D-Zeichnung mit SceneKit in Pythonista
Behandeln Sie 3D-Datenstrukturen mit Pandas
Besiege ui.View.flex in Pythonista3
Bis zum Zeichnen eines 3D-Diagramms mit Python in Windows 10
Zeichnen einer Baumstruktur mit D3.js in Jupyter Notebook
2D-Plot in Matplotlib
Echtzeitzeichnung mit Matplotlib
Zeichnen mit Python Tinker
3D-Plot mit Matplotlib
3D oder D mit Py
[Kleine Geschichte] [Python] Ersetzen Sie Zeichenfolgen in einem zweidimensionalen Array durch Zahlen
Spielen wir mit der 4. Dimension der 4. Dimension
Kerzentabelle mit Python zeichnen
Zeichnen von GoogLeNet mit caffe's draw_net
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Erstellen Sie ein 3D-GIF mit Python3
Wiederholen Sie Python in Pythonista3 (1) --appex
Diagrammzeichnungsmethode mit matplotlib
Umgang mit Sounds in Python
Scraping mit Selen in Python
Löse ABC175 D in Python
Scraping mit Tor in Python
3D-Streudiagramm mit PyQtGraph
Bidirektionale Dateiübertragung in Pythonista 3
Kombiniert mit Ordnungszahl in Python
Diagrammzeichnung mit IPython Notebook
Anzeigen von Legendenmarkierungen in einem mit Python 2D-Plot