我正在屏幕上创建文本,希望有一个3D背景,就像一个3D牌匾上的文字.我可以将文本放在屏幕上,但我不知道如何让框显示为与文本后面的文本具有相同的宽度、高度和位置.我假设我应该能够将它设置为与文本相同,然后它将在文本中,然后我在Z访问上稍微翻译回来,它将在它后面.包括代码和我所得到的图像.如何才能使紫色框覆盖文本的宽度和高度相同,并且可以根据文本动态变化?

var body: some View {
        RealityView { content in
            let headAnchor = AnchorEntity(.head)
            headAnchor.anchoring.trackingMode = .once
            
            let model = GetText(testString)
            model.setParent(headAnchor)
            model.name = "test"
            model.transform.translation.z = -0.75
            model.transform.translation.y = -1.25
            model.transform.translation.x = -model.visualBounds(relativeTo: nil).extents.x / 2

            let blackBoxModel = ModelEntity(
                mesh: .generateBox(size: SIMD3<Float>(0.5,0.5,0.05), cornerRadius: 0.1),
                materials: [UnlitMaterial(color: .purple)])
            blackBoxModel.position = SIMD3<Float>(model.components[ModelComponent.self]!.mesh.bounds.max.x - model.components[ModelComponent.self]!.mesh.bounds.min.x, model.visualBounds(relativeTo: nil).extents.y, -0.75)
            blackBoxModel.setParent(headAnchor)
            content.add(headAnchor)
        }
}

func GetText(_ newText: String) -> ModelEntity {
        let depthVar: Float = 0.01
        let fontVar = UIFont.systemFont(ofSize: 0.1)
        let containerFrameVar = CGRect(x: 0, y: 0, width: 1, height: 1)
        let alignmentVar: CTTextAlignment = .center
        let lineBreakModeVar : CTLineBreakMode = .byWordWrapping
        let model = ModelEntity(
            mesh: .generateText(newText, extrusionDepth: depthVar, font: fontVar, containerFrame: containerFrameVar, alignment: alignmentVar, lineBreakMode: lineBreakModeVar),
            materials: [SimpleMaterial(color: .white, isMetallic: true)])


        // Enable interactions on the entity.
        model.components.set(InputTargetComponent())
        model.generateCollisionShapes(recursive: false)
        model.components.set(HoverEffectComponent())
        
        return model
    }

Realitykit image showing bounds

推荐答案

如果您想要根据文本位置自动计算黑框(文本板)的大小和位置,请try 此代码:

import SwiftUI
import RealityKit

struct ContentView: View {
    let sample = "This is the text on the screen"
    let mat = SimpleMaterial(color: .red, roughness: 0.7, isMetallic: true)
    let headAnchor = AnchorEntity(.head)

    init() {
        headAnchor.anchoring.trackingMode = .once
    }
    var body: some View {
        RealityView { content in
            // Text
            let textModel = await getText(sample)
            let xPos = textModel.visualBounds(relativeTo: nil).extents.x / 2
            textModel.position = [-xPos, -1.25, -0.75]
            textModel.setParent(headAnchor)
            // Text BB Center
            let bb_Center = textModel.visualBounds(relativeTo: nil).center
            let x = bb_Center.x
            let y = bb_Center.y
            let z = bb_Center.z
            // Text BB Extents
            let bb_Extents = textModel.visualBounds(relativeTo: nil).extents
            let xE = bb_Extents.x
            let yE = bb_Extents.y
            let zE = bb_Extents.z
            // Black box
            let blackBoxModel = ModelEntity(
                                        mesh: .generateBox(size: [xE+0.3, yE+0.2, zE],
                                cornerRadius: 0.1),
                                   materials: [UnlitMaterial(color: .black)]
            )
            blackBoxModel.position = [x, y-0.02, z-0.05]
            blackBoxModel.setParent(headAnchor)
            content.add(headAnchor)
        }
    }
    
    func getText(_ newText: String) async -> ModelEntity {
        let depthVar: Float = 0.01
        let fontVar = UIFont.systemFont(ofSize: 0.1)
        let containerFrameVar = CGRect(x: 0, y: 0, width: 1, height: 1)
        let alignmentVar: CTTextAlignment = .center
        let lineBreakModeVar : CTLineBreakMode = .byWordWrapping
        
        let model: ModelEntity = await ModelEntity(
                                              mesh: .generateText(newText,
                                    extrusionDepth: depthVar,
                                              font: fontVar,
                                    containerFrame: containerFrameVar,
                                         alignment: alignmentVar,
                                     lineBreakMode: lineBreakModeVar),
                                         materials: [mat]
        )
        await model.components.set(InputTargetComponent())
        await model.generateCollisionShapes(recursive: false)
        await model.components.set(HoverEffectComponent())
        return model
    }
}

enter image description here

Swift相关问答推荐

多个提取来计算核心数据中的记录

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

如何将多个完成处理程序转换为异步?

为什么我的Swift app不能用xcodebuild构建,但是用XCode可以构建?

如何制作进度加载动画?

如果 Swift 无法分配内存会怎样?

Swift - 订阅视图之外的绑定值

闭包 - deinit self 对象的时间

有什么方法可以快速为泛型参数分配默认值?

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

如何防止 UITableViewCell 移动(Swift 5)

当我必须在 Swift 中的类、 struct 和枚举之间进行 Select 时,我应该如何推理?

如何在 Xcode 中的 UITests 下以通用方式访问后退栏按钮项?

FirebaseStorage:如何删除目录

在 Xcode 中自动实现 Swift 协议方法

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

TabView 在切换选项卡时重置导航堆栈

'类 'className' 的 NSManagedObject 必须具有有效的 NSEntityDescription.错误

如何快速将弹出框调整为表格视图中内容的大小?

如何在swift中的每N个字符处为字符串添加分隔符?