Scenekit - показывает материал только одного узла, а остальные черные.
Я работаю с ARKit и Scenekit, чтобы создать сетку с помощью простого сканирования. Он работает хорошо, и я могу успешно создавать геометрию и текстуры. Однако в представлении Scenekit я вижу только один из материалов узлов. Остальные узлы черные. Вы можете увидеть код ниже для создания материала и геометрии. Я создаю SCNGeometry для каждого якоря сетки. Блок кода ниже выполняется для каждого якоря сетки.
// Capture images for texture mapping
let texture = captureCamera(frame: frame)
self.textureImages.append(texture!)
// Create sources for mesh
let verticesSource = SCNGeometrySource(buffer: vertices.buffer, vertexFormat: vertices.format, semantic: .vertex, vertexCount: vertices.count, dataOffset: vertices.offset, dataStride: vertices.stride)
let normalsSource = SCNGeometrySource(buffer: normals.buffer, vertexFormat: normals.format, semantic: .normal, vertexCount: normals.count, dataOffset: normals.offset, dataStride: normals.offset)
let data = Data(bytes: faces.buffer.contents(), count: faces.buffer.length)
let facesElement = SCNGeometryElement(data: data, primitiveType: convertType(type: faces.primitiveType), primitiveCount: faces.count, bytesPerIndex: faces.bytesPerIndex)
let textureCoordinates = SCNGeometrySource(textureCoordinates: tempTexture)
let scnGeom = SCNGeometry(sources: [verticesSource, normalsSource, textureCoordinates], elements: [facesElement])
// Create material
let imMat = SCNMaterial()
imMat.isDoubleSided = true
imMat.diffuse.contents = texture
imMat.lightingModel = .constant
imMat.diffuse.wrapS = .clampToBorder
imMat.diffuse.wrapT = .clampToBorder
imMat.locksAmbientWithDiffuse = true
self.scnMaterials.append(imMat)
scnGeom.firstMaterial = imMat
let n = SCNNode(geometry: scnGeom)
n.geometry?.firstMaterial?.lightingModel = .constant
self.node.addChildNode(n)
После добавления нового узла в глобальный узел в качестве дочернего я создаю свою сцену, чтобы показать этот узел с дочерними узлами. Ниже вы можете увидеть код настройки сцены.
override func viewDidLoad() {
super.viewDidLoad()
initView()
let scene = setupScene(node: self.node)
initScene(scene: scene)
}
private func initScene(scene: SCNScene) {
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 5)
scene.rootNode.addChildNode(cameraNode)
// If you don't want to fix manually the lights
scnView.autoenablesDefaultLighting = true
scnView.allowsCameraControl = true
scnView.showsStatistics = true
scnView.backgroundColor = UIColor.darkGray
scnView.cameraControlConfiguration.allowsTranslation = false
scnView.scene = scene
}
private func setupScene(node: SCNNode) -> SCNScene {
let scene = SCNScene()
scene.rootNode.addChildNode(node)
printLog(message: "Node Added.")
return scene
}
Вы можете увидеть образец изображения.
Как я могу сделать все материалы видимыми с их текстурами, а не черными? Связана ли эта проблема с моими шагами по созданию узла? Для последней информации, мои координаты текстуры все выглядят правильно. Это мой первый вопрос. Так что, если я сделал что-то плохое, мне очень жаль. Спасибо вам всем.