【问题标题】:How do I calculate a vector that is away from the camera?如何计算远离相机的矢量?
【发布时间】:2016-06-28 06:58:43
【问题描述】:

我有一个简单的球体和一个UITapGestureRecognizer。点击时,我想施加一个力,使球体远离相机。

func sceneTapped(recognizer: UITapGestureRecognizer) {
  let sceneView = self.view as! SCNView
  let location = recognizer.locationInView(sceneView)
  let results = sceneView.hitTest(location, options: nil)
  if results.count > 0 {
    let result = results[0] as SCNHitTestResult
    let node = result.node

    if (node.name == "foo") {
      let force = SCNVector3(0, 0, -3) // <-- Not correct.  How to calculate?
      node.physicsBody?.applyForce(force, impulse: true)
    }
  }
}

我可以在我硬编码的任何随机方向上移动球(参见上面的注释行),但我将如何计算“远离相机”?

我尝试从相机(我认为它正在寻找的位置)沿 -z 方向获取一个向量,并尝试将其转换为我感兴趣的节点的向量:

    let force = SCNVector3(0, 0, -3)
    let convertedForce = node.parentNode!.convertPosition(force, fromNode: cameraNode)
    node.physicsBody?.applyForce(convertedForce, impulse: true)

这不起作用。节点向错误的方向移动。

【问题讨论】:

  • 我突然想到,如果我只知道相机所面对的当前方向的矢量是什么,那就是我想要的(或者我可以转换到适当的坐标空间)。但我也不确定如何获得它。

标签: ios swift scenekit skphysicsbody


【解决方案1】:

SCNViewpointOfView 属性将返回对包含场景中相机的节点的引用。正是这个节点的变换矩阵决定了相机的视野。然后你可以pull the z-axis out of this matrix

func cameraZaxis(view:SCNView) -> SCNVector3 {
    let cameraMat = view.pointOfView!.transform
    return SCNVector3Make(cameraMat.m31, cameraMat.m32, cameraMat.m33)
}

applyForce 在全局坐标系中施加力,所以在这种情况下,我认为您不需要跨坐标系进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多