2016-12-09 1 views
1

Ich habe versucht, die gleiche einfache Logik wie für Zylinder, Box ..., also nur durch die Definition der Position für TextNode zu folgen, aber es funktioniert nicht.Wie platziere ich Text in einer bestimmten Position, wenn ich SceneKit verwende?

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 
} 
+0

Können Sie bitte Ihre Frage klären und auch hinzufügen, wie Sie die Funktion aufrufen und den Text hinzufügen – ColdSteel

+1

Könnten Sie bitte erläutern, was die erwarteten und tatsächlichen Ergebnisse sind? – mnuages

+1

Nur eine Vermutung, da Ihre Frage ziemlich vage darüber ist, was eigentlich schief läuft ... aber seien Sie sich bewusst, dass die "Punkte" in Ihrer Schriftgröße die gleichen sind wie die Einheiten Ihres 3D-Koordinatenraums. Die [Standardschriftart ist 36 pt] (https://developer.apple.com/reference/scenekit/scntext/1523273-font), wenn also der Rest Ihrer Szene nur etwa 3-4 Einheiten breit ist, könnte das passieren seien Sie riesige Buchstaben nur außerhalb der Kamera. – rickster

Antwort

6

Die Standardschriftart für SCNText ist 36 point Helvetica, und ein „Punkt“ in der Schriftgröße ist das gleiche wie eine Einheit der Szene Raumes. (Nun, von lokalem Raum für den Knoten, der die SCNText Geometrie enthält. Aber wenn Sie keinen Maßstabsfaktor für Ihren Knoten festgelegt haben, sind lokale Raumeinheiten die gleichen wie Szenenraumeinheiten.) Das bedeutet, dass sogar ein kurzes Etikett aus zehn Einheiten bestehen kann groß und Hunderte von Einheiten breit.

Es ist typisch SceneKit-Szenen mit kleinerem Umfang zu erstellen - zum Beispiel können einfache Testszenen, wie Sie sie in einem Swift-Spielplatz mit den Standardgrößen SCNBox, SCNSphere usw. zusammenstellen, nur 3-4 Einheiten breit sein. (Und wenn Sie SceneKit mit ARKit verwenden, sind Szeneneinheiten Meter, also ist ein Text in 36 "Punkt" -Schriftart die Größe einiger Bürogebäude in der Innenstadt.)

Auch der Ankerpunkt für eine Textgeometrie relativ zu seinem enthaltenden Knoten befindet sich in der unteren linken Ecke des Textes. Setzen Sie all dies zusammen und es ist durchaus möglich, dass riesige Buchstaben über den Rest Ihrer Szene ragen und sich gerade außerhalb der Kameraansicht verstecken.


Beachten Sie, dass, wenn Sie versuchen, dies zu beheben, indem Sie einen viel kleineren Schriftart auf Ihrem SCNText Einstellung, könnte der Text gezackt und klobig bekommen. Das liegt daran, dass die Eigenschaft flatness relativ zur Punktgröße des Textes gemessen wird (genauer gesagt, sie wird in einem Koordinatensystem gemessen, in dem eine Einheit == ein Punkt der Textgröße ist). Wenn Sie also eine Schriftgröße wählen, die nach Bildschirm-/Druckstandards winzig sein soll, müssen Sie die entsprechend verkleinern, um in Ihren Buchstaben immer noch glatte Kurven zu erhalten.

Alternativ können Sie auch die Schriftgrößen und die Ebenheit belassen. Setzen Sie stattdessen einen scale Faktor auf den Knoten, der die Textgeometrie enthält, oder setzen Sie den Knoten pivot auf eine Transformationsmatrix, die den Inhalt verkleinert. Wenn Sie beispielsweise einen Skalierungsfaktor von 1/72 einstellen, entspricht eine Einheit des Szenenraums einem "Zoll" (72 Punkte) der Texthöhe - abhängig von den anderen Größen in Ihrer Szene Es ist einfacher, an Schriftgrößen zu denken, als an 2D.

Verwandte Themen