【问题标题】:How to get a SCNNode to face the current camera position?如何让 SCNNode 面对当前的相机位置?
【发布时间】:2019-10-29 22:37:02
【问题描述】:

我目前正在编写一个 AR 应用程序,它首先放置一个 SCNNode(表)。首先,应用程序搜索一个水平面,只要找到一个表面,就会显示该对象,但尚未放置。虽然没有放置,但我希望对象始终面向相机,但我无法找到相机的当前位置并且每帧都更新对象。

当前,对象面向世界坐标。所以当我启动应用程序并找到一个水平面时 - 对象出现并面向世界坐标的起点(无论我在哪里启动应用程序)

谁能帮助我,如何从相机位置获取矢量并使对象每帧更新它的方向?

var tableNode : SCNNode!  // Node of the actual table

var trackingPosition = SCNVector3Make(0.0, 0.0, 0.0)

let trans = SCNMatrix4(hitTest.worldTransform)

self.trackingPosition = SCNVector3Make(trans.m41, trans.m42, trans.m43)

self.tableNode.position = self.trackingPosition

【问题讨论】:

    标签: swift scenekit arkit


    【解决方案1】:

    您尝试实现的功能称为广告牌。要达到这个效果,你需要设置SCNLookAtConstraint,使用场景的.pointOfView作为目标。

    你可以删除

    self.trackingPosition = SCNVector3Make(trans.m41, trans.m42, trans.m43)
    self.tableNode.position = self.trackingPosition
    

    并使用:

    // set constraint to force the node to always face camera
    let constraint = SCNLookAtConstraint(target:sceneView.pointOfView)
    constraint.isGimbalLockEnabled = true
    self.tableNode.constraints = [constraint] // constraint can cause node appear flipped over X axis
    

    【讨论】:

      【解决方案2】:

      您应该实现ARSCNViewDelegate 并使用渲染器方法renderer(_:updateAtTime:),在该方法中,每一帧都从sceneView.pointOfView 获取相机位置。这允许您使用 SCNNode 方法look(at:) 将节点坐标系转换为相机。

      func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
              if let camera = sceneView.pointOfView {
                 tableNode.look(at: camera.worldPosition)
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-24
        • 2019-06-29
        • 2017-04-15
        • 2021-05-22
        • 2018-02-22
        • 1970-01-01
        • 2018-07-06
        • 2019-10-31
        • 2018-07-21
        相关资源
        最近更新 更多