J'ai un projet SceneKit avec deux objets dans la vue de la scène. Le premier objet est un plan créé via SCNPlane. Le deuxième objet est une simple boîte créée dans Blender. En code, je configure l'éclairage ambiant et omnidirectionnel. Il effets d'éclairage fonctionnent pour le plan: SceneKit importé COLLADA Boîte non « Lit »
Mais, quand j'ajoute la boîte au-dessus du plan, les effets d'éclairage fonctionnent sur le plan, mais pas la boîte importés du fichier COLLADA:
I soupçonne que le problème a à voir avec les normales, mais je ne suis pas sûr. Est-ce que quelqu'un qui importe DAE via SceneKit a vécu cela? Le code de configuration pour l'éclairage et des objets est la suivante:
private func setupAmbientLight() {
// setup ambient light source
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = SCNLight.LightType.ambient
ambientLightNode.light!.color = NSColor(white: 0.35, alpha: 1.0).cgColor
// add to scene
guard let scene = sceneView.scene else {
return
}
scene.rootNode.addChildNode(ambientLightNode)
}
private func setupOmniDirectionalLight() {
// initialize noe
let omniLightNode = SCNNode()
// assign light
omniLightNode.light = SCNLight()
// set type
omniLightNode.light!.type = SCNLight.LightType.omni
// color and position
omniLightNode.light!.color = NSColor(white: 0.56, alpha: 1.0).cgColor
omniLightNode.position = SCNVector3Make(0.0, 2000.0, 0.0)
// add to scene
guard let scene = sceneView.scene else {
return
}
scene.rootNode.addChildNode(omniLightNode)
}
private func setupPlane() {
// create plane geometry with size and material properties
let myPlane = SCNPlane(width: planeSideLength, height: planeSideLength)
myPlane.firstMaterial!.diffuse.contents = NSColor.orange.cgColor
myPlane.firstMaterial!.specular.contents = NSColor.white.cgColor
// intialize node
let planeNode = SCNNode()
// assign plane geometry to the node
planeNode.geometry = myPlane
// rotate -90.0 about the x-axis
let rotMat = SCNMatrix4MakeRotation(-CGFloat(M_PI/2.0), 1.0, 0.0, 0.0)
planeNode.transform = rotMat
planeNode.position = SCNVector3Make(0.0, 0.0, 0.0)
// setup the node's physics body property
planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: myPlane, options: nil))
planeNode.physicsBody!.categoryBitMask = PhysicsMask3DOF.plane.rawValue
// add to scene
guard let scene = sceneView.scene else {
return
}
scene.rootNode.addChildNode(planeNode)
}
private func setupRobot() {
guard let mainScene = sceneView.scene else {
return
}
let bundle = Bundle.main
guard let url = bundle.url(forResource: "robot.scnassets/test_cube", withExtension: "dae") else {
return
}
var cubeScene: SCNScene?
do {
try cubeScene = SCNScene.init(url: url, options: nil)
}
catch {
return
}
guard let cubeNode = cubeScene!.rootNode.childNode(withName: "Cube", recursively: true) else {
return
}
cubeNode.removeFromParentNode()
cubeNode.scale = SCNVector3Make(2000.0, 2000.0, 2000.0)
cubeNode.geometry!.firstMaterial!.diffuse.contents = NSColor.blue.cgColor
cubeNode.geometry!.firstMaterial!.specular.contents = NSColor.white.cgColor
mainScene.rootNode.addChildNode(cubeNode)
}
Mise à jour:
Je commentais le code pour importer la boîte de DAE et le code à la place ajouté pour créer la boîte via SCNBox et les effets de lumière apparaissent pour travailler:
Votre cube fichier '.dae' ont une source de lumière? Vous pouvez vérifier cela dans l'éditeur de scène Xcode. –
@dmsurti, oui il y avait un, mais je voulais seulement l'objet et d'utiliser la source de lumière dans la scène principale, qui est pas celui dans le fichier DAE. – xBACP
Je suppose que cela https://developer.apple.com/reference/scenekit/scnscenerenderer/1523812-autoenablesdefaultlighting peut l'expliquer, qui dit que 'Si la valeur de cette propriété est false (par défaut), la seule source de lumière SceneKit utilise pour le rendu une scène sont celles contenues dans le graphe de la scène ». Et votre scénographie a une lumière provenant du fichier 'cube.dae'. –