let indices: [Int32] = [0, 1]
let source = SCNGeometrySource(vertices: [vector1, vector2])
let element = SCNGeometryElement(indices: indices,primitiveType: .line)
let line = SCNGeometry(sources: [source], elements: [element])
let node = SCNNode(geometry: line)
return node
创建 3D 物体
SceneKit 内置了一些 3D 物体,比较简单的像 SCNBox 可以创建一个立方体,SCNCylinder 可以创建一个圆柱体。创建难度都不大,按照 API 进行创建即可,以下是一个创建圆柱体的例子。
let cylinder = SCNCylinder(radius: 0.01, height: height)
let node = SCNNode(geometry: cylinder)
node.position = SCNVector3(x, y, z)
创建一个平面
创建平面与线类似,我们依旧使用上方的方法,SCNGeometryElement(indices,primitiveType)构造函数的第二个参数 element 的类型,有以下几种值可选:
let indices: [Int32] = [
4, // 4 point
0, 1, 2, 3]
let source = SCNGeometrySource(vertices: [vector1, vector2, vector3, vector4])
let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int>.size)
let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 1, bytesPerIndex: MemoryLayout<Int32>.size)
let rectangle = SCNGeometry(sources: [source], elements: [element])
let node = SCNNode(geometry: rectangle)
使用 polygon 是可以绘制出来一个平行四边形的,但是它有一个致命的 bug,至今我也没找到答案:在使用 material 对平行四边形进行填充时,如果 material 是透明的,无论是设置了透明度还是用一张图片,会导致内存问题:SceneKit Renderer “EXC_BAD_ACCESS (code=1, address=0xxxxx)”,使用纯色的 material 就没问题。所以,如果想绘制一个平行四边形,使用.triangles应该是最好的方案了。