ARKit - 如何在另一个 SCNNode 中包含 SCNText(语音气泡)

2024-04-30

我正在尝试在 ARKit 的语音气泡中创建一个带有简单文本的报价生成器。

我可以用文本显示语音气泡,但文本始终从中间开始并溢出到语音气泡之外。

任何帮助使其在语音气泡的左上角对齐并包裹在语音气泡内的帮助将不胜感激。

Result

Classes

class SpeechBubbleNode: SCNNode {
    private let textNode = TextNode()

    var string: String? {
        didSet {
            textNode.string = string
        }
    }

    override init() {
        super.init()

        // Speech Bubble
        let plane = SCNPlane(width: 200.0, height: 100.0)
        plane.cornerRadius = 4.0
        plane.firstMaterial?.isDoubleSided = true
        geometry = plane

        // Text Node
        textNode.position = SCNVector3(position.x, position.y, position.z + 1.0)
//        textNode.position = convertPosition(SCNVector3(0.0, 0.0, 1.0), to: textNode)
//        textNode.position = SCNVector3(0.0, 0.0, position.z + 1.0)
        addChildNode(textNode)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

class TextNode: SCNNode {
    private let textGeometry = SCNText()

    var string: String? {
        didSet {
            updateTextContainerFrame()
            textGeometry.string = string
        }
    }

    override init() {
        super.init()

        textGeometry.truncationMode = CATextLayerTruncationMode.middle.rawValue
        textGeometry.isWrapped = true
        textGeometry.alignmentMode = CATextLayerAlignmentMode.left.rawValue

        let blackMaterial = SCNMaterial()
        blackMaterial.diffuse.contents = UIColor.black
        blackMaterial.locksAmbientWithDiffuse = true
        textGeometry.materials = [blackMaterial]

        geometry = textGeometry
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    private func updateTextContainerFrame() {
        let (min, max) = boundingBox
        let width = CGFloat(max.x - min.x)
        let height = CGFloat(max.y - min.y)
        print("width :",max.x - min.x,"height :",max.y - min.y,"depth :",max.z - min.z)
        textGeometry.containerFrame = CGRect(x: 0.0, y: 0.0, width: width, height: height)
//        textGeometry.containerFrame = CGRect(origin: .zero, size: CGSize(width: 1.0, height: 1.0))
    }
}

执行

private func makeSpeechBubbleNode(forBobbleheadNode bobbleheadNode: BobbleheadNode) {
    let node = SpeechBubbleNode()
    node.position = sceneView.scene.rootNode.convertPosition(bobbleheadNode.position, to: node)
    node.scale = SCNVector3(0.002, 0.002, 0.002)

    sceneView.scene.rootNode.addChildNode(speechBubbleNode)
    self.speechBubbleNode = speechBubbleNode

    speechBubbleNode.string = "Some random string that could be long and should wrap within speech bubble"
}

我遇到了同样的问题,最后我解决了,如下:

  • 创建一个 SCNText 并将其作为几何体添加到 SCNNode:

    let string = "Coverin text with a plane :)"
    let text = SCNText(string: string, extrusionDepth: 0.1)
    text.font = UIFont.systemFont(ofSize: 1)
    text.flatness = 0.005
    let textNode = SCNNode(geometry: text)
    let fontScale: Float = 0.01
    textNode.scale = SCNVector3(fontScale, fontScale, fontScale)
    
  • 将文本枢轴从左下角调整到中心 https://stackoverflow.com/a/44829260/1724845:

    let (min, max) = (text.boundingBox.min, text.boundingBox.max)
    let dx = min.x + 0.5 * (max.x - min.x)
    let dy = min.y + 0.5 * (max.y - min.y)
    let dz = min.z + 0.5 * (max.z - min.z)
    textNode.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
    
  • 创建一个 PlaneNode 并将 textNode 添加为 PlaneNode 的子节点:

    let width = (max.x - min.x) * fontScale
    let height = (max.y - min.y) * fontScale
    let plane = SCNPlane(width: CGFloat(width), height: CGFloat(height))
    let planeNode = SCNNode(geometry: plane)
    planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(0.5)
    planeNode.geometry?.firstMaterial?.isDoubleSided = true
    planeNode.position = textNode.position
    textNode.eulerAngles = planeNode.eulerAngles
    planeNode.addChildNode(textNode)
    
  • 最后将 PlaneNode 添加到 sceneView 中:

    sceneView.scene.rootNode.addChildNode(planeNode)
    

这就是结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARKit - 如何在另一个 SCNNode 中包含 SCNText(语音气泡) 的相关文章

  • 为arm64或arm7s编译OpenSSL FIPS功能库时出现未知的cpu类型

    我可以成功 至少没有警告并生成 a 文件 针对 arm7 x86 64 和 i386 进行编译 当我编译arm64时 我得到Unknown cpu type 100000c no adjustments made 当我编译arm7s时 我得
  • TTTAttributedLabel 可点击截断标记

    我有一个 TTTAttributedLabel 并为其指定了一个自定义属性截断标记 NSAttributedString atributedTruncationToken NSAttributedString alloc initWithS
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • removeItemAtPath 完成

    我正在以这种方式删除路径上的文件 UIPanGestureRecognizer gesture UIPanGestureRecognizer sender UIButton button UIButton gesture view UIPa
  • 不要包裹 span 元素

    我有一份清单 span 可以在 a 内左右移动的元素 div 元素 如果某些跨度超出了 div 它们应该被隐藏 这可以很好地使用overflow hidden 但是 如果跨度超出了 div 的容纳范围 跨度就会换行 这对于我的用例来说是不期
  • 开发者可以在 Windows 应用程序中使用 iCloud 吗?

    开发人员可以使用 Apple 的 iCloud API 在 Mac OS X 和 iOS 上的不同版本的应用程序之间同步应用程序数据 如果开发人员拥有 Windows 版本的应用程序 该版本是否也可以使用 iCloud 将应用程序数据与 M
  • NSUserDefaults 多久同步一次?

    的文档NSUserDefaults说synchronise方法被定期调用 但没有提及频率 10分钟的谷歌搜索没有发现任何信息 发生的频率是多少synchronise方法调用 这是一个未公开的实现细节 可能甚至不是一个恒定的时间间隔 但是 您
  • 在故事板中将 UITableView 的 rowHeight 设置为 UITableViewAutomaticDimension ?

    在 Xcode 6 中创建 iOS 8 应用程序时 如何设置 UITableViewrowHeight to UITableViewAutomaticDimension In WWDC 2014 第 226 场会议 表和集合视图中的新增功能
  • 具有动态警报正文的快速本地通知

    所以我可以创建一个像这样的本地通知 var localNotification UILocalNotification localNotification fireDate NSDate timeIntervalSinceNow 7 loc
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • 我们能否检测用户是否通过主页按钮或锁定按钮离开而没有监听 darwin 通知?

    我最近向应用程序商店提交了一个新的二进制文件并将其发送以供审核 但它立即被拒绝并显示以下消息 不支持的操作 不允许应用程序监听设备锁定通知 经过一番挖掘后 我发现我们无法使用 com apple springboard lockstate
  • 如何重新定位或移动 Google Maps SDK 上的当前位置按钮?

    如何将 Objective C 中的当前位置按钮移至我的偏好 现在 我已启用它 但底角有东西挡住了它 Thanks 您可以使用 padding 将按钮向上移动 self mapView padding UIEdgeInsets top 0
  • 通过 renderInContext 定位要绘制的视图:

    我想画一个UIView在我目前的CGGraphicsContext 我画的是UIView via renderInContext 但它的位置不正确 始终位于左上角 我拥有所有的价值观UIView可用于绘制UIView CGRect fram
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 从 Mac 命令行访问 iOS 应用程序目录(沙箱)

    我需要使用 Mac 或 Linux 上的命令行 非 GUI 访问 iOS 设备上安装的应用程序的沙箱目录 这有助于开发和测试自动化 将 json 文件放入沙箱中可以让我设置参数 例如额外的调试消息和更小的刷新间隔 像 iFunBox 这样的
  • XCode 4.5 给我“SenTestingKit/SenTestKit.h”文件未找到,但适用于 4.4.1

    我刚刚安装了 XCode 4 5 它在我现有的项目之一上给了我一个 SenTestingKit SenTestingKit h 文件未找到错误 此错误仅发生在 XCode 4 5 中 但它在 4 4 1 上编译正常 我已经检查过SenTes
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 将 UIButton 中的图像缩放到 AspectFit?

    我想将图像添加到 UIButton 并且还想缩放图像以适合 UIButton 使图像变小 请告诉我该怎么做 这是我尝试过的 但它不起作用 将图像添加到按钮并使用setContentMode self itemImageButton setI
  • iOS 视图控制器内存在被关闭后未释放

    当用户单击按钮时 它会显示一个带有两个视图控制器的新选项卡栏视图控制器 我是这样做的 ACLevelDownloadController dvc ACLevelDownloadController alloc initWithNibName
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt

随机推荐

  • Asp.Net SQL更新语句

    我有一个Asp net在我的页面上的应用程序中 用户请求删除用户 然后 这将填充我的 Admin TaskList 数据库 然后 管理员进入站点的安全区域并输入用户名并单击按钮 确认后 该用户将从我的 用户 数据库中删除 已经可以正常工作
  • 如何在闪亮的应用程序中垂直居中操作按钮?

    我有两个按钮在我的列中水平居中 但无法弄清楚如何垂直居中 我尝试使用 垂直对齐中间 下面是我的用户界面代码 ui lt shinyUI fluidPage tags style HTML buttons background color y
  • 解决源自 .lib 文件的“本地定义的符号”和“未解析的外部符号”

    我正在尝试在 Windows 7 64 位上的 Visual C 2010 上使用开源库 GDCM 编译我的项目 我已在我的项目中包含了所需的 lib 文件 gdcmDSED lib 和 gdcmMSFF lib 但是 编译器抱怨超过 10
  • 在全屏应用程序前面添加 NSWindow

    我想在所有其他应用程序前面有一个窗口 我希望此窗口出现在 Alfred 应用程序等关键字快捷方式上 我尝试了很多解决方案 但对于在主屏幕或第二屏幕上的全屏应用程序前面放置 NSWindow 没有任何作用 我尝试了经典 self window
  • 如何通过电子邮件发送保存的 CSV 文件或在 Android 中使用 Google Drive 上传?

    我有一个简单的日志记录应用程序 它将数据收集到三个数组列表中 我想将其保存到 CSV 文件中 然后共享到 Google Drive 电子邮件等 这是我保存数据的方法 StringBuilder data new StringBuilder
  • 无法在 Spring boot 中使用 @Valid 验证请求正文

    我想验证我的请求正文 Valid注解 但在 Spring Boot 中不起作用 我在 JAR 文件中有一个 Request 类 无法使用两个字段进行修改 其中一个字段的类型为对象 我的控制器类接受此类对象作为请求主体 当我将下面的 JSON
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 为什么循环比循环体多执行一次?

    摘自算法教科书的一段话 当 for 或 while 循环以通常的方式退出时 即 由于循环头中的测试 测试的执行次数比循环体多执行一次 因此 例如 一个 for 循环以for j 1 to 3会被执行不是3次 而是4次 问题 为什么这样的循环
  • 通过 SqlConnection/SqlCeConnection 连接到 .sdf 数据库时出现问题

    我在连接到 sdf sql 紧凑版 数据库时遇到了巨大的麻烦 我可以最初连接以提取行以验证用户名 密码 但是当我尝试通过 SqlCeConnection SqlCeCommand 命令或尝试添加项目 SqlClient SqlCommand
  • 教程在 SaveContext 中抛出上下文未定义错误

    这可能是一个新手问题 但我正在使用react admin Tutorial html 当涉及到使用EditGuesser时 编辑 页面失败 报告 TypeError 上下文未定义 AFAIK 我已按照说明进行操作 在 添加创建和编辑功能 部
  • ASP.NET 5 OAuth 重定向 URI 不使用 HTTPS

    我正在复制社会样本 https github com aspnet Security tree 1 0 0 beta4 samples SocialSample但尝试使用此处未显示的不同 OAuth 提供程序 所以我有一些如下代码 app
  • PHP Guzzle 具有基本身份验证和不记名令牌

    我正在尝试与 infojobs api 建立连接 文档解释了如何以这种方式进行连接 获取 api 1 应用程序 HTTP 1 1主办 api infojobs net 授权 基本QWxhZGRpbjpvcGVuIHNlc2FtZQ 承载07
  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • Objective-C 中的非正式协议?

    我想知道是否有人可以解释一下 Objective C 中的非正式协议是什么 我尝试在苹果文档和其他一些书籍上理解它 但我的头仍然在旋转 所以如果有人可以用例子解释 我将非常感激 Thanks An 非正式协议正如乔纳森所说 通常是在 NSO
  • Matlab 中二维插值的函数形式

    我需要从二维数据数组构造一个插值函数 我需要返回实际函数的东西的原因是 我需要能够将函数作为我需要进行数值积分的表达式的一部分进行计算 因此 interp2 并没有解决这个问题 它不返回函数 我可以使用 TriScatteredInterp
  • stdClass 到数组?

    i have stdClass Object 0 gt stdClass Object one gt aaa two gt sss 1 gt stdClass Object one gt ddd two gt fff 2 gt stdCla
  • 如何从 TextInputLayout 中删除底部填充

    第一张图就是我想要的 第二张图是我实现的 正如您所看到的 TextInputLayout 的底部有一个填充 这使得灰色背景溢出超过 edittext 行 请不要建议负边距或填充 因为它在较新的 API 中不起作用 这是我为第一个文本输入布局
  • 插入排序 C#

    你们能帮我完成 C 中的基本插入排序吗 我有一个数组中的姓名和居住城市列表 需要通过比较居住城市来对该数组进行排序 列表必须按字母顺序排序 比较器已经设置完毕并可以工作 我只是对插入排序器编程有点迷失 因为这是我们第一次使用这种排序方法 到
  • Dart:当两个或多个任务等待同一个 Future 时会发生什么

    在 Dart 中 当两个或多个任务等待同一个 Future 时 当 Future 完成时 任务是否按照执行等待的顺序获得通知 运行 即第一个执行等待的任务是第一个运行的 这段代码保证输出2 int res 0 Future
  • ARKit - 如何在另一个 SCNNode 中包含 SCNText(语音气泡)

    我正在尝试在 ARKit 的语音气泡中创建一个带有简单文本的报价生成器 我可以用文本显示语音气泡 但文本始终从中间开始并溢出到语音气泡之外 任何帮助使其在语音气泡的左上角对齐并包裹在语音气泡内的帮助将不胜感激 Result Classes