【问题标题】:In SceneKit with swift trying to move character with a touch在 SceneKit 中快速尝试通过触摸移动角色
【发布时间】:2017-07-02 13:17:43
【问题描述】:

我找不到最近且不在目标 c 中的答案。我快速使用 SceneKit 并尝试将我的角色节点移动到用户单击的位置。我已经尝试在触摸开始时使用命中结果,但我的地板节点位于 (0, 0, 0) 处,因此当它击中大部分时间用户点击屏幕时它是无用的。我正要拿出我的旧微积分书,但后来我意识到当触摸位置总是相对于在场景中移动的屏幕位置时,我不知道如何转换。如果有人可以给我一个链接或提供一些建议,我将不胜感激。

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    要在视图坐标和场景坐标之间进行转换,您可以使用场景渲染器的 projectPoint 和 unprojectPoint 方法,请参阅https://developer.apple.com/reference/scenekit/scnscenerenderer 的文档

    它们可以让您在场景的 3D 坐标系和它所显示的视图的 2D 坐标系之间转换点。

    更新

    您要做的是调用 unproject 函数两次,一次将 z 设置为零(使用 x/y 视图坐标),一次将其设置为 1。这将在 3d 世界中为您提供 2 个点,想象它们之间有一条线,您需要计算出该线与您的平面相交的位置。这将是您需要的重点。

    【讨论】:

    • 谢谢 我现在看到文档了。我仍然很困惑,为什么参数是 SCNVector3?我试图从一个 CGPoint 开始,这是我从接触中得到的所有东西,开始是一个 SCNVector3。
    • 有趣的 unprojectPoint(SCNVector3)
    • 这是因为屏幕上的一个点指向 3d 世界中的一条线,您设置一个介于 0 和 1 之间的值来指定该点应该在 3d 世界中沿线的位置(在近和远剪裁平面)。有关详细信息,请参阅文档,如果您需要有关代码的帮助,可以询问有关堆栈溢出的更具体问题。如果我的回答有帮助,请将其标记为已接受,谢谢:)
    • 好吧,你帮了很多忙,我几乎让它工作了,但我在剪裁平面部分做错了。角色移动的距离比点击更远我希望它与我的地板平面相交的点成为我从中获取坐标的向量上的点。
    • 让 touch = touches.first! let location = touch.location(in: scnView) let hit = scnView.unprojectPoint(SCNVector3Make(Float(location.x), Float(location.y) , 0)) let moveToVector = SCNVector3Make(hit.x, 0, hit. z)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2016-09-15
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多