You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RealityKit:如何让文本ModelEntity与3D背景框尺寸匹配并动态适配?

RealityKit 文本与3D背景框匹配解决方案

问题核心

需要实现3D文本与背景框尺寸动态匹配、位置完全对齐,且背景框处于文本后方的层级效果,当前代码存在背景框尺寸固定、位置计算错误的问题。

修改后的完整代码

var body: some View {
    RealityView { content in
        let headAnchor = AnchorEntity(.head)
        headAnchor.anchoring.trackingMode = .once
        
        let textEntity = GetText(testString)
        textEntity.name = "test"
        // 设置文本在锚点中的位置
        textEntity.transform.translation = SIMD3<Float>(
            -textEntity.visualBounds(relativeTo: headAnchor).extents.x / 2,
            -1.25,
            -0.75
        )
        textEntity.setParent(headAnchor)
        
        // 获取文本相对于锚点的实际边界
        let textBounds = textEntity.visualBounds(relativeTo: headAnchor)
        let textExtents = textBounds.extents
        // 给背景框添加内边距,避免文本贴边
        let padding: Float = 0.02
        let boxSize = SIMD3<Float>(
            textExtents.x + padding * 2,
            textExtents.y + padding * 2,
            0.05
        )
        
        // 创建紫色背景框
        let backgroundBox = ModelEntity(
            mesh: .generateBox(size: boxSize, cornerRadius: 0.1),
            materials: [UnlitMaterial(color: .purple)]
        )
        
        // 将背景框设为文本的子实体,自动同步位置
        backgroundBox.setParent(textEntity)
        // 调整Z轴偏移,让背景框处于文本后方
        backgroundBox.transform.translation = SIMD3<Float>(0, 0, -0.01)
        
        content.add(headAnchor)
    }
}

func GetText(_ newText: String) -> ModelEntity {
    let depthVar: Float = 0.01
    let fontVar = UIFont.systemFont(ofSize: 0.1)
    // 保持原有的容器帧设置,visualBounds会自动计算文本实际占用空间
    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)]
    )

    model.components.set(InputTargetComponent())
    model.generateCollisionShapes(recursive: false)
    model.components.set(HoverEffectComponent())
    
    return model
}

关键修改说明

  • 动态尺寸适配:通过visualBounds(relativeTo: headAnchor)获取文本的实际边界尺寸,以此生成背景框大小,确保背景框随文本内容动态变化。添加内边距可优化视觉效果。
  • 位置自动同步:将背景框设为文本实体的子实体,无需手动计算位置,文本移动时背景框自动跟随,彻底解决位置错位问题。
  • 层级顺序调整:背景框相对文本的Z轴偏移设为-0.01(小于文本的 extrusionDepth 0.01),确保背景框稳定处于文本后方。
  • 文本位置优化:保留原有的X轴居中逻辑,确保文本在屏幕上的初始位置符合预期。

内容的提问来源于stack exchange,提问作者SolidSnake4444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:53:23