【问题标题】:SceneKit - Modifying velocity for the direction a node is facingSceneKit - 修改节点面向的方向的速度
【发布时间】:2018-02-04 12:47:36
【问题描述】:

我目前正在使用 SceneKit 开发 ARKit 游戏,但在控制和移动节点时遇到了麻烦。游戏的布局非常简单,我有一个节点代表一个拥有动态物理主体的坦克。我可以成功地将节点添加到地图中,但是我想使用操纵杆来控制节点。

我正在尝试修改坦克的速度属性,以便当操纵杆被向上推时,坦克会朝着它所面对的方向向前移动。为此,我首先尝试简单地设置速度属性:

t.physicsBody?.velocity = SCNVector3Make(0, 0, -0.15)

这导致坦克以所需的速度移动,但方向不正确。据我了解, -z 方向是向前的方向。 Apple 的本地与世界空间文档非常模糊,在网上查看后,我发现了这篇堆栈溢出文章SceneKit physics add velocity in local space。我已经尝试转换为仍然没有达到预期效果的父节点。我还尝试使用具有更新值的表示节点的物理主体,但两种方式都会导致抖动、不均匀和不可预测的运动。

我会使用力,但是我希望 SCNode 能够在没有加速的情况下进行非常直接和卡通化的运动。任何帮助了解正在发生的事情以及 SceneKit 处理运动的方式将不胜感激。

【问题讨论】:

    标签: ios swift scenekit


    【解决方案1】:

    我猜你使用的是 iOS11,所以我认为你可以使用 SCNNode.convertVector 来达到你的目的。

    let velocityInLocalSpace = SCNVector3(0, 0, -0.15)
    let velocityInWorldSpace = t.presentation.convertVector(velocityInLocalSpace, to: nil)
    t.physicsBody?.velocity = velocityInWorldSpace
    

    【讨论】:

    • 因此,虽然这确实会根据需要向前和向后推动节点,但它也会导致节点开始抖动和旋转之前的问题。我将项目添加到 git hub github.com/Dilraj-Singh-Devgun/Tanks 以便更容易看到问题。为了解决问题,锁定一个区域,地图和坦克应该会出现并且可以通过操纵杆控制。影响移动的代码在 ViewController.swift 第 150-165 行。我不完全理解是什么导致了所有的抖动和旋转。如果坦克确实旋转,它应该朝它所面对的新方向移动
    • 哦,抱歉,我错过了在代码中添加“演示文稿”。我编辑了答案。如果你不想让坦克旋转,你可以将大值设置为物理体的角阻尼。
    • 谢谢 :D 使用演示节点解决了我的问题,它现在朝着它所面对的方向移动。通过设置角阻尼是否意味着我不能让坦克按命令旋转。如果我将操纵杆转到死区,我希望坦克能够旋转,但如果它向前移动则不能
    • 如果设置了角度阻尼,则无法旋转物理体,但可以旋转节点。您可以使用此代码旋转坦克:t.eulerAngles.y = t.presentation.eulerAngles.y + 0.1,并且在设置旋转时,您需要同时设置位置。 t.position = t.presentation.position
    猜你喜欢
    • 2017-02-26
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2018-08-01
    • 2017-07-03
    相关资源
    最近更新 更多