SceneKit中有很多选项,例如
SCNMaterial.(diffuse|emission|ambient|...).contents
来使用UIColor的Alpha通道SCNMaterial.transparency
(CGFloat从0.0到1.0)SCNMaterial.transparent
(另一个SCNMaterialProperty)SCNNode.opacity
(CGFloat从0.0(完全透明)到1.0
(完全不透明))我想知道是否可以在RealityKit中为ModelEntity设置透明度/不透明度/ alpha吗?
答案 0 :(得分:0)
此刻,我在RealityKit中看到了至少一个解决方案,允许您控制对象的透明度。但坦率地说,该解决方案仅适用于以编程方式制作的模型,因此您不能将其应用于Reality Composer的模型。您可以使用baseColor
的{{1}}或tintColor
实例属性来做到这一点:
SimpleMaterial()
这是真实代码的样子(我在macOS中对其进行了测试):
var tintColor: NSColor { get set } /* color applied to the base color in macOS */
var baseColor: NSColor { get set } /* main (base) color in RealityKit macOS */
或者,如果您不需要模型上的任何纹理(只需具有不透明度的颜色),就可以通过var material = SimpleMaterial()
// CYAN TINT and SEMI-TRANSPARENT ALPHA
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)
// CUBE WAS MADE IN REALITY COMPOSER
cubeComponent.materials = [material]
// SPHERE IS MADE PROGRAMMATICALLY
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
如果您的场景包含两种类型的对象(由Reality Composer制作并以Xcode编程方式创建,并且您将相同的材质分配给这两个对象),则编译后的应用程序会呈现一些渲染伪像(请看下面的图片)。
这是因为RealityKit的工作不稳定(因为目前框架太小)。我认为在RealityKit的下一版本中,诸如
material.baseColor = MaterialColorParameter.color(.init(red: 0.0, green: 1.0, blue: 1.0, alpha: 0.5))
和missing texture on Reality Composer model
之类的错误将被消除。
答案 1 :(得分:-1)
我找到了几种方法来做到这一点。
OcclusionMaterial()
:let plane = ModelEntity(
mesh: .generatePlane(width: 0.1, depth: 0.1),
materials: [OcculusionMaterial()]
)
更改现有实体的不透明度:
plane.model?.materials = [OcclusionMaterial()]
var planeColor = UIColor.blue
func fadeOut() {
runTimer(duration: 0.25) { (percentage) in
let color = self.planeColor.withAlphaComponent(1 - percentage)
var material: Material = SimpleMaterial(color: color, isMetallic: false)
if percentage >= 0.9 {
material = OcclusionMaterial()
}
self.plane.model?.materials = [material]
}
}
func fadeIn() {
runTimer(duration: 0.25) { (percentage) in
let color = self.planeColor.withAlphaComponent(percentage)
let material: Material = SimpleMaterial(color: color, isMetallic: false)
self.plane.model?.materials = [material]
}
}
func runTimer(duration: Double, completion: @escaping (_ percentage: CGFloat) -> Void) {
let startTime = Date().timeIntervalSince1970
let endTime = duration + startTime
Timer.scheduledTimer(withTimeInterval: 1 / 60, repeats: true) { (timer) in
let now = Date().timeIntervalSince1970
if now > endTime {
timer.invalidate()
return
}
let percentage = CGFloat((now - startTime) / duration)
completion(percentage)
}
}
希望这对某人有所帮助