Как анимировать цвет фона сцены (SCNView). Обратите внимание, не сцена (SCNScene) и не обычный UIView

Можно ли анимировать свойство .backgroundColor объекта SCNView?

Обратите внимание, анимировать фон реальной сцены легко (SCNScene), и я знаю, как это сделать. Также легко анимировать фон обычного UIView.

Я не смог понять, как анимировать свойство .backgroundColor объекта SCNView.

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что вы берете игровой шаблон SceneKit по умолчанию (тот, что с вращающейся струей), я заработал, выполнив следующее:

Вот мой viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    
    // create a new scene
    let scene = SCNScene() // SCNScene(named: "art.scnassets/ship.scn")!
    
    // create and add a camera to the scene
    let cameraNode = SCNNode()
    cameraNode.camera = SCNCamera()
    scene.rootNode.addChildNode(cameraNode)
    
    // place the camera
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
    
    // create and add a light to the scene
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = .omni
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
    scene.rootNode.addChildNode(lightNode)
    
    // create and add an ambient light to the scene
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = .ambient
    ambientLightNode.light!.color = UIColor.darkGray
    scene.rootNode.addChildNode(ambientLightNode)
    
    // retrieve the ship node
    // let ship = scene.rootNode.childNode(withName: "ship", recursively: true)!
    
    // animate the 3d object
    // ship.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 2, z: 0, duration: 1)))
    
    // retrieve the SCNView
    let scnView = self.view as! SCNView
    
    // set the scene to the view
    scnView.scene = scene
    
    // allows the user to manipulate the camera
    scnView.allowsCameraControl = true
    
    // show statistics such as fps and timing information
    scnView.showsStatistics = true
    
    // Configure the initial background color of the SCNView
    scnView.backgroundColor = UIColor.red
    
    // Setup a SCNAction that rotates i.Ex the HUE Value of the Background
    let animColor = SCNAction.customAction(duration: 10.0) { _ , timeElapsed in
        
        scnView.backgroundColor = UIColor.init(hue: timeElapsed/10, saturation: 1.0, brightness: 1.0, alpha: 1.0)
        
    }

    // Run the Action (here using the rootNode)
    scene.rootNode.runAction(animColor)
    
    // add a tap gesture recognizer
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
    scnView.addGestureRecognizer(tapGesture)
}

Возможно, это не лучшее решение, но с использованием SCNTransaction мне не повезло. Надеюсь, я смог помочь в некотором роде.

Хм. Так что просто TBC, который у вас "действительно работает"?! Если да, то спасибо миллион. Интересно, WTF я делаю неправильно?

Fattie 20.11.2022 18:29

Вот мой проект, не стесняйтесь попробовать: drive.google.com/file/d/131KMZbZqHODwkcVPuVo-hCqeL2E5vtmV/…

ZAY 21.11.2022 08:23

Просто дополнение к удивительному и правильному ответу @ZAY.

Вы должны сделать покадровую анимацию цвета и,

По какой-то причине

  1. Вы делаете действие на сцене

  2. Но. Вы запускаете действие на корневом узле сцены.

Итак, это чудо.

Работает отлично.

Другие вопросы по теме