2016-11-02 3 views
0

上では動作しません描画:Custom SceneKit Geometryとスウィフト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

関連する問題