我有一堆立方体(SCNBox表示geometry of a SCNNode)。
每个多维数据集都有一个分配给各自的SCNMaterial数组的UIColor(一个UIColor)。
如下所示:
let box = SCNBox(width: 3.0, height: 3.0, length: 3.0, chamferRadius: 0.2)
let cubeNode = SCNNode(geometry: box)
let material = SCNMaterial()
material.diffuse.contents = UIColor.red
box.materials = [material]
(self.view as! SCNView).scene?.rootNode.addChildNode(cubeNode)当您点击这些立方体之一时,我尝试通过以下操作将它们的颜色更改为绿色:
material.diffuse.contents = UIColor.green但这并不总是起作用!有时立方体会按需要变成绿色,有时会保持红色。
我测试了一些理论,并确定了以下几点:
将多维数据集的颜色设置为绿色的代码确实会运行。实际上,将该材料设置为绿色(我通过correctly.
material.diffuse.contents ),我可以看到颜色设置为代码,以确定哪个多维数据集工作正常。所以,这不是命中测试之类的问题。。
对于照明,我只是使用scnView.autoenablesDefaultLighting = true。没有额外的灯光。
问题:还有其他人遇到过这个问题吗?我是不是做错了什么,还是这是一个合法的错误?
编辑:,这里有一些关于我如何尝试在点击时设置立方体颜色的更多信息:
@objc
func handleTap(_ gestureRecognize: UIGestureRecognizer) {
let scnView = self.view as! SCNView
let p = gestureRecognize.location(in: scnView)
let hitResults = scnView.hitTest(p, options: [:])
if hitResults.count > 0 {
let result = hitResults[0]
let material = result.node.geometry?.firstMaterial
if let material = material {
print("GREEN") //Prints "GREEN" every time, as expected -- but sometimes the cube turns green and sometimes it does not.
material.diffuse.contents = UIColor.green
}
}
}编辑2:我已经成功地完成了这个任务,但是剩下的问题比答案还多。
我没有通过设置material.diffuse.contents来更新多维数据集的颜色,而是尝试使用material.emission.contents。无论出于什么原因,这是100%的时间,如所需。
缺点是,在设置material.emission.contents时,多维数据集的视觉外观有点奇怪,而不一定是我所要寻找的。是的,它是绿色的但那是另一回事。
如果你能解释这些行为的话,可以随意发布这个问题的答案。
发布于 2022-04-03 08:09:00
我在macOS 12.3.1上试用了Xcode 13.3中的示例代码,一切都很好(应用程序和模拟器)。
确保你使用的是UITapGestureRecognizer,而不是UIPanGestureRecognizer
let recognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
(self.view as! SCNView).addGestureRecognizer(recognizer)https://stackoverflow.com/questions/71722492
复制相似问题