Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello ā I'm @olemoritz on Twitter.
For the fun, a Photos cube
-
For the fun, based on topic
You can pinch for zoom, or move the camera by a finger or close the view with a 2-finger swipe-down gesture
Import 6 Photos, square if possible, in the same directory as your script.from objc_util import * import ui import math load_framework('SceneKit') SCNView, SCNScene, SCNBox ,SCNNode, SCNMaterial, SCNCamera, SCNLookAtConstraint = map(ObjCClass, ['SCNView', 'SCNScene', 'SCNBox' ,'SCNNode', 'SCNMaterial', 'SCNCamera', 'SCNLookAtConstraint' ]) @on_main_thread def demo(): main_view = ui.View() main_view_objc = ObjCInstance(main_view) scene_view = SCNView.alloc().initWithFrame_options_(((0, 0),(100, 50)), )None).autorelease() scene_view.setAutoresizingMask_(18) scene_view.setAllowsCameraControl_(True) main_view_objc.addSubview_(scene_view) main_view.name = 'SceneKit Demo' scene = SCNScene.scene() scene_view.setScene_(scene) root_node = scene.rootNode() camera = SCNCamera.camera() camera_node = SCNNode.node() camera_node.setCamera(camera) camera_node.setPosition((-3.0,3.0, 3)) cube_geometry = SCNBox.boxWithWidth_height_length_chamferRadius_(1, 1, 1, 0) Material_img1 = SCNMaterial.material() Material_img1.contents = UIImage.imageWithContentsOfFile_('Photo1.JPG') Material_img2 = SCNMaterial.material() Material_img2.contents = UIImage.imageWithContentsOfFile_('Photo2.JPG') Material_img3 = SCNMaterial.material() Material_img3.contents = UIImage.imageWithContentsOfFile_('Photo3.JPG') Material_img4 = SCNMaterial.material() Material_img4.contents = UIImage.imageWithContentsOfFile_('Photo4.JPG') Material_img5 = SCNMaterial.material() Material_img5.contents = UIImage.imageWithContentsOfFile_('Photo5.JPG') Material_img6 = SCNMaterial.material() Material_img6.contents = UIImage.imageWithContentsOfFile_('Photo6.JPG') cube_geometry.setMaterials_([Material_img1,Material_img2,Material_img3,Material_img4,Material_img5,Material_img6]) cube_node = SCNNode.nodeWithGeometry_(cube_geometry) # Add a constraint to the camera to keep it pointing to the target cube constraint = SCNLookAtConstraint.lookAtConstraintWithTarget_(cube_node) constraint.gimbalLockEnabled = True camera_node.constraints = [constraint] root_node.addChildNode_(camera_node) root_node.addChildNode_(cube_node) main_view.present(hide_title_bar=True) demo()
-
Nice. The following two lines could be added after cubenode definition if someone wants to animate the cube. (Also need to include SCNAction in the list defined after load_framework)
rotate_action = SCNAction.repeatActionForever_(SCNAction.rotateByX_y_z_duration_(0, math.pi*2, math.pi*2, 10)) cube_node.runAction_(rotate_action)
-
Thanks
I still try to define a shape like a tetrahedron (4 triangular faces) using SCNGeometrySource but I've problems with array of vertices.
I try to convert this code in Pythonista, I'm sure @JonB could do it in two minutes and I'm fighting against errors for hours.
My dream is to be able, one day in a very far future, to help JonB in something šSCNVector3 verts[] = { SCNVector3Make(0, 0, 0), SCNVector3Make(1, 0, 0), SCNVector3Make(0, 1, 0) }; SCNGeometrySource *src = [SCNGeometrySource geometrySourceWithVertices:verts count:3]; int indexes[] = { 0, 1, 2 }; NSData *datIndexes = [NSData dataWithBytes:indexes length:sizeof(indexes)]; SCNGeometryElement *ele = [SCNGeometryElement geometryElementWithData:datIndexes primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:1 bytesPerIndex:sizeof(int)]; SCNGeometry *geo = [SCNGeometry geometryWithSources:@[src] elements:@[ele]];
-
I actually need people to help make an API for scenekit so we can do this type of stuff with a python AI
-
I would like to help but I think I know not enough objective c for that...
When I program in objc, I spend hours before it works. -
https://github.com/scj643/objc_tools is my repo
-
I know your repo, often checked...
-
hey, digging out this old topic - did you have chance into the triangle mesh generation?
I have started converting the Obj-c snippet above, but it crashes Pythonista at the geometrySourceWithVertices call. Probably my bad, but Iām clueless about how to fiw this:
verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] src = SCNGeometrySource.geometrySourceWithVertices_count_(POINTER(verts),3)
-
@momorprods No, sorry, I didn't success...
-
It wouldn't be POINTER here. Try byref.
-
Actually, verts must be a ctypes array, not a python list.
-
oh ok thanks, going to try that and keep you posted!
-
Made this, but still crashing. Am I making another noob mistake?
verts=[0.0,0.0,0.0 , 1.0,0.0,0.0 , 0.0,1.0,0.0] arr = (ctypes.c_float * len(verts))(*verts) src = SCNGeometrySource.geometrySourceWithVertices_count_(byref(arr),3)
-
@momorprods Perhaps this (at least, no crash š)
class SCNVector3(Structure): _fields_ = [('x', c_double), ('y', c_double), ('z', c_double)]
And
verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] verts_array = (SCNVector3 * len(verts))(*verts) SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_( verts_array,len(verts), restype=c_void_p, argtypes=[POINTER(SCNVector3), c_ulong],)
-
wooohoooo thanks!!
-
Making some good progress thanks to your help. But Iām getting a last crash on the very last instruction - any idea?
#triangle generation verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] verts_array = (SCNVector3 * len(verts))(*verts) src = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_( verts_array,len(verts), restype=c_void_p, argtypes=[POINTER(SCNVector3), c_ulong],) indexes=[0,1,2] indexes_array = (c_ulong*len(indexes))(*indexes) datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array)) ele=ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,SCNGeometryPrimitiveTypeTriangles,1,4) # CRASH Here: geo = ObjCClass('SCNGeometry').geometryWithSources_elements_(src,ele)
-
@momorprods I've read that indices must contain a first element with the number of points but I don't know if it is true.
sources and elements must be arrays
But I have also a crash with my code
See faultlog below but I can't solve the problem, sorryverts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] verts_array = (SCNVector3 * len(verts))(*verts) SCNGeometrySource = ObjCClass('SCNGeometrySource').geometrySourceWithVertices_count_( verts_array,len(verts), restype=c_void_p, argtypes=[POINTER(SCNVector3), c_ulong],) sources = NSArray([SCNGeometrySource]) indices = [3,0,1,2] # number points and their indices indices_data = ns(indices) # primitiveType = 0 for triangle # primitiveCount = 1 SCNGeometryElement = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(indices_data,0,1,4) elements = NSArray([SCNGeometryElement]) geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)
Fatal Python error: Aborted
Current thread 0x0000000100d62b80 (most recent call first):
File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 773 in call
File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 51 in demo
File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1066 in OMMainThreadDispatcher_invoke_impThread 0x000000016fa5f000 (most recent call first):
File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 898 in call
File "/var/containers/Bundle/Application/E4751F4F-64A4-4BE6-AB9D-9C9564715002/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/site-packages/objc_util.py", line 1095 in new_func
File "/private/var/mobile/Containers/Shared/AppGroup/668A7D98-7216-47ED-917D-AA0B6173167E/Pythonista3/Documents/test6.py", line 76 in <module>
Objective-C exception details:
NSInvalidArgumentException: -[SCNGeometrySource count]: unrecognized selector sent to instance 0x283276100
-
this works
from ctypes import * from objc_util import * class SCNVector3(Structure): _fields_ = [('x', c_double), ('y', c_double), ('z', c_double)] verts=[SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] SCNVector3Array3=SCNVector3 * len(verts) verts_array=SCNVector3Array3(*verts) SCNGeometrySource = ObjCClass('SCNGeometrySource') s=SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],)
-
@JonB Yes, but in my code,,the crash was in
geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)
-
@momorprods @JonB No crash with
verts = [SCNVector3(0, 0, 0), SCNVector3(1, 0, 0), SCNVector3(0, 1, 0)] SCNVector3Array3=SCNVector3 * len(verts) verts_array=SCNVector3Array3(*verts) SCNGeometrySource = ObjCClass('SCNGeometrySource') s = SCNGeometrySource.geometrySourceWithVertices_count_(byref(verts_array),len(verts),restype=c_void_p,argtypes=[POINTER(SCNVector3Array3), c_ulong],) indexes=[0,1,2] indexes_array = (c_ulong*len(indexes))(*indexes) datIndexes = ObjCClass('NSData').dataWithBytes_length_(indexes_array,len(indexes_array)) # primitiveType = 0 for triangle # primitiveCount = 1 e = ObjCClass('SCNGeometryElement').geometryElementWithData_primitiveType_primitiveCount_bytesPerIndex_(datIndexes,0,1,4) geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_([s],[e]) ``` Edit: but nothing visible