在 Reality Composer 生成的场景中以编程方式设置纹理
Programmatically setting texture in Scene generated by Reality Composer
我正在使用 Reality Composer 创建一个圆柱体对象。
我的要求是用自定义图像包裹圆柱体。
图片由应用程序动态创建。
我已经尝试了以下方法,但到目前为止它没有用。
- 从经验加载锚点后。
- 从锚点获取模型实体。
- 从模型实体中获取模型组件。
- 添加或编辑 material.
代码:
// 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
非常感谢任何帮助。
You forgot to set a boxComponent
which need to be stored on the entity.
为此使用set()
实例方法.
在您的代码中,它应该如下所示:
anchor.cylinder!.components.set(cylinderModelComponent)
在我的代码中它看起来像这样:
anchor.steelBox!.components.set(boxComponent)
这是我的完整代码版本(我在 macOS 应用程序中测试过):
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 创建一个圆柱体对象。 我的要求是用自定义图像包裹圆柱体。 图片由应用程序动态创建。
我已经尝试了以下方法,但到目前为止它没有用。
- 从经验加载锚点后。
- 从锚点获取模型实体。
- 从模型实体中获取模型组件。
- 添加或编辑 material.
代码:
// 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
非常感谢任何帮助。
You forgot to set a
boxComponent
which need to be stored on the entity.
为此使用set()
实例方法.
在您的代码中,它应该如下所示:
anchor.cylinder!.components.set(cylinderModelComponent)
在我的代码中它看起来像这样:
anchor.steelBox!.components.set(boxComponent)
这是我的完整代码版本(我在 macOS 应用程序中测试过):
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)
}
}