表观指数限制

时间:2015-02-14 15:43:54

标签: ios swift scenekit

在swift中使用SceneKit我尝试构建自定义3D对象(地形)。为了建立一个地形,我建造了一个我划分为多个水平和垂直剖面的平面。使用较少的数字或部分,一切都很好,但是在使用EXC_BAD_ACCESS的某些深度OpenGL函数中,应用程序崩溃的次数不是很多。

这是地形的简化版本(是的,它只是一个平面),没有出现问题:

let width:Float = 12
let depth:Float = 12
let height:Float = 2
let nx = 6
let nz = 6

func build() -> SCNGeometry {
    var vertices : [SCNVector3] = Array()
    for i in 0..<(nx + 1) {
        for j in 0..<(nz + 1) {
            let x = (Float(i) / Float(nx)) * width - width/2
            let z = (Float(j) / Float(nz)) * depth - depth/2
            let y = Float(0)
            vertices.append(SCNVector3(x:x, y:y, z:z))
        }
    }

    var indices : [CInt] = []
    for i in 0..<nx {
        for j in 0..<nz {
            indices.append(CInt(i   + j * (nz+1)))
            indices.append(CInt(i+1 + j * (nz+1)))
            indices.append(CInt(i   + (j+1)*(nz+1)))

            indices.append(CInt(i+1 + j * (nz+1)))
            indices.append(CInt(i+1 + (j+1)*(nz+1)))
            indices.append(CInt(i   + (j+1)*(nz+1)))
        }
    }

    let data = NSData(bytes: vertices, length: sizeof(SCNVector3) * countElements(vertices))

    let vertexSource = SCNGeometrySource(data: data, semantic: SCNGeometrySourceSemanticVertex, vectorCount: vertices.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Float), dataOffset: 0, dataStride: sizeof(SCNVector3))

    let indexData = NSData(bytes: indices, length: sizeof(CInt) * countElements(indices))

    let element = SCNGeometryElement(data: indexData, primitiveType: SCNGeometryPrimitiveType.Triangles, primitiveCount: indices.count, bytesPerIndex: sizeof(CInt))

    return SCNGeometry(sources: [vertexSource], elements: [element])
}

现在将nx和nz更改为:

let nx = 8
let nz = 8

崩溃

这似乎与指数的数量有很大关系,但在300左右我不相信我应该达到极限。

非常感谢任何建议,帮助或解决方案。感谢。

1 个答案:

答案 0 :(得分:1)

问题可能是您在创建primitiveCount: indices.count而不是SCNGeometryElement时传递indices.count/3(因为每个三角形有三个索引)。我很惊讶那里没有先前的检查,但如果没有这个,你肯定会看到一个崩溃,具体取决于索引的数量。