gpt4 book ai didi

swift - 使用PhysicsBody旋转SCNNode以匹配Thumbstick的弧度

转载 作者:行者123 更新时间:2023-11-30 13:44:57 25 4
gpt4 key购买 nike

我正在开发一个使用 Swift 和 SceneKit 构建的自上而下的太空游戏,并进行以下设置:

代表宇宙飞船的SCNNode

  • 旋转仅限于 y 轴;值范围从 -M_PI_2M_PI + M_PI_2
  • 移动仅限于 x 和 z 轴。

游戏 Controller 拇指杆输入

  • x 轴和 y 轴上的值范围为 -1.01.0

当游戏 Controller 的拇指杆改变位置时,宇宙飞船应使用物理体旋转以匹配拇指杆的弧度。

摇杆的目标弧度可以通过以下公式计算:

let targetRadian = M_PI_2 + atan2(-y, -x)

节点当前的弧度可以通过以下方式获得:

let currentRadian = node.presentationNode.rotation.w * node.presentationNode.rotation.y

NSTimeInterval deltaTime 提供自上次旋转计算以来的时间(以秒为单位)。

如何使用angleVelocityapplyTorque或其他物理方法旋转节点以达到targetRadian

最佳答案

targetRadiancurrentRadian 之间的差异范围为 0.0-2π,具体取决于当前弧度。该方程将确定达到目标弧度的最短转向方向,.顺时针.逆时针:

let turnDirection = (radianDifference + (M_PI * 2)) % (M_PI * 2) < M_PI ? RotationDirection.CounterClockwise : RotationDirection.Clockwise

使用applyTorque,有可能过度旋转超过targetRadian,从而在旋转改变方向时产生摆动效果,就像指南针向一点磁化一样来回到达targetRadian。以下虽然不是完美的解决方案,但却削弱了效果:

let turnDampener = abs(radianDifference) < 1.0 ? abs(radianDifference) : 1.0

完整的解决方案是:

enum RotationDirection: Double {
case Clockwise = -1.0
case CounterClockwise = 1.0
}

func rotateNodeTowardDirectionalVector(node: SCNNode, targetDirectionalVector: (x: Double, y: Double), deltaTime: NSTimeInterval) {
guard abs(targetDirectionalVector.x) > 0.0 || abs(targetDirectionalVector.y) > 0.0 else { return }

let currentRadian = Double(node.presentationNode.rotation.w * node.presentationNode.rotation.y)
let targetRadian = M_PI_2 + atan2(-targetDirectionalVector.y, -targetDirectionalVector.x)

let radianDifference = targetRadian - currentRadian

let π2 = M_PI * 2
let turnDirection = (radianDifference + π2) % π2 < M_PI ? RotationDirection.CounterClockwise : RotationDirection.Clockwise

let absRadianDifference = abs(radianDifference)
let turnDampener = absRadianDifference < 1.0 ? absRadianDifference : 1.0

node.physicsBody?.applyTorque(SCNVector4Make(0, CGFloat(turnDirection.rawValue), 0, CGFloat(deltaTime * turnDampener)), impulse: true)
}

关于swift - 使用PhysicsBody旋转SCNNode以匹配Thumbstick的弧度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com