在 Reality Composer 生成的场景中以编程方式设置纹理 [英] Programmatically setting texture in Scene generated by Reality Composer

查看:21
本文介绍了在 Reality Composer 生成的场景中以编程方式设置纹理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Reality Composer 创建一个圆柱体对象.我的要求是用自定义图像包裹圆柱体.图片由应用动态创建.

I am creating a cylinder object using Reality Composer. My requirement is to wrap the cylinder with custom image. Image is dynamically created by the app.

我尝试了以下方法,但目前还没有奏效.

I have tried following approach and so far it's not working.

  1. 从 Experience 加载锚点后.

    1. 从锚点获取模型实体.

    1. 从模型实体中获取模型组件.

    1. 添加或编辑材料.

  • 代码:

    // Load the "anchor" scene from the "Experience" Reality File
    let anchor = try! Experience.loadAnchor()
    
    // Add the anchor to the scene
    arView.scene.anchors.append(anchor)
    
    let cylinderEntity : Entity = anchor.cylinder!
    
    let cylinderModelEntity = cylinderEntity.children[0]
    
    var cylinderModelComponent : ModelComponent = cylinderModelEntity.components[ModelComponent.self]!
    
    let paths : NSArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
    let path : NSString = paths.object(at: 0) as! NSString
    let filePath : NSString = path.strings(byAppendingPaths: ["Image.png"])[0] as NSString
    let url = URL.init(fileURLWithPath: filePath as String)
    
    // Save image.
    let image : UIImage = createImage()
    try! image.pngData()?.write(to: url)
    let data = NSData.init(contentsOf: url)
    print(data!)
    
    var material = SimpleMaterial()
    material.tintColor = UIColor.yellow
    material.baseColor = try! MaterialColorParameter.texture(TextureResource.load(contentsOf: url))
    material.roughness = MaterialScalarParameter(floatLiteral: 0.1)
    material.metallic = MaterialScalarParameter(floatLiteral: 1.0)
    
    cylinderModelComponent.materials[0] = material
    

    非常感谢任何帮助.

    推荐答案

    您忘记设置需要存储在实体上的boxComponent.

    为此使用set()实例方法.

    For this use set() instance method.

    在您的代码中,它应该如下所示:

    In your code it should look like this:

    anchor.cylinder!.components.set(cylinderModelComponent)
    

    在我的代码中它看起来像这样:

    In my code it looks like this:

    anchor.steelBox!.components.set(boxComponent)
    

    这是我的完整代码版本(我在 macOS 应用中测试过):

    Here are my full code version (I tested it in macOS app):

    import AppKit
    import RealityKit
    
    class GameViewController: NSViewController {
    
        @IBOutlet var arView: ARView!
    
        override func awakeFromNib() {
    
            let anchor = try! Experience.loadBox()
            anchor.steelBox?.scale = SIMD3(x: 9, y: 9, z: 9)
            anchor.steelBox?.orientation = simd_quatf(angle: -Float.pi/4,
                                                       axis: SIMD3(x: 1, y: 1, z: 0))      
    
            let boxEntity: Entity = anchor.steelBox!.children[0]
            var boxComponent: ModelComponent = boxEntity.components[ModelComponent].self!
    
            let paths: NSArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, 
                                                                     .userDomainMask, 
                                                                      true) as NSArray
    
            // If you're testing it in macOS app – place your Image.png here:
            // /Users/<UserName>/Library/Containers/<ApplicationName>/Data/Documents/
    
            let path: NSString = paths.object(at: 0) as! NSString
            let filePath: NSString = path.strings(byAppendingPaths: ["Image.png"])[0] as NSString
            let url = URL(fileURLWithPath: filePath as String)
    
            var material = SimpleMaterial()
            material.tintColor = NSColor.yellow
            material.baseColor = try! MaterialColorParameter.texture(TextureResource.load(contentsOf: url))
            material.roughness = MaterialScalarParameter(floatLiteral: 0.1)
            material.metallic = MaterialScalarParameter(floatLiteral: 0.1)    
            boxComponent.materials = [material]
    
            anchor.steelBox!.components.set(boxComponent)
            arView.scene.anchors.append(anchor)
        }
    }
    

    这篇关于在 Reality Composer 生成的场景中以编程方式设置纹理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆