SceneKit:向相机节点添加定向光没有效果

Posted

技术标签:

【中文标题】SceneKit:向相机节点添加定向光没有效果【英文标题】:SceneKit: adding directional light to camera node has no effect 【发布时间】:2018-08-01 14:27:11 【问题描述】:

根据in this answer 的建议,我们的目标是在场景中添加环境光以及向相机添加定向光。

这适用于 Xcode 场景编辑器,定向光设置为 70% 白色,环境光设置为 50% 白色。定向光的欧拉角使用默认值。

编码这种安排失败。就好像没有添加定向光一样。对场景没有影响;好像只有环境光存在。

欧拉角的x 分量的不同值没有区别 - PI/2、PI 和其他值已尝试但仍然没有变化。

然而,将定向光添加到场景的根节点 (scene.rootNode.addChildNode(directionalLightNode)) 确实会将光添加到场景中。

fileprivate func addLightNode() 
    // Create ambient light
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = .ambient
    ambientLightNode.light!.color = UIColor(white: 0.70, alpha: 1.0)

    // Add ambient light to scene
    scene.rootNode.addChildNode(ambientLightNode)

    // Create directional light
    let directionalLight = SCNNode()
    directionalLight.light = SCNLight()
    directionalLight.light!.type = .directional
    directionalLight.light!.color = UIColor(white: 1.0, alpha: 1.0)
    directionalLight.eulerAngles = SCNVector3(x: 0, y: 0, z: 0)

    // Add directional light to camera
    let cameraNode = sceneView.pointOfView!
    cameraNode.addChildNode(directionalLight)

【问题讨论】:

【参考方案1】:

创建一个 SCNNode,例如名称为 cameraNode。 创建一个 SCNCamera 并将其分配给 cameraNode 的 camera 属性。 将 cameraNode 添加到场景中(作为 rootNode 的子节点)。

之后,您可以将灯光节点添加为 cameraNode 的子节点,或者,如果它是唯一的相机,则作为 pointOfView 节点的子节点(它现在代表您创建并添加到场景中的 cameraNode)。默认相机及其 pointOfView 节点不是场景对象层次结构的一部分。

【讨论】:

是的,这是我们在发布赏金后意识到的。我们将发布答案,但你会这样做,你可以获得额外的积分。 :) 你知道默认相机是如何实现缩放功能的吗? 2015 年的一个答案声称 Fov 值在捏合时会发生变化,但现在情况似乎并非如此。无论您放大多少,Fov 值都保持不变。 在使用默认相机控件时,确实是 fieldOfView 值(scnView.pointOfView.camera.fieldOfView)发生了变化。 你是对的,看来保存pointOfView关联的节点不能正常工作,因此值没有改变,谢谢! 使用默认相机控件时,它不是旋转的模型。相机围绕模型旋转只是给人一种印象。而是查看 pointOfView 的旋转值。手动获得类似效果的一种简单方法是创建一个辅助节点,只是一个空的 SCNNode,并将其放置在您要使用相机环绕的中心。然后将 cameraNode 放置在某个 z 值(适用于您的场景/模型大小和 fov 的任何值)并使该相机成为辅助节点的子节点,然后根据平移手势输入旋转辅助节点。

以上是关于SceneKit:向相机节点添加定向光没有效果的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发之SceneKit框架--SCNLight.h

Scenekit - 将子节点(平面节点)添加到相机前面的父节点(球体节点)

有没有办法链接 SceneKit 动画?

SceneKit:关于定位相机节点的数学问题

SceneKit 相机节点在捏合手势时重置

如何在 SceneKit 中将 allowCameraControl 与相机节点一起使用