SceneKit 避免在特定节点上照明
SceneKit avoid lighting on specific node
在 SceneKit 中,我正在构建一个由线组成的节点,以在场景的中心绘制 XYZ 轴,就像在 Cinema4D 中一样。
我希望这 3 个节点不参与全局照明,即使光线很暗/不存在/太强也能看到。在下图中,您可以看到 Z 轴显得太亮而看不到。
有没有办法阻止节点参与场景的光照,比如物理类别蒙版?
在这种情况下,如何使节点变亮才能使其出现?
SCNLight
有一个 categoryBitMask
属性。这使您可以选择受光影响的节点(尽管对于环境光而言这会被忽略)。你可以有 2 个光源类别,一个用于你的主场景,另一个只影响你的线条。
这是一个简单的例子,有 2 个节点,每个节点都点亮了不同颜色的光:
struct LightType {
static let light1:Int = 0x1 << 1
static let light2:Int = 0x1 << 2
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene(named: "art.scnassets/scene.scn")!
let lightNode1 = SCNNode()
lightNode1.light = SCNLight()
lightNode1.light!.type = .omni
lightNode1.light!.color = UIColor.yellow
lightNode1.position = SCNVector3(x: 0, y: 10, z: 10)
lightNode1.light!.categoryBitMask = LightType.light1
scene.rootNode.addChildNode(lightNode1)
let lightNode2 = SCNNode()
lightNode2.light = SCNLight()
lightNode2.light!.type = .omni
lightNode2.light!.color = UIColor.red
lightNode2.position = SCNVector3(x: 0, y: 10, z: 10)
lightNode2.light!.categoryBitMask = LightType.light2
scene.rootNode.addChildNode(lightNode2)
let sphere1 = scene.rootNode.childNode(withName: "sphere1", recursively: true)!
sphere1.categoryBitMask = LightType.light1
let sphere2 = scene.rootNode.childNode(withName: "sphere2", recursively: true)!
sphere2.categoryBitMask = LightType.light2
let scnView = self.view as! SCNView
scnView.scene = scene
}
}
我认为将 material 的闪电模型设置为常量会容易得多。
yourNode.geometry?.firstMaterial?.lightingModel = SCNMaterial.LightingModel.constant
在 SceneKit 中,我正在构建一个由线组成的节点,以在场景的中心绘制 XYZ 轴,就像在 Cinema4D 中一样。
我希望这 3 个节点不参与全局照明,即使光线很暗/不存在/太强也能看到。在下图中,您可以看到 Z 轴显得太亮而看不到。
有没有办法阻止节点参与场景的光照,比如物理类别蒙版?
在这种情况下,如何使节点变亮才能使其出现?
SCNLight
有一个 categoryBitMask
属性。这使您可以选择受光影响的节点(尽管对于环境光而言这会被忽略)。你可以有 2 个光源类别,一个用于你的主场景,另一个只影响你的线条。
这是一个简单的例子,有 2 个节点,每个节点都点亮了不同颜色的光:
struct LightType {
static let light1:Int = 0x1 << 1
static let light2:Int = 0x1 << 2
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = SCNScene(named: "art.scnassets/scene.scn")!
let lightNode1 = SCNNode()
lightNode1.light = SCNLight()
lightNode1.light!.type = .omni
lightNode1.light!.color = UIColor.yellow
lightNode1.position = SCNVector3(x: 0, y: 10, z: 10)
lightNode1.light!.categoryBitMask = LightType.light1
scene.rootNode.addChildNode(lightNode1)
let lightNode2 = SCNNode()
lightNode2.light = SCNLight()
lightNode2.light!.type = .omni
lightNode2.light!.color = UIColor.red
lightNode2.position = SCNVector3(x: 0, y: 10, z: 10)
lightNode2.light!.categoryBitMask = LightType.light2
scene.rootNode.addChildNode(lightNode2)
let sphere1 = scene.rootNode.childNode(withName: "sphere1", recursively: true)!
sphere1.categoryBitMask = LightType.light1
let sphere2 = scene.rootNode.childNode(withName: "sphere2", recursively: true)!
sphere2.categoryBitMask = LightType.light2
let scnView = self.view as! SCNView
scnView.scene = scene
}
}
我认为将 material 的闪电模型设置为常量会容易得多。
yourNode.geometry?.firstMaterial?.lightingModel = SCNMaterial.LightingModel.constant