SceneKit - SCNText 居中不正确

2023-11-25

我尝试在下面的代码中将文本字符串(SCNText)放入框(SCNBox)中。框的大小看起来正确,但文本不在框的右中心。有什么想法或解决方案吗?谢谢

let geoText = SCNText(string: "Hello", extrusionDepth: 1.0)
geoText.font = UIFont (name: "Arial", size: 8)
geoText.firstMaterial!.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: geoText)

let (minVec, maxVec) = textNode.boundingBox
scnScene.rootNode.addChildNode(textNode)

let w = CGFloat(maxVec.x - minVec.x)
let h = CGFloat(maxVec.y - minVec.y)
let d = CGFloat(maxVec.z - minVec.z)

let geoBox = SCNBox(width: w, height: h, length: d, chamferRadius: 0)
geoBox.firstMaterial!.diffuse.contents = UIColor.green.withAlphaComponent(0.5)
scnScene.rootNode.addChildNode(boxNode)

The text is not the center of the box

Edited:我仅使用 debugOptions showBoundingBoxes 添加了字符串的新图像(无 SCNBox 节点)以查看其边界框

enter image description here

解决方案一:

根据 vdugnist 的回答,我为任何想要测试的人创建了一个游乐场代码:

import UIKit
import SceneKit
import PlaygroundSupport

var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 600, height: 600))
var scene = SCNScene()
sceneView.scene = scene
PlaygroundPage.current.liveView = sceneView

let geoText = SCNText(string: "Hello", extrusionDepth: 1.0)
geoText.font = UIFont (name: "Arial", size: 12)
geoText.firstMaterial!.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: geoText)

let (minVec, maxVec) = textNode.boundingBox
textNode.position = SCNVector3(x: (minVec.x - maxVec.x) / 2, y: minVec.y - maxVec.y, z: 0)
textNode.pivot = SCNMatrix4MakeTranslation((maxVec.x - minVec.x) / 2, 0, 0)
scene.rootNode.addChildNode(textNode)

let w = CGFloat(maxVec.x - minVec.x)
let h = CGFloat(maxVec.y - minVec.y)
let d = CGFloat(maxVec.z - minVec.z)

let geoBox = SCNBox(width: w, height: h, length: d, chamferRadius: 0)
geoBox.firstMaterial!.diffuse.contents =   UIColor.green.withAlphaComponent(0.5)
let boxNode = SCNNode(geometry: geoBox)
boxNode.position = SCNVector3Make((maxVec.x - minVec.x) / 2 + minVec.x, (maxVec.y - minVec.y) / 2 + minVec.y, 0);
textNode.addChildNode(boxNode)

enter image description here

解决方案2:

我需要将文本移动到位置零 (0, 0, 0),而不是同时移动文本和周围的框,因此我继续更改解决方案 1 中文本的枢轴。现在代码如下:

import UIKit
import SceneKit
import PlaygroundSupport


var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 600, height: 600))
var scene = SCNScene()
sceneView.scene = scene
PlaygroundPage.current.liveView = sceneView


let geoText = SCNText(string: "Hello", extrusionDepth: 1.0)
geoText.font = UIFont (name: "Arial", size: 12)
geoText.firstMaterial!.diffuse.contents = UIColor.red
let textNode = SCNNode(geometry: geoText)

let (minVec, maxVec) = textNode.boundingBox
textNode.pivot = SCNMatrix4MakeTranslation((maxVec.x - minVec.x) / 2 + minVec.x, (maxVec.y - minVec.y) / 2 + minVec.y, 0)
scene.rootNode.addChildNode(textNode)

let w = CGFloat(maxVec.x - minVec.x)
let h = CGFloat(maxVec.y - minVec.y)
let d = CGFloat(maxVec.z - minVec.z)

let geoBox = SCNBox(width: w, height: h, length: d, chamferRadius: 0)
geoBox.firstMaterial!.diffuse.contents = UIColor.green.withAlphaComponent(0.6)
let boxNode = SCNNode(geometry: geoBox)
scene.rootNode.addChildNode(boxNode)

SCNText与其他几何图形的区别在于SCNText原点位于左下角。在其他几何形状中,它是底部中心。

要固定父节点中的文本位置,您可以将其pivotPoint.x设置为宽度的一半:

SCNVector3 min, max;
[textNode getBoundingBoxMin:&min max:&max];
textNode.pivot = SCNMatrix4MakeTranslation((max.x - min.x) / 2, 0, 0);

要固定子节点位置,您应该将它们的位置设置为宽度的一半加上最小值:

SCNVector3 min, max;
[textNode getBoundingBoxMin:&min max:&max];
subnode.position = SCNVector3Make((max.x - min.x) / 2 + min.x, (max.y - min.y) / 2 + min.y, 0);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SceneKit - SCNText 居中不正确 的相关文章

  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • SwiftUI - 从 NSObject 继承的 ObservableObject 在 iOS 13 中不会更新

    我知道 这是 无法在 iOS XX 中工作 问题之一 但我完全陷入困境 所以我有一个ObservableObject继承自的类NSObject 因为我需要听委托方法UISearchResultsUpdating class SearchBa
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 弱变量中间为零

    弱变量什么时候变为零 weak var backgroundNode SKSpriteNode texture SKTexture image initialBackgroundImage backgroundNode position C
  • 仅在 iPhone X 上显示状态栏

    如果不是 iPhone X 则希望隐藏状态栏 如果是 iPhone X 则希望显示状态栏 这很可能必须以编程方式完成 因为 plist 中没有支持此功能的键 我发现的最接近的一个是UIStatusBarHidden 方法一 You have
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 来自索引范围 Swift 的新数组

    我怎样才能做这样的事情 从数组中取出前 n 个元素 newNumbers numbers 0 n 目前出现以下错误 error could not find an overload for subscript that accepts th
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 领域:结果 和列表

    是否可以转换Results
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview
  • 如何在 swiftUI (macOS) 中检测按键按下和释放

    除了标题之外没什么可说的 我希望能够在按下按键和释放按键时 在 macOS 上 在 swiftUI 视图中执行操作 在 swiftUI 中是否有任何好的方法可以做到这一点 如果没有 有什么解决方法吗 不幸的是 键盘事件处理是其中一个令人痛苦
  • Xcode 错误 - 架构 x86_64 的未定义符号?

    我正在运行 Swift 4 和 Xcode 9 beta 我收到此错误 但我不知道如何解决它 我什至不知道这是什么意思 Undefined symbols for architecture x86 64 T0So22AVCapturePho
  • 为 Swift 对象/属性设置观察者

    我一直在寻找一种在连接到 Mac 的显示器数量发生变化时触发方法的方法 我知道我可以获得 NSScreen screens count 的值 但我需要找到一种方法来在该值发生变化时创建通知或其他内容 或者指示所连接的显示器数量发生变化的其他
  • 对成员“buildBlock()”的引用不明确

    我一直在尝试使用 Swift UI 为 iOS 13 制作一个应用程序 但我不断收到这个奇怪的错误 对成员 buildBlock 的引用不明确 无论我做什么 错误都不会消失 我尝试一次对代码段进行注释 以查看哪一部分可能导致了问题 但唯一有
  • AWS S3 公共对象与私有对象?

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

    我正在尝试使用GKOctree https developer apple com documentation gameplaykit gkoctree用于高效检索 3D 空间中的对象 然而 以下代码似乎没有按预期工作 import Gam

随机推荐

  • 如何停止 Eclipse 关于目标文件夹内容的警告?

    我从我的生成文件中收到大量警告target我无法修复的文件夹 例如从 XSD 或 Surefire 报告生成的 Java 代码 并且它在我的源代码中隐藏了正确的警告 有谁知道如何告诉 Eclipse 不要在某些文件夹中显示警告 或者只是在
  • 如何为 IJulia Jupyter 笔记本设置 Julia 环境?

    我在全局 Julia 中遇到包兼容性问题环境对于我想在 Jupyter 笔记本中使用的特定包 有没有办法告诉 IJulia 使用不同的环境而不是我的全局环境 默认的 IJulia 内核sets project 因此 最方便的方法 IMO 是
  • 我们应该直接使用 ScalaSignature 吗?

    Scala 签名是一个注释 它包含元信息 https github com scala scala blob v2 9 2 src library scala reflect ScalaSignature java 然后提供解析器 但sca
  • 在读取记录时我应该使用 SQL 事务吗?

    SQL事务用于插入 更新 但是否应该用于读取记录呢 如果您在一次查询中查询所有记录 然后一次性将它们拉回 则没有必要 一切都包含在隐式事务中 也就是说 即使您取回一百万条记录 即使其他进程正在更改这些记录 您也会看到所有一百万条记录在同一时
  • 如何在 Qt 中一次将输入掩码和 QValidator 设置为 QLineEdit?

    我想要一个接受 IP 地址的行编辑 如果我将输入掩码指定为 ui gt lineEdit gt setInputMask 000 000 000 000 它接受大于 255 的值 如果我给出验证器 那么我们必须在每三位数字后给出一个点 最好
  • 通过F#和Npgsql调用Postgresql中的存储过程

    我正在尝试使用 Npgsql 类型提供程序从 F 调用 postgresql 中的存储过程 目前 我连接数据库的方式如下 open System open System Data open System Data Entity open S
  • Laravel 中的自定义代码应该放在哪里

    再会 我有一些来自以前的非 MVC 应用程序的自定义代码 这是经过所有单元测试的东西 现在 我需要将其放入 Laravel 应用程序中 它们不是控制器 模型或视图 这是否意味着我必须将它们与 Symfony 和 Swiftmailer 文件
  • 如何在 TypeScript 中指定任何可更新的类型?

    我尝试过这个 但它不起作用 Foo 只是对有效方法的测试 Bar 是真正的尝试 它应该接收任何可更新的类型 但 Object 的子类对于该目的无效 class A class B public Foo newable typeof A vo
  • 重置 SQL Server 中的标识列

    我正在制作一个存储联系人的 SQL 数据库 我希望能够删除联系人 每个联系人的正确 ID 对于我的软件连接到它至关重要 假设我已经联系了詹姆斯 他是第一个联系的 他的id是0 我添加Mary 她的id是1 如果我删除James 如何将Mar
  • WebRTC getStat() API 设置

    我正在尝试使用 WebRTC api 中的 getStat 来查看它是否提供任何有用的信息来测量延迟和其他视频流数据 问题是没有太多关于如何使用它的信息 即使是较旧的现有示例也相当罕见 但从那时起 api 已经发生了变化 例如我的设置 pe
  • Object.assign() 是创建深拷贝还是浅拷贝?

    我刚刚遇到这个概念 var copy Object assign originalObject 这将原始对象的副本创建到 copy但是 我的问题是 这种克隆对象的方式会创建深拷贝还是浅拷贝 PS 令人困惑的是 如果它创建深层副本 那么这将是
  • 针对 PHP 中给定 DTD 的 XML 验证

    在 PHP 中 我尝试使用应用程序指定的 DTD 而不是外部获取的 XML 文档 来验证 XML 文档 DOMDocument 类中的 validate 方法似乎仅使用 XML 文档本身指定的 DTD 进行验证 因此这不起作用 这可以完成吗
  • 如何 grep 唯一出现次数

    我明白那个grep c string可用于计算给定字符串的出现次数 我想做的是 当只有字符串的一部分已知或保持不变时 计算唯一出现的次数 例如 如果我有一个文件 在本例中是一个日志 其中有几行包含常量字符串和重复变量 如下所示 string
  • 如何在react-native iOS应用程序运行时读取Info.Plist?

    在运行时 有没有办法读取CFBundleVersion来自 Info Plist 我想在应用程序的 关于框 中显示版本信息 提前致谢 Ed 我建议你使用这个做得很好library 我想你会得到你需要的所有信息 EDIT 您还可以在 AppD
  • dotnet docker /bin/sh: 1: [dotnet,: 未找到

    我使用 dockerfile 成功构建 但是当我尝试从构建映像运行新容器时 出现以下错误 我需要做什么来解决这个问题 错误 bin sh 1 dotnet 未找到 docker运行命令 docker run rm it p 8080 80
  • 检查套接字是否阻塞(Winsock 特定)[重复]

    这个问题在这里已经有答案了 可能的重复 在Win32中 有没有办法测试套接字是否是非阻塞的 这就是我在Windows中将套接字设置为非阻塞模式的方法 unsigned long mode is blocking 0 1 int ret io
  • 使用另一个控件的值的验证规则

    我正在尝试做一些我之前认为非常简单的事情 在另一个控件的验证规则中使用一个控件的值 我的应用程序具有用户可以输入的各种参数 此处讨论的具体参数定义范围的起点和终点 用户通过文本框设置值 有问题的两个控件是开始和结束文本框 验证时应检查以下条
  • 查找两个字符串中所有公共子字符串的函数未给出正确的输出

    我使用以下函数来查找两个字符串之间的所有公共子字符串 def substringFinder string1 string2 answer anslist len1 len2 len string1 len string2 for i in
  • multiprocessing.Manager().dict().setdefault() 是否损坏?

    这个迟来且可能很愚蠢的部门提出 gt gt gt import multiprocessing gt gt gt mgr multiprocessing Manager gt gt gt d mgr dict gt gt gt d setd
  • SceneKit - SCNText 居中不正确

    我尝试在下面的代码中将文本字符串 SCNText 放入框 SCNBox 中 框的大小看起来正确 但文本不在框的右中心 有什么想法或解决方案吗 谢谢 let geoText SCNText string Hello extrusionDept