使用SceneKit时如何在特定位置放置文本?

How to place text in the certain position when using SceneKit?

我尝试遵循与圆柱体、方框...相同的简单逻辑,因此只需定义 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
}

SCNText的默认字体是36 point Helvetica,一个"point"的字体大小与一个场景单位space相同。 (好吧,对于包含 SCNText 几何体的节点,局部 space。但是除非您在节点上设置了比例因子,否则局部 space 单位与场景 space units.) 这意味着即使是一个短标签也可以有几十个单位高和几百个单位宽。

构建较小范围的 SceneKit 场景是典型的做法——例如,您可能会使用 SCNBoxSCNSphere 的默认大小将简单的测试场景放在 Swift 操场上等可能只有 3-4 个单位宽。 (如果你将 SceneKit 与 ARKit 一起使用,场景单位是米,所以一些 36 "point" 字体的文本是市中心几个办公大楼的大小。)

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


请注意,如果您尝试通过在 SCNText 上设置更小的字体来解决此问题,文本可能会变得参差不齐且粗壮。那是因为 flatness 属性 是相对于文本的磅值进行测量的(更准确地说,它是在一个单位 == 文本大小一磅的坐标系中进行测量的)。因此,如果您选择的字体大小按 screen/print 标准会很小,则需要相应地缩小 flatness 以在您的字母中仍然获得平滑的曲线。

或者,您可以单独保留字体大小和平面度 — 相反,将 scale factor on the node containing the text geometry, or set that node's pivot 设置为按比例缩小其内容的变换矩阵。例如,如果将比例因子设置为 1/72,则场景的一个单位 space 与文本高度的一个 "inch"(72 点)相同——具体取决于场景中的其他尺寸,这可能会让您更容易像在 2D 中那样思考字体大小。