swiftscenekit

pointSize property in SceneKit being Ignored


I'm trying to render a point cloud using SceneKit (ultimately for ARKit). However, I'm finding the pointSize (and minimumPointScreenSpaceRadius) properties are ignored when trying to modify the SCNGeometryElement. There was this solution to call on the underlying OpenGL property, but this seems to work only in simulation. No matter what pointSize I put in, the points are the same size. This is roughly how my code is laid out. I'm wondering if I'm doing something wrong with my GeometryElement setup?

  var index: Int = 0  
    for x_pos in stride(from: start , to: end, by: increment) {  
        for y_pos in stride(from: start , to: end, by: increment) {  
            for z_pos in stride(from: start , to: end, by: increment) {  
                let pos:SCNVector3 = SCNVector3(x: x_pos, y: y_pos, z: z_pos)  
                positions.append(pos)  
                normals.append(normal)  
                indices.append(index)  
                index = index + 1  
            }  
        }  
    }  

    let pt_positions : SCNGeometrySource = SCNGeometrySource.init(vertices: positions)  
    let n_positions: SCNGeometrySource = SCNGeometrySource.init(normals: normals)  

    let pointer = UnsafeRawPointer(indices)  
    let indexData = NSData(bytes: pointer, length: MemoryLayout<Int32>.size * indices.count)  

    let elements = SCNGeometryElement(data: indexData as Data, primitiveType: .point, primitiveCount: positions.count, bytesPerIndex: MemoryLayout<Int>.size)  
    elements.pointSize = 10.0 //being ignored  
    elements.minimumPointScreenSpaceRadius = 10 //also being ignored  
    let pointCloud = SCNGeometry (sources: [pt_positions, n_positions], elements: [elements])  
    pointCloud.firstMaterial?.lightingModel = SCNMaterial.LightingModel.constant  


    let ptNode = SCNNode(geometry: pointCloud)  
    scene.rootNode.addChildNode(ptNode)  

Solution

  • you should also specify both element.minimumPointScreenSpaceRadius and element.maximumPointScreenSpaceRadius. if so your point size works! :)