是否可以用鲜红色的 SCNSpotlight 画出清晰的 SCNSphere?
Posted
技术标签:
【中文标题】是否可以用鲜红色的 SCNSpotlight 画出清晰的 SCNSphere?【英文标题】:Is it possible to draw a clear SCNSphere with a bright red SCNSpotlight? 【发布时间】:2017-01-22 08:45:25 【问题描述】:最近几天我在使用 SceneKit 时遇到了一些困难。我正在尝试绘制一个清晰/透明的 SCNSphere,带有红色聚光灯。如果我将 SCNSphere 设置为透明/清晰的颜色,我的红色聚光灯似乎也变得透明。是否可以取消 SCNLight 节点与 SCNSphereNode 的链接,以便在 SCNSphere 透明的情况下保留光斑的鲜红色?两个球体的图像都在代码下方。
我的代码:
func setupView()
scene = SCNScene()
caliView.scene = scene
caliView.allowsCameraControl = true
caliView.backgroundColor = UIColor.clearColor()
let clearMaterial = SCNMaterial()
clearMaterial.diffuse.contents = UIColor(white: 0.9, alpha: 0.5)
clearMaterial.locksAmbientWithDiffuse = true
let shape = SCNSphere(radius: 5)
shape.materials = [clearMaterial]
let shapeNode = SCNNode(geometry: shape)
let spotLight = SCNLight()
spotLight.type = SCNLightTypeSpot
spotLight.color = UIColor.init(colorLiteralRed: 180, green: 0, blue: 0, alpha: 0.0)
let lightNode = SCNNode()
lightNode.light = spotLight
lightNode.position = SCNVector3(x: 0.0, y:0.0, z:15.0)
lightNode.orientation = SCNQuaternion(x: 0.0, y:0, z:30, w:0.0)
let ambientLight = SCNLight()
ambientLight.type = SCNLightTypeAmbient
ambientLight.color = UIColor(white: 0.8, alpha: 0.2)
let ambientNode = SCNNode()
ambientNode.light = ambientLight
shapeNode.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)
scene.rootNode.addChildNode(ambientNode)
scene.rootNode.addChildNode(shapeNode)
shapeNode.addChildNode(lightNode)
带有明亮红色聚光灯的较暗球体:
更透明的球体,带有柔和的红色聚光灯:
【问题讨论】:
【参考方案1】:在这一行... shapeNode.addChildNode(lightNode) ...您将灯光节点添加到球体节点。
如果你想取消它们的链接同时仍然让它们一起移动,你可以创建一个空的 SCNNode 并将另外两个 SCNNode 实例作为子节点添加到它(一个用于灯光,一个用于球体):
func setupView()
scene = SCNScene()
caliView.scene = scene
caliView.allowsCameraControl = true
caliView.backgroundColor = UIColor.clearColor()
let clearMaterial = SCNMaterial()
clearMaterial.diffuse.contents = UIColor(white: 0.9, alpha: 0.5)
clearMaterial.locksAmbientWithDiffuse = true
let emptyNode = SCNNode()
let shape = SCNSphere(radius: 5)
shape.materials = [clearMaterial]
let shapeNode = SCNNode(geometry: shape)
let spotLight = SCNLight()
spotLight.type = SCNLightTypeSpot
spotLight.color = UIColor.init(colorLiteralRed: 180, green: 0, blue: 0, alpha: 0.0)
let lightNode = SCNNode()
lightNode.light = spotLight
lightNode.position = SCNVector3(x: 0.0, y:0.0, z:15.0)
lightNode.orientation = SCNQuaternion(x: 0.0, y:0, z:30, w:0.0)
let ambientLight = SCNLight()
ambientLight.type = SCNLightTypeAmbient
ambientLight.color = UIColor(white: 0.8, alpha: 0.2)
let ambientNode = SCNNode()
ambientNode.light = ambientLight
shapeNode.position = SCNVector3(x: 0.0, y: 0.0, z: 0.0)
emptyNode.addChild(shapeNode)
emptyNode.addChild(lightNode)
scene.rootNode.addChildNode(emptyNode)
scene.rootNode.addChildNode(ambientNode)
【讨论】:
感谢您的回复!试图实现这段代码..但不幸的是它不起作用:-(同样的问题:如果我试图让球体更透明,红灯也会这样做 我觉得你可以用categorybitmask解决问题 我认为我们从错误的角度解决了问题。难道我们不希望斑点的颜色/透明度与球体的颜色/透明度混合吗?这就是渲染器所做的。 是的,可能......有没有办法为现场创建单独的渲染路径? 如文档所述:仅将 SceneKit 灯光用于动态光源或影响移动对象的灯光。对于场景的静态照明部分,在外部 3D 创作工具(也称为烘焙照明)中创建光照贴图纹理,并使用乘法材质属性将其应用于场景中的对象。 >>> 你的场景是动态的还是静态的?以上是关于是否可以用鲜红色的 SCNSpotlight 画出清晰的 SCNSphere?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Mathematica 软件中画出一个三维向量的3D 图像,是否用这个函数ListVectorFieldPlot3D ,怎么画的