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

时间:2016-12-09 18:40:17

标签: swift3 scenekit textnode

我试图遵循与圆柱体,盒子......相同的简单逻辑,所以只需定义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
}

1 个答案:

答案 0 :(得分:7)

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

构建具有较小范围的SceneKit场景是典型的 - 例如,您可能使用SCNBoxSCNSphere等的默认大小在Swift游乐场中将简单的测试场景放在一起可能只有3-4个单位宽。 (如果您使用带有ARKit的SceneKit,场景单位是米,那么36"点"字体中的一些文字就是市中心几个办公大楼的大小。)

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

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

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