Swift SceneKit物理学在局部空间中增加速度
我正在尝试使用physicsBody.velocity通过向不同方向的轴添加或减去速度来操纵播放器节点。问题是,我很难找到将其应用于局部空间的方法,或者至少应用与对象面对的方向相关的速度。换句话说,如果我没有旋转对象的节点,它可以正常工作。如果我这样做,它仍然会增加未旋转空间的速度。 我知道有一种方法可以为当前的SConvector3增加速度,但我想不出来Swift SceneKit物理学在局部空间中增加速度,swift,vector,trigonometry,scenekit,Swift,Vector,Trigonometry,Scenekit,我正在尝试使用physicsBody.velocity通过向不同方向的轴添加或减去速度来操纵播放器节点。问题是,我很难找到将其应用于局部空间的方法,或者至少应用与对象面对的方向相关的速度。换句话说,如果我没有旋转对象的节点,它可以正常工作。如果我这样做,它仍然会增加未旋转空间的速度。 我知道有一种方法可以为当前的SConvector3增加速度,但我想不出来 if isZThrustPositive { if let velocity = self.physicsBody?.vel
if isZThrustPositive {
if let velocity = self.physicsBody?.velocity {
if velocity.z * 100 <= 8000 {
thrustDirection = SCNVector3(
x: velocity.x,
y: velocity.y,
z: velocity.z + kPlayerShipMainThrust)
self.physicsBody?.velocity = thrustDirection
}
}
}
物理模拟完成后,我正在更新节点的位置和旋转。
我也尝试过convertPosition
,但找不出一种方法来实现这一点。(我得到了一些非常疯狂的结果)。
非常感谢您的帮助
更新我让playerShip对象在旋转时在正确的方向上增加速度,但如果它没有朝正确的方向旋转,我仍然无法执行多次旋转。
对于船舶速度,我这样做:
if isXThrustPositive {
thrustDirection = self.convertPosition(SCNVector3(x: kPlayerShipMainThrust, y: 0.0, z: 0.0), toNode: self.parentNode!)
thrustDirection.x = thrustDirection.x - self.position.x
thrustDirection.y = thrustDirection.y - self.position.y
thrustDirection.z = thrustDirection.z - self.position.z
self.physicsBody?.applyForce(thrustDirection, impulse: true)
}
当尝试使用类似的方法进行旋转时(我知道这是注定的),得到的
scinvector3
只是一个位置,而不是节点当前面对的方向。是否有关于convertTransform
的任何信息以及如何使用这些信息?事实证明,我必须从场景的rootNode
获得正确的位置,以便根据SCNNode
的当前方向执行正确的旋转
xAxis = self.convertPosition(SCNVector3Make(1.0, 0.0, 0.0), toNode: self.parentNode!)
yAxis = self.convertPosition(SCNVector3Make(0.0, 1.0, 0.0), toNode: self.parentNode!)
zAxis = self.convertPosition(SCNVector3Make(0.0, 0.0, 1.0), toNode: self.parentNode!)
if isXRotatingPositive {
self.physicsBody?.applyTorque(
SCNVector4(
x: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.x - self.position.x),
y: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.y - self.position.y),
z: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.z - self.position.z),
w: cos(kPlayerShipRotationSpeed/2.0) * kPlayerShipRotationMagnitude),
impulse: true)
}
然后我只是使用标准的四元数旋转公式来获得基于当前位置的新轴的旋转。
我希望这对其他人有所帮助(而且关于SceneKit的更多信息即将发布)
如果任何SceneKit专家想对此发表评论或提供建议,我们将不胜感激。:) 杰出!帮助,是的!
xAxis = self.convertPosition(SCNVector3Make(1.0, 0.0, 0.0), toNode: self.parentNode!)
yAxis = self.convertPosition(SCNVector3Make(0.0, 1.0, 0.0), toNode: self.parentNode!)
zAxis = self.convertPosition(SCNVector3Make(0.0, 0.0, 1.0), toNode: self.parentNode!)
if isXRotatingPositive {
self.physicsBody?.applyTorque(
SCNVector4(
x: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.x - self.position.x),
y: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.y - self.position.y),
z: sin(kPlayerShipRotationSpeed/2.0) * (xAxis.z - self.position.z),
w: cos(kPlayerShipRotationSpeed/2.0) * kPlayerShipRotationMagnitude),
impulse: true)
}