【问题标题】:Move a specific node in SceneKit using touch使用触摸移动 SceneKit 中的特定节点
【发布时间】:2015-06-07 02:22:55
【问题描述】:

我有一个包含多个节点的场景。我想通过点击它来选择一个节点(如果我什么都不点击,我不想发生任何事情)并让他只在 XY 轴上跟随我的手指(我知道 Z 轴上的位置)。是否有任何方法可以将视图中的位置转换为 SceneKit 坐标?

经过几次研究,我发现了这个,这正是我想要的,但我没有得到代码。有人可以向我解释或帮助我弄清楚如何解决我的问题吗? https://www.youtube.com/watch?v=xn9Bt2PFp0g

【问题讨论】:

标签: ios move scenekit


【解决方案1】:
func CGPointToSCNVector3(view: SCNView, depth: Float, point: CGPoint) -> SCNVector3 {
    let projectedOrigin = view.projectPoint(SCNVector3Make(0, 0, depth))
    let locationWithz   = SCNVector3Make(Float(point.x), Float(point.y), projectedOrigin.z)
    return view.unprojectPoint(locationWithz)
}

看起来很简单,我制作了一个获取 3 个参数的函数。 View 是附加场景的 SCNView,depth 是 node 的 z 值,point 是一个 CGPoint,表示 3D 场景在屏幕上的投影。

【讨论】:

  • 你能分享一下代码吗?我正在处理目标 c,并且我拥有要移动的节点的 hitTest 结果。之后如何进行?
  • 请发布完整的解决方案
【解决方案2】:

这是 Alec Firtulescu's answer 作为 watchOS 的扩展(通过将 WKInterfaceSCNScene 更改为 SCNView 将其转换为 iOS):

extension CGPoint {
    func scnVector3Value(view: WKInterfaceSCNScene, depth: Float) -> SCNVector3 {
        let projectedOrigin = view.projectPoint(SCNVector3(0, 0, depth))

        return view.unprojectPoint(SCNVector3(Float(x), Float(y), projectedOrigin.z))
    }
}

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2018-10-30
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多