在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左右我不相信我应该达到极限。
非常感谢任何建议,帮助或解决方案。感谢。
答案 0 :(得分:1)
问题可能是您在创建primitiveCount: indices.count
而不是SCNGeometryElement
时传递indices.count/3
(因为每个三角形有三个索引)。我很惊讶那里没有先前的检查,但如果没有这个,你肯定会看到一个崩溃,具体取决于索引的数量。