Ios SceneKit逐顶点颜色
我一直在玩SceneKit,但我不知道如何创建逐顶点颜色几何体 更准确地说,我想这样做: 如果不清楚,请告诉我 谢谢。倾倒信息:Ios SceneKit逐顶点颜色,ios,swift,scenekit,vertex,Ios,Swift,Scenekit,Vertex,我一直在玩SceneKit,但我不知道如何创建逐顶点颜色几何体 更准确地说,我想这样做: 如果不清楚,请告诉我 谢谢。倾倒信息: sceneView = SCNView(frame: sceneContainer.bounds) sceneView.scene = SCNScene() sceneView.allowsCameraControl = true sceneView.autoenablesDefaultLighting = true scene
sceneView = SCNView(frame: sceneContainer.bounds)
sceneView.scene = SCNScene()
sceneView.allowsCameraControl = true
sceneView.autoenablesDefaultLighting = true
sceneView.showsStatistics = true
sceneView.backgroundColor = UIColor.darkGrayColor()
self.sceneContainer.addSubview(sceneView)
// Vertex
let vertices: [SCNVector3] = [SCNVector3(0, 0, 0),
SCNVector3(1, 0, 0),
SCNVector3(0.5, 1, 0)]
let vertexData = NSData(bytes: vertices, length: vertices.count * sizeof(SCNVector3))
let vertexSource = SCNGeometrySource(data: vertexData, semantic: SCNGeometrySourceSemanticVertex, vectorCount: vertices.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Float), dataOffset: 0, dataStride: sizeof(SCNVector3))
// Faces
let indices: [Int32] = [0,1,2]
let indexData = NSData(bytes: indices, length: sizeof(Int32) * indices.count)
let indexElement = SCNGeometryElement(data: indexData, primitiveType: SCNGeometryPrimitiveType.Triangles, primitiveCount: indices.count / 3, bytesPerIndex: sizeof(CInt))
// Normals
let normals: [SCNVector3] = [SCNVector3(0, 0, 1),
SCNVector3(0, 0, 1),
SCNVector3(0, 0, 1)]
let normalData = NSData(bytes: normals, length: sizeof(SCNVector3) * normals.count)
let normalSource = SCNGeometrySource(data: normalData, semantic: SCNGeometrySourceSemanticNormal, vectorCount: normals.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Float), dataOffset: 0, dataStride: sizeof(SCNVector3))
// Colors
let colors: [SCNVector3] = [SCNVector3(1, 0, 0),
SCNVector3(0, 1, 0),
SCNVector3(0, 0, 1)]
let colorData = NSData(bytes: colors, length: sizeof(SCNVector3) * colors.count)
let colorSource = SCNGeometrySource(data: colorData, semantic: SCNGeometrySourceSemanticColor, vectorCount: colors.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Float), dataOffset: 0, dataStride: sizeof(SCNVector3))
// Geometry
let voxelGeometry = SCNGeometry(sources: [vertexSource, normalSource, colorSource], elements: [indexElement])
let voxelMaterial = SCNMaterial()
voxelMaterial.diffuse.contents = UIColor.whiteColor()
voxelGeometry.materials = [voxelMaterial]
voxelNode = SCNNode(geometry: voxelGeometry)
voxelNode.position = SCNVector3(0, 0, 0)
sceneView.scene?.rootNode.addChildNode(voxelNode)
我想我在这里发现了一些有趣的东西,SCNGeometrySource中的示例只讨论了顶点位置、法线和texCoord,但是还有颜色的语义,Swift 3需要一些小的更新。sizeof替换为MemoryLayout.size,语义参数可以是例如.color,您还可以使用Swift中的扩展函数隐藏许多低级C语言错误,例如``extension-SCNGeometrySource{便利init(data:[SCInvector3],semantic:SCNGeometrySource.semantic){let-dataData=NSData(bytes:data,length:data.count*MemoryLayout.size)self.init(data:dataData-as-data,semantic:semantic,vectorCount:data.count,usesFloatComponents:true,Components-Curvector:3,bytesPerComponent:MemoryLayout.size,dataOffset:0,dataStride:MemoryLayout.size)}```