2016-11-02 10 views
0

После этого решения: Custom SceneKit Geometry и преобразуется в Swift 3, код стал:Рисование линии на SceneKit не будет работать на устройстве

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) 

} 

Он работает на тренажере:

red line on simulator

Но у меня возникла ошибка на устройстве:

/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).' 

Что происходит?

Весь код здесь: Source code

ответ

2

Я отвечаю на свой вопрос, потому что я нашел решение, которое может помочь другим.

Проблема была в «указателях», 3 индекса не будут рисовать 2 вершины. Необходимо установить 2 индекса для каждой вершины, которую вы хотите нарисовать.

Это последняя функция:

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 
} 

Призвание:

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 
     )! 
) 

Привлечет: enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^