如何解决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 举报,一经查实,本站将立刻删除。