【问题标题】:UIImage in SwiftUI SceneViewSwiftUI 场景视图中的 UIImage
【发布时间】:2021-08-01 14:43:23
【问题描述】:

我想在 SceneView 中将 UIImage 转换为 3D 对象。我找到了以下代码示例,它应该可以工作,但没有显示任何内容。资源“占位符”只是一个随机的 PNG 图像。

import SwiftUI
import SceneKit

struct TestScene: View {
    
    var cameraNode: SCNNode? {
        let node = SCNNode(geometry: SCNPlane())
        node.geometry?.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: "placeholder")
        return node
    }
    
    var body: some View {
        SceneView(
            scene: SCNScene(),
            pointOfView: cameraNode,
            options: []
        )
    }
    
}

struct TestScene_Previews: PreviewProvider {
    static var previews: some View {
        TestScene()
    }
}

编辑:使用示例 SCNScene 测试了此代码的变体,它可以工作!但我需要弄清楚如何使用 SwiftUI 将 UIImage 转换为空 SCNScene 中的材质。

【问题讨论】:

  • 您的可选链接是否有效?我的意思是,geometryfirstMaterial 是否已定义,或者它们是否为零?
  • 这可能就是原因。老实说,我不知道。我只是从这个答案中获取了代码,但它并没有说明它应该如何实现。 stackoverflow.com/a/49451321/15072454
  • 您可以设置一对 if/let 而不是使用可选链接来检查这些属性是否已定义。你知道我的意思吗?
  • 我可以试试。我认为主要问题是节点似乎从未附加到场景。在这个问题中,他们将其作为 childNode 附加,但我不知道他们将它附加到什么,也无法让它与我的设置一起使用。 stackoverflow.com/q/63921221/15072454
  • 是的,您实际上是在将 empty SCNScene 加载到 SceneView 中,因此您只会得到一个空白屏幕。您需要实现SCNScene,然后将任何节点添加到该场景并将相同的实例加载到您的SceneView。我对 SceneKit 一无所知(我喜欢 SpriteKit),但它是同一个概念。

标签: swift swiftui scenekit


【解决方案1】:

这是我如何解决它的通用示例。 请注意,“占位符”是项目 XCAsset 中图像 (PNG) 的名称。

import SwiftUI
import SceneKit

struct Augment: View {
    
    var scene: SCNScene? {
        let myScene = SCNScene()
        let node = SCNNode(geometry: SCNPlane())
        node.geometry?.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: "placeholder")
        myScene.rootNode.addChildNode(node)
        return myScene
    }
    
    var body: some View {
        SceneView(scene: scene)
    }
    
}

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2015-11-22
    • 2021-03-17
    • 2021-06-04
    相关资源
    最近更新 更多