RealityKit 1.0
(iOS | macOS)
在RealityKit 1.0中有一种解决方案,可以让您控制物体的透明度。您可以使用SimpleMaterial()
的baseColor
或tintColor
实例属性来实现:
var tintColor: NSColor { get set }
var baseColor: NSColor { get set }
var tintColor: UIColor { get set }
var baseColor: UIColor { get set }
即使在iOS中,它也可以完美运行,甚至带有颜色参数。
import UIKit
import RealityKit
class GameViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
arView.backgroundColor = .black
var material = SimpleMaterial()
material.tintColor = UIColor.init(red: 1.0,
green: 1.0,
blue: 1.0,
alpha: 0.025)
material.baseColor = MaterialColorParameter.color(UIColor.red)
let mesh: MeshResource = .generateSphere(radius: 0.7)
let modelEntity = ModelEntity(mesh: mesh,
materials: [material])
let anchor = AnchorEntity()
anchor.addChild(modelEntity)
arView.scene.anchors.append(anchor)
}
}
macOS解决方案(RealityKit 1.0的纹理示例):
var material = SimpleMaterial()
material.tintColor = NSColor.init(red: 0.0, green: 1.0, blue: 1.0, alpha: 0.5)
material.baseColor = try! MaterialColorParameter.texture(TextureResource.load(contentsOf: url))
material.roughness = MaterialScalarParameter(floatLiteral: 0.0)
material.metallic = MaterialScalarParameter(floatLiteral: 1.0)
cubeComponent.materials = [material]
let mesh: MeshResource = .generateSphere(radius: 0.7)
let sphereComponent = ModelComponent(mesh: mesh,
materials: [material])
anchor.steelBox!.components.set(cubeComponent)
anchor.components.set(sphereComponent)
arView.scene.anchors.append(anchor)
如果您不需要模型上的任何纹理(只需颜色和透明度),您可以通过
baseColor
实例属性来控制透明度。
material.baseColor = MaterialColorParameter.color(.init(red: 0.0,
green: 1.0,
blue: 1.0,
alpha: 0.5))
如果您的场景中包含两种类型的对象 - 一种是在Reality Composer中创建的,另一种是在Xcode中以编程方式创建的,并且您将相同的材质分配给这两个对象 - 编译后的应用程序会出现一些渲染问题(请查看下面的图片)。
这是由于RealityKit的工作不稳定(因为该框架目前还太年轻)。我认为在下一个版本的RealityKit中,诸如“Reality Composer模型上缺少纹理”和“球体上残留奇怪的反射”等错误将被消除。
RealityKit 2.0
(iOS | macOS)
在RealityKit 2.0中,AR团队的工程师们为我们提供了一个.color
属性,取代了.baseColor
和.tintColor
。这两个属性在iOS 15中已被弃用。
iOS解决方案(RealityKit 2.0的颜色示例)
var material = SimpleMaterial()
material.color = .init(tint: .red.withAlphaComponent(0.05), texture: nil)
material.baseColor // deprecated in iOS 15
material.tintColor // deprecated in iOS 15
iOS解决方案(RealityKit 2.0的纹理示例)
可以使用相同的初始化器来应用纹理:
material.color = try! .init(tint: .white.withAlphaComponent(0.9999),
texture: .init(.load(named: "mat.png", in: nil)))
特别注意“tint”乘数 - 如果您的纹理有透明部分,必须使用0.9999的值。
而且,您可以在
这里找到如何设置PhysicallyBasedMaterial的透明度。
RealityKit
(visionOS)
在 visionOS 的 RealityKit 中,有一个名为 OpacityComponent
的组件,其默认的 opacity
参数值为 1.0。
let model = ModelEntity(mesh: .generateSphere(radius: 0.1),
materials: [SimpleMaterial(color: .red,
isMetallic: true)])
model.components[OpacityComponent.self] = .init(opacity: 0.5)