omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    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

    Pythonista
    5
    35
    18813
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • cvp
      cvp last edited by cvp

      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()
      
      1 Reply Last reply Reply Quote 2
      • abcabc
        abcabc last edited by

        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)
        
        1 Reply Last reply Reply Quote 0
        • cvp
          cvp last edited by cvp

          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]];
          
          1 Reply Last reply Reply Quote 0
          • scj643
            scj643 last edited by

            I actually need people to help make an API for scenekit so we can do this type of stuff with a python AI

            1 Reply Last reply Reply Quote 0
            • cvp
              cvp last edited by

              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.

              1 Reply Last reply Reply Quote 0
              • scj643
                scj643 last edited by

                https://github.com/scj643/objc_tools is my repo

                1 Reply Last reply Reply Quote 0
                • cvp
                  cvp last edited by

                  I know your repo, often checked...

                  1 Reply Last reply Reply Quote 0
                  • momorprods
                    momorprods last edited by momorprods

                    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)
                    cvp 2 Replies Last reply Reply Quote 0
                    • cvp
                      cvp @momorprods last edited by

                      @momorprods No, sorry, I didn't success...

                      1 Reply Last reply Reply Quote 0
                      • JonB
                        JonB last edited by

                        It wouldn't be POINTER here. Try byref.

                        1 Reply Last reply Reply Quote 0
                        • JonB
                          JonB last edited by

                          Actually, verts must be a ctypes array, not a python list.

                          1 Reply Last reply Reply Quote 0
                          • momorprods
                            momorprods last edited by

                            oh ok thanks, going to try that and keep you posted!

                            1 Reply Last reply Reply Quote 0
                            • momorprods
                              momorprods last edited by momorprods

                              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)
                              cvp 1 Reply Last reply Reply Quote 0
                              • cvp
                                cvp @momorprods last edited by cvp

                                @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],)
                                
                                1 Reply Last reply Reply Quote 0
                                • momorprods
                                  momorprods last edited by

                                  wooohoooo thanks!!

                                  cvp 1 Reply Last reply Reply Quote 0
                                  • momorprods
                                    momorprods last edited by momorprods

                                    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)
                                    cvp 2 Replies Last reply Reply Quote 0
                                    • cvp
                                      cvp @momorprods last edited by cvp

                                      @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, sorry

                                          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],)
                                          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_imp

                                      Thread 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

                                      1 Reply Last reply Reply Quote 0
                                      • JonB
                                        JonB last edited by JonB

                                        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],)
                                        
                                        cvp 1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @JonB last edited by

                                          @JonB Yes, but in my code,,the crash was in

                                              geometry = ObjCClass('SCNGeometry').geometryWithSources_elements_(sources, elements)    	
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • cvp
                                            cvp @momorprods last edited by cvp

                                            @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
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors