web-dev-qa-db-ja.com

ARkitシーンiOSでテキストを含む2dViewを追加するにはどうすればよいですか?

IOSでARkitシーンにテキストを含む2dViewを追加するにはどうすればよいですか?ノードを回転しても回転しないノードの上にそのビューを追加するにはどうすればよいですか? enter image description here

11
Developer

SCNPlaneを追加して SCNLookAtConstraint を使用すると、平面が常にカメラを見るようになります。

カスタムマテリアルを作成して、それを マテリアルプロパティ に設定できます。

  • マテリアルの表面全体に一定の色を指定する色(UIColorまたはCGColor)数値(

  • マテリアルの表面全体にマッピングされるテクスチャを指定する画像(UIImageまたはCGImage)

  • コアアニメーションレイヤー(CALayer)
  • テクスチャー(SKTexture、MDLTexture、MTLTexture、またはGLKTextureInfo)
  • SpriteKitシーン(SKScene)

CoreAnimationまたはSpriteKitを使用してアニメーションコンテンツを表示することもできますが、

SceneKitは、すでに他の場所に表示されているレイヤー(たとえば、UIViewオブジェクトのバッキングレイヤー)を使用できません。


SpriteKitを使用した例を次に示します。

  1. SpriteKitシーンを作成します。

例えば。:

let skScene = SKScene(size: CGSize(width: 200, height: 200))
skScene.backgroundColor = UIColor.clear

let rectangle = SKShapeNode(rect: CGRect(x: 0, y: 0, width: 200, height: 200), cornerRadius: 10)
rectangle.fillColor = #colorLiteral(red: 0.807843148708344, green: 0.0274509806185961, blue: 0.333333343267441, alpha: 1.0)
rectangle.strokeColor = #colorLiteral(red: 0.439215689897537, green: 0.0117647061124444, blue: 0.192156866192818, alpha: 1.0)
rectangle.lineWidth = 5
rectangle.alpha = 0.4
let labelNode = SKLabelNode(text: "Hello World")
labelNode.fontSize = 20
labelNode.fontName = "San Fransisco"
labelNode.position = CGPoint(x:100,y:100)
skScene.addChild(rectangle)
skScene.addChild(labelNode)
  1. 飛行機を作成し、シーンをマテリアルプロパティとして設定します

例えば.

let plane = SCNPlane(width: 20, height: 20)
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = skScene
plane.materials = [material]
let node = SCNNode(geometry: plane)
scene.rootNode.addChildNode(node)
  1. シーンをアニメーション化する

例えば.

labelNode.run(SKAction.repeatForever(SKAction.rotate(byAngle: .pi, duration: 2)))

enter image description here

18
jlsiewert

おそらく他にもいくつかのコンテンツを使用できることは言及する価値があります...リストはここにあります... https://developer.Apple.com/documentation/scenekit/scnmaterialproperty/1395372-contents

上記の回答のコードを試してみましたが、問題なく動作しましたが、必要なノードが多数あるため、FPSの速度が低下していました。そして、SKSceneはかなり重いと思われます。

私はSKLabelNodeでSKViewを使用できましたが、問題はテキストが視覚的に更新されないことでした。私の推測では、毎回texture(from :)を呼び出さなければならず、それがSKViewテクスチャと同じくらい遅いと思いました(から:) https://developer.Apple.com/documentation/spritekit/skview/1520114-texture

CALayerを使用して別の方法で確認しましたが、idにはテキストの変更に関して同じ問題があると考えたため、SCNTextを使用しました。

LookatConstraintの代替としてのSCNBillboardConstraintにも言及する価値があります https://developer.Apple.com/documentation/scenekit/scnbillboardconstraint

0
The Way