2016-12-09 20 views
1

私はcylinder、box ...と同じ単純なロジックに従おうとしましたが、textNodeの位置を定義するだけで動作しません。SceneKitを使用するときにテキストを特定の位置に配置する方法は?

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

あなたはあなたの質問を明確にして、機能をどのように呼び出すかを追加して、火テキストを追加することもできますか? – ColdSteel

+1

期待される結果と実際の結果について詳しく教えてください。 – mnuages

+1

あなたの質問は実際に間違っていることについてかなり漠然としているので、ちょっと推測してください...しかし、フォントサイズの "ポイント"は3D座標空間の単位と同じであることに注意してください。 [デフォルトのフォントは36ptです](https://developer.apple.com/reference/scenekit/scntext/1523273-font)、残りのシーンが3〜4単位の幅しかない場合は、カメラ外の巨大な文字にする。 – rickster

答えて

6

SCNTextのデフォルトフォントは36 point Helveticaで、フォントサイズの「点」は、シーン空間の単位と同じです。 (つまり、SCNTextジオメトリを含むノードのローカルスペースですが、ノードにスケールファクタを設定しない限り、ローカルスペースユニットはシーンスペースユニットと同じです)。つまり、短いラベルでも数十単位背の高い、数百の単位の幅。

SceneKitシーンをより小さなスコープで構築するのが一般的です。例えば、SCNBoxSCNSphereなどのデフォルトサイズを使用してSwiftプレイグラウンドで一緒に投げる可能性のある単純なテストシーンは、わずか3〜4ユニットです。 (ARKitでSceneKitを使用している場合、シーン単位はメートルなので、36 "ポイント"フォントのテキストは、ダウンタウンのいくつかのオフィスブロックのサイズです。)

また、テキストのジオメトリ相対その包含ノードには、テキストの左下隅にある。これらをまとめてみれば、シーンの残りの部分には巨大な文字が迫っていて、カメラの視界からちょうど隠れている可能性があります。


あなたSCNTextにはるかに小さいフォントを設定することにより、この問題を解決しようとすると、テキストがギザギザと分厚い得るかもしれないことに注意してください。これは、flatnessプロパティがテキストのポイントサイズに対して相対的に測定されるためです(正確には、1単位=テキストサイズの1ポイントの座標系で測定されます)。したがって、画面/印刷規格では小さいフォントサイズを選択した場合は、文字に滑らかな曲線が得られるように、それに応じてflatnessを縮小する必要があります。

代わりに、テキストのジオメトリを含むノードにscaleファクタを設定するか、またはそのノードの内容を縮小する変換マトリックスにそのノードのpivotを設定することで、フォントサイズと平坦度をそのままにすることができます。たとえば、倍率を1/72に設定すると、シーンスペースの1単位は、テキストの高さの1インチ(72ポイント)と同じになります。これは、シーン内の他のサイズに応じて、 2Dでのやり方と同じようにフォントサイズを考えるのは簡単です。

関連する問題