首页 > 解决方案 > 由关节连接的两个物理体之间的拉力

问题描述

我正在尝试做的事情:

我创建了两个SCNNodes 和相应SCNPhysicsBody的 s(都是动态的和受重力影响的),我想使用SCNPhysicsHingeJoint. 只是为了测试一下,node1有一个额外的关节,以便固定在场景中并且不会因重力而掉落。节点通过 相互连接joint。所以当我开始时,场景node1只是固定在场景中并向node2下悬挂。现在我想确定拉关节的力应该等于 -9.8(假设没有摆动),因为重力加速度等于 -9.8(默认值gravity属性),默认质量等于 1,其中拉动关节的力应为 -9.8。我不想计算拉力,因为我的场景会变得相当复杂。因此,我想知道是否有一种属性或方法可以计算两个节点之间的拉力以及通过关节连接的物理体?

let node1 = SCNNode(geometry: SCNCylinder(radius: 0.125, height: 2))
node1.position.x = -1.625
node1.rotation = SCNVector4(1, 0, 0, Float.pi/2)
node1.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: node1.geometry!, options: nil))
node1.physicsBody!.isAffectedByGravity = true
node1.physicsBody!.categoryBitMask = 1
node1.physicsBody!.contactTestBitMask = 1
node1.physicsBody!.collisionBitMask = 1
rootNode.addChildNode(node1)

let node2 = SCNNode(geometry: SCNBox(width: 3, height: 0.25, length: 2, chamferRadius: 0))
node2.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry: node2.geometry!, options: nil))
node2.physicsBody!.isAffectedByGravity = true
node2.physicsBody!.categoryBitMask = 1
node2.physicsBody!.contactTestBitMask = 1
node2.physicsBody!.collisionBitMask = 1
rootNode.addChildNode(node2)

let irrelevantJoint = SCNPhysicsHingeJoint(body: node1.physicsBody!, axis: SCNVector3(0, 1, 0), anchor: SCNVector3(0, 0, -0.125))
physicsWorld.addBehavior(irrelevantJoint)

let joint = SCNPhysicsHingeJoint(bodyA: node1.physicsBody!, axisA: SCNVector3(0, 1, 0), anchorA: SCNVector3(0, 0, 0.125),
                                 bodyB: node2.physicsBody!, axisB: SCNVector3(0, 0, 1), anchorB: SCNVector3(-1.5, 0, 0))
physicsWorld.addBehavior(joint)

我尝试了什么:

我希望我可以使用SCNPhysicsContactDelegatephysicsWorld(_:didEnd:)来获得力量(或冲动)joint。每当调用方法时,都会SCNPhysicsContact创建一个允许您访问其collisionImpulse属性的方法,所以我希望有一个负面的冲动,但事实并非如此。我刚得到和collisionImpulse0。关于如何获得通过关节连接的两个物理体之间的拉力的任何想法?

标签: swiftscenekitgame-physics

解决方案


游戏物理模拟不需要简单关节中的力计算。这些是几何约束,收敛是通过求解器迭代实现的。力计算是一项额外的费用,它会花费计算时间,并且在综合求解器中,默认情况下会显式启用和禁用。并不是所有的求解器都有这个,并且看着SCNPhysicsWorld我没有看到任何迹象,所以我很确定它没有实现。

积极的一点是,我相信施加到场景中每个身体的力的计算非常简单。您只需在每帧更新身体的当前帧和前一帧速度,并将加速度计算为它们的差除以时间戳。将它乘以体重,这会给你力量。同样,您可以根据物体的惯性计算角速度和扭矩。

如果您确实需要关节中的力和扭矩,这并不那么简单,所以我唯一可以建议的是描述您计划如何使用它,看看是否有替代解决方案来实现这个最终目标。


推荐阅读