【问题标题】:How to place text in the certain position when using SceneKit?使用 SceneKit 时如何将文本放置在特定位置?
【发布时间】:2017-04-25 07:30:19
【问题描述】:

我尝试遵循与圆柱体、盒子...相同的简单逻辑,因此只需定义 textNode 的位置,但它不起作用。

func makeText(text3D: String, position: SCNVector3, depthOfText: CGFloat, color: NSColor, transparency: CGFloat) -> SCNNode
{
    let textTodraw = SCNText(string: text3D, extrusionDepth: depthOfText)
    textTodraw.firstMaterial?.transparency = transparency
    textTodraw.firstMaterial?.diffuse.contents = color
    let textNode = SCNNode(geometry: textTodraw)
    textNode.position = position        
    return textNode
}

【问题讨论】:

  • 能否请您澄清您的问题并添加您如何调用函数 abd 添加 tue 文本
  • 能否详细说明预期结果和实际结果是什么?
  • 只是一个猜测,因为您的问题对于实际出了什么问题非常模糊......但请注意字体大小中的“点”与您的 3D 坐标空间的单位相同。 default font is 36 pt,所以如果你的场景的其余部分只有 3-4 个单位宽,那么相机外可能会有巨大的字母。
  • @rickster 谢谢,你猜对了!我错过了默认字体值。问题解决了。
  • 幸运的猜测。 :) 我详细阐述了上述内容并将其发布为答案。 (如果您觉得有帮助,请投票/接受。)

标签: swift3 scenekit textnode


【解决方案1】:

SCNText的默认字体为36 point Helvetica,字体大小的一个“点”与场景空间的一个单位相同。 (嗯,包含SCNText 几何的节点的本地空间。但是除非您在节点上设置了比例因子,否则本地空间单位与场景空间单位相同。)这意味着即使是短标签也可以是几十个单位高,数百单位宽。

通常构建具有较小范围的 SceneKit 场景 - 例如,简单的测试场景,例如您可能在 Swift 操场上使用SCNBoxSCNSphere 等的默认大小可能只有 3-4 个单位宽. (如果你使用带有 ARKit 的 SceneKit,场景单位是米,所以一些 36“点”字体的文本是市中心几个办公大楼的大小。)

此外,文本几何图形相对于其包含节点的锚点位于文本的左下角。将所有这些放在一起,完全有可能在您的场景的其余部分隐约出现巨大的字母,隐藏在相机视野之外。


请注意,如果您尝试通过在 SCNText 上设置小得多的字体来解决此问题,则文本可能会出现锯齿状和粗大。这是因为flatness 属性是相对于文本的磅值进行测量的(更准确地说,它是在一个单位== 一个文本大小的坐标系中测量的)。因此,如果您选择的字体大小按屏幕/打印标准来说很小,则需要相应地缩小 flatness 才能在字母中获得平滑的曲线。

或者,您可以单独保留字体大小和平整度 — 相反,在包含文本几何的节点上设置 scale 因子,或将该节点的 pivot 设置为缩小其内容的变换矩阵。例如,如果您将比例因子设置为 1/72,则一个单位的场景空间与一“英寸”(72 磅)的文本高度相同 - 取决于场景中的其他尺寸,这可能会使它有点像在 2D 中那样更容易考虑字体大小。

【讨论】:

    最近更新 更多