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
}

您可以看到 sample image

如何使所有材质的纹理可见而不是黑色?这个问题与我的节点创建步骤有关吗?对于最后的信息,我的纹理坐标看起来都是正确的。这是我的第一个问题。所以,如果我做了坏事,我很抱歉。谢谢大家。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)