首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SCNMaterial设置“diffuse.contents”时不改变颜色

SCNMaterial设置“diffuse.contents”时不改变颜色
EN

Stack Overflow用户
提问于 2022-04-03 02:14:23
回答 1查看 202关注 0票数 1

我有一堆立方体(SCNBox表示geometry of a SCNNode)。

每个多维数据集都有一个分配给各自的SCNMaterial数组的UIColor(一个UIColor)。

如下所示:

代码语言:javascript
复制
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)

当您点击这些立方体之一时,我尝试通过以下操作将它们的颜色更改为绿色:

代码语言:javascript
复制
material.diffuse.contents = UIColor.green

但这并不总是起作用!有时立方体会按需要变成绿色,有时会保持红色。

我测试了一些理论,并确定了以下几点:

将多维数据集的颜色设置为绿色的代码确实会运行。实际上,将该材料设置为绿色(我通过correctly.

  • The查看了material.diffuse.contents ),我可以看到颜色设置为代码,以确定哪个多维数据集工作正常。所以,这不是命中测试之类的问题。
  1. 这个问题发生在模拟器和设备上。

对于照明,我只是使用scnView.autoenablesDefaultLighting = true。没有额外的灯光。

问题:还有其他人遇到过这个问题吗?我是不是做错了什么,还是这是一个合法的错误?

编辑:,这里有一些关于我如何尝试在点击时设置立方体颜色的更多信息:

代码语言:javascript
复制
@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时,多维数据集的视觉外观有点奇怪,而不一定是我所要寻找的。是的,它是绿色的但那是另一回事。

如果你能解释这些行为的话,可以随意发布这个问题的答案。

EN

回答 1

Stack Overflow用户

发布于 2022-04-03 08:09:00

我在macOS 12.3.1上试用了Xcode 13.3中的示例代码,一切都很好(应用程序和模拟器)。

确保你使用的是UITapGestureRecognizer,而不是UIPanGestureRecognizer

代码语言:javascript
复制
let recognizer = UITapGestureRecognizer(target: self, action: #selector(tap))
(self.view as! SCNView).addGestureRecognizer(recognizer)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71722492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档