将 UIImage 作为纹理添加到 RealityKit 中的平面
Add UIImage as texture to a Plane in RealityKit
我在 swift 中试用了新的 RealityKit 框架,我想将 2D 图像放在 ARAnchor 上。我设法创建了一个网格平面,并尝试将图像作为纹理添加到该平面。我发现我可以给 material 一个本地图像。我怎样才能改用 UIImage?
let resource = try? TextureResource.load(named: "restart")
var material = UnlitMaterial()
material.baseColor = MaterialColorParameter.texture(resource!)
material.tintColor = UIColor.white.withAlphaComponent(0.99)
let imagePlane = ModelEntity(mesh: MeshResource.generatePlane(width: 0.25, height: 0.25), materials: [SimpleMaterial(color: color, isMetallic: true)])
目前,您不能在RealityKit 2.0 中使用UIImage 或CIImage 作为着色器的纹理。在RealityKit的两个版本中,纹理必须通过load()
方法的String类型参数加载。
RealityKit 2.0
要在 RealityKit 2.0 中将纹理分配给着色器,请使用以下方法:
let mesh: MeshResource = .generatePlane(width: 0.45, depth: 0.45)
var material = SimpleMaterial()
material.color = .init(tint: .white.withAlphaComponent(0.999),
texture: .init(try! .load(named: "texture.png")))
material.metallic = .float(1.0)
material.roughness = .float(0.0)
let model = ModelEntity(mesh: mesh, materials: [material])
RealityKit 1.0
要在 RealityKit 1.0 中将纹理分配给着色器,请使用此方法:
let scene = try! Experience.loadMyScene()
var material = SimpleMaterial()
material.baseColor = try! .texture(.load(named: "texture.png"))
material.metallic = MaterialScalarParameter(floatLiteral: 1.0)
material.roughness = MaterialScalarParameter(floatLiteral: 0.0)
material.tintColor = UIColor.white
let mesh: MeshResource = .generatePlane(width: 0.45, depth: 0.45)
let component = ModelComponent(mesh: mesh, materials: [material])
scene.myFavoriteScene?.children[0].components.set(component)
arView.scene.anchors.append(scene)
CGImage
尽管如此,您可以从内存中的 Core Graphics 图像创建纹理资源:
static func generate(from: CGImage,
withName: String?,
options: TextureResource.CreateOptions) -> TextureResource
此外,您可以使用 URL 参数:
material.color.texture = .init(try! .load(contentsOf: url)) // RealityKit 2.0
目前没有办法获取 UIImage 并将其直接应用于 Material(截至 2020 年 6 月)。
您可以先将 UIImage 写入磁盘,然后按照您对“重启”纹理所做的类似方式按名称加载它。
我在 swift 中试用了新的 RealityKit 框架,我想将 2D 图像放在 ARAnchor 上。我设法创建了一个网格平面,并尝试将图像作为纹理添加到该平面。我发现我可以给 material 一个本地图像。我怎样才能改用 UIImage?
let resource = try? TextureResource.load(named: "restart")
var material = UnlitMaterial()
material.baseColor = MaterialColorParameter.texture(resource!)
material.tintColor = UIColor.white.withAlphaComponent(0.99)
let imagePlane = ModelEntity(mesh: MeshResource.generatePlane(width: 0.25, height: 0.25), materials: [SimpleMaterial(color: color, isMetallic: true)])
目前,您不能在RealityKit 2.0 中使用UIImage 或CIImage 作为着色器的纹理。在RealityKit的两个版本中,纹理必须通过load()
方法的String类型参数加载。
RealityKit 2.0
要在 RealityKit 2.0 中将纹理分配给着色器,请使用以下方法:
let mesh: MeshResource = .generatePlane(width: 0.45, depth: 0.45)
var material = SimpleMaterial()
material.color = .init(tint: .white.withAlphaComponent(0.999),
texture: .init(try! .load(named: "texture.png")))
material.metallic = .float(1.0)
material.roughness = .float(0.0)
let model = ModelEntity(mesh: mesh, materials: [material])
RealityKit 1.0
要在 RealityKit 1.0 中将纹理分配给着色器,请使用此方法:
let scene = try! Experience.loadMyScene()
var material = SimpleMaterial()
material.baseColor = try! .texture(.load(named: "texture.png"))
material.metallic = MaterialScalarParameter(floatLiteral: 1.0)
material.roughness = MaterialScalarParameter(floatLiteral: 0.0)
material.tintColor = UIColor.white
let mesh: MeshResource = .generatePlane(width: 0.45, depth: 0.45)
let component = ModelComponent(mesh: mesh, materials: [material])
scene.myFavoriteScene?.children[0].components.set(component)
arView.scene.anchors.append(scene)
CGImage
尽管如此,您可以从内存中的 Core Graphics 图像创建纹理资源:
static func generate(from: CGImage,
withName: String?,
options: TextureResource.CreateOptions) -> TextureResource
此外,您可以使用 URL 参数:
material.color.texture = .init(try! .load(contentsOf: url)) // RealityKit 2.0
目前没有办法获取 UIImage 并将其直接应用于 Material(截至 2020 年 6 月)。
您可以先将 UIImage 写入磁盘,然后按照您对“重启”纹理所做的类似方式按名称加载它。