2016-11-02 2 views
0

Suite à cette solution: Custom SceneKit Geometry et converti à Swift 3, le code est devenu:Tracer une ligne sur SceneKit ne fonctionnera pas sur l'appareil

func drawLine() { 

    var verts = [SCNVector3(x: 0,y: 0,z: 0),SCNVector3(x: 1,y: 0,z: 0),SCNVector3(x: 0,y: 1,z: 0)] 

    let src = SCNGeometrySource(vertices: &verts, count: 3) 
    let indexes: [CInt] = [0, 1, 2] 

    let dat = NSData(
     bytes: indexes, 
     length: MemoryLayout<CInt>.size * indexes.count 
    ) 
    let ele = SCNGeometryElement(
     data: dat as Data, 
     primitiveType: .line, 
     primitiveCount: 2, 
     bytesPerIndex: MemoryLayout<CInt>.size 
    ) 
    let geo = SCNGeometry(sources: [src], elements: [ele]) 

    let nd = SCNNode(geometry: geo) 

    geo.materials.first?.lightingModel = .blinn 
    geo.materials.first?.diffuse.contents = UIColor.red 
    scene.rootNode.addChildNode(nd) 

} 

Il fonctionne sur simulateur:

red line on simulator

Mais j'ai eu l'erreur sur l'appareil:

/BuildRoot/Library/Caches/com.apple.xbs/Sources/Metal/Metal-85.83/ToolsLayers/Debug/MTLDebugRenderCommandEncoder.mm:130: failed assertion `indexBufferOffset(0) + (indexCount(4) * 4) must be <= [indexBuffer length](12).' 

Que se passe-t-il?

Le code entier est ici: Source code

Répondre

2

Je réponds à ma question parce que je trouve une solution qui peut aider les autres.

Le problème était sur "index", 3 index ne dessineront pas 2 sommets. Doit définir 2 index pour chaque vertice que vous voulez dessiner.

Ceci est la fonction finale:

func drawLine(_ verts : [SCNVector3], color : UIColor) -> SCNNode? { 

    if verts.count < 2 { return nil } 

    let src = SCNGeometrySource(vertices: verts, count: verts.count) 
    var indexes: [CInt] = [] 

    for i in 0...verts.count - 1 { 
     indexes.append(contentsOf: [CInt(i), CInt(i + 1)]) 
    } 

    let dat = NSData(
     bytes: indexes, 
     length: MemoryLayout<CInt>.size * indexes.count 
    ) 

    let ele = SCNGeometryElement(
     data: dat as Data, 
     primitiveType: .line, 
     primitiveCount: verts.count - 1, 
     bytesPerIndex: MemoryLayout<CInt>.size 
    ) 

    let line = SCNGeometry(sources: [src], elements: [ele]) 

    let node = SCNNode(geometry: line) 

    line.materials.first?.lightingModel = .blinn 
    line.materials.first?.diffuse.contents = color 

    return node 
} 

Vocation:

scene.rootNode.addChildNode(
    drawLine(
     [SCNVector3(x: -1,y: 0,z: 0), 
     SCNVector3(x: 1,y: 0.5,z: 1), 
     SCNVector3(x: 0,y: 1.5,z: 0)] , color: UIColor.red 
     )! 
) 

tirerai: enter image description here