You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SceneKit中实现灯光随相机同步移动的手电筒式模型照明效果

解决相机携带手电筒式聚光灯的问题

我明白你想要的效果——让相机像手电筒一样走到哪照到哪,始终照亮镜头对准的模型部分。你之前用directional方向灯的思路有问题,因为方向灯是平行光,相当于从无限远的固定方向照过来,哪怕挂在相机上,也没法模拟出手电筒那种“从当前位置指向镜头前方”的聚光效果。

下面是调整后的解决方案:

核心修改:换成聚光灯(Spotlight)

方向灯不适合你的场景,我们需要用.spot类型的灯光,它能模拟出类似手电筒的定向照射效果,光线从相机位置发出,沿着相机的朝向(也就是镜头对准的方向)扩散。

修改后的完整代码

let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)

let light = SCNLight()
light.type = .spot // 替换为聚光灯类型
light.color = UIColor(red: 1, green: 1, blue: 1, alpha: 0.9) // 简化颜色赋值
light.castsShadow = true

// 配置聚光灯参数,让效果更贴近手电筒
light.spotInnerAngle = 30    // 中心高亮区域的角度,数值越小越集中
light.spotOuterAngle = 60    // 外围过渡区域的角度,形成自然的光线衰减
light.attenuationStartDistance = 0  // 光线从相机位置就开始衰减
light.attenuationEndDistance = 50   // 光线在50单位距离外完全消失,可根据你的场景调整

cameraNode.light = light

cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)

let scnView = self.view as! SCNView
scnView.pointOfView = cameraNode
scnView.allowsCameraControl = true

为什么之前的方向灯不行?

directional方向灯的本质是平行光,所有光线都是平行的,相当于“太阳光照”——不管相机怎么移动,光线的方向只和相机节点的局部坐标系有关,而不是从相机位置指向模型。当你转到模型背面时,平行光的方向没对准背面,自然就全黑了。

而聚光灯是点光源+定向照射,它的光线从相机节点的位置出发,沿着节点的-z轴(也就是相机镜头朝向的方向)扩散,完美匹配你要的“相机走到哪,灯光照到哪”的效果。

如果你想要更聚焦的手电筒效果,可以减小spotInnerAngle和spotOuterAngle的数值;如果希望光线照得更远,就增大attenuationEndDistance即可。

内容的提问来源于stack exchange,提问作者West1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:27:51