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
}

Вы можете увидеть образец изображения.

Как я могу сделать все материалы видимыми с их текстурами, а не черными? Связана ли эта проблема с моими шагами по созданию узла? Для последней информации, мои координаты текстуры все выглядят правильно. Это мой первый вопрос. Так что, если я сделал что-то плохое, мне очень жаль. Спасибо вам всем.

0 ответов

Другие вопросы по тегам