如何在ARkit场景iOS中添加具有文本的2dView

时间:2017-07-26 04:16:06

标签: ios swift scenekit arkit

如何在ARkit场景iOS中添加一个包含文本的2dView。如何在旋转节点时不会旋转的节点顶部添加该视图。enter image description here

2 个答案:

答案 0 :(得分:17)

您可以添加SCNPlane并使用SCNLookAtConstraint,以便飞机始终查看相机。

您可以创建自定义材料并将其material properties设置为:

  
      
  • 一种颜色(UIColor或CGColor),指定材质表面的恒定颜色   一个数字(

  •   
  • 图像(UIImage或CGImage),指定要在材质表面上绘制的纹理

  •   
  • 核心动画层(CALayer)
  •   
  • 纹理(SKTexture,MDLTexture,MTLTexture或GLKTextureInfo)
  •   
  • SpriteKit场景(SKScene)
  •   

您还可以使用CoreAnimation或SpriteKit显示动画内容,但

  

SceneKit无法使用已在其他地方显示的图层(例如,UIView对象的背衬层)

以下是使用SpriteKit的示例:

  1. 创建您的SpriteKit场景:
  2. e.g:

    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. 创建平面并将场景设置为材质属性
    2. e.g。

      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. 为您的场景设置动画
      2. e.g。

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

        enter image description here

答案 1 :(得分:0)

可能值得一提的是,您还可以使用其他一些内容作为内容...在此处可以找到列表... https://developer.apple.com/documentation/scenekit/scnmaterialproperty/1395372-contents

我尝试了以上答案中的代码,但效果很好,但是由于我有许多需要它的节点,因此降低了FPS的速度。而且SKScene可能很重。

我能够将SKView与SKLabelNode一起使用,但问题是文本无法直观地更新,我的猜测是我每次都必须调用texture(from :),我认为这与慢 SKView纹理(来自:) https://developer.apple.com/documentation/spritekit/skview/1520114-texture

我看到了使用CALayer进行处理的另一种方法,但是我认为id在更改文本方面存在相同的问题,因此我只使用了SCNText。

还值得一提的是SCNBillboardConstraint作为LookatConstraint的替代品 https://developer.apple.com/documentation/scenekit/scnbillboardconstraint