gpt4 book ai didi

physics - 变焦时关节断裂

转载 作者:行者123 更新时间:2023-12-02 21:33:22 26 4
gpt4 key购买 nike

我最近在排练Sprite Kit,遇到了一个很奇怪的问题。当缩放(改变其比例)父节点时,通过 SKPhysicsJointPin 连接在一起的实体逐渐彼此分离,然后关节断裂。让我给你看一下图像。

这是正常状态: Here's the normal state

放大后如下: Zoomed in

这是缩小后的效果: Zoomed out

如果你问我如何连接物体:我将棕色的棍子连接到蓝色节点中心的蓝色节点上。你知道我的问题是什么吗?

编辑:我最近发现,当连接体不动态时,关节不会断裂,并且一切都会按预期工作。例如,如果我使用 [SKPhysicsBody bodyWithEdgleLoopF​​romRect] 而不是[SKPhysicsBody bodyWithRectangleOfSize] 为 Sprite 创建物理体,没有问题。但我需要 body 是动态的。

这是我用来将物理附加到节点的代码。当然,这一切都是动态完成的。为了简洁起见,我只是进行了硬编码。

 -(void)attachPhysics{
//fixedComponentLeft & fixedComponentRight are two SKSprites
fixedComponentLeft.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.frame.size.width];
fixedComponentRight.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.size.width];
beam1.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam1.size];
joiningBody.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:joiningBody1.size.width];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentLeft.physicsBody bodyB:beam1.physicsBody anchor:fixedComponentLeft.position]];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam1.physicsBody anchor:beam1.endPoint]];
beam2.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam2.size];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam2.physicsBody anchor:beam2.position]];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentRight.physicsBody bodyB:beam2.physicsBody anchor:beam2.endPoint]];
}

在上面的代码中,beam1和beam2是SKSpriteNode子类的实例。默认情况下, anchor 是 (0,0.5),我添加了一个名为 endPoint 的属性,它充当 Sprite 上最右边的边缘点。

最佳答案

事实上,这不是一个答案,但我想我不会为此使用评论区,因为问题太大,无法容纳在那里。我应该猜到这个问题是由于绘制元素的节点和它们的 body 的物理世界被添加到具有不同的坐标系而引起的。这是因为物理世界属于场景,这意味着无论向场景添加多少个子节点,通常都只有一个物理世界,所有附加到不同子节点上的不同节点的物体共享同一个世界。我不知道这样好不好。因此,我们可以尝试以下方法:

  1. 缩放场景本身而不是子节点:当我尝试它时,毫不奇怪我遇到了一个非常大的问题。由于场景通常是游戏中所有节点的根节点,这意味着所有内容都会相应地放大或缩小。这也包括控制平显。所以,这不是一个好主意

  2. 您可以尝试对 SKNode 进行子类化,以便它实现自己的 SKPhysicsWrold 实例并将所有内容添加到该世界:不幸的是,由于某些原因,Apple 无法拥有自己的物理世界。是的,您可以将关节添加到任何您想要的世界中。但关节需要 body 来共享同一个世界。从纯粹的、未包装的 Box2D 中,我记得物体也需要添加到物理世界中。所以我假设,苹果已经将其自动化,当您设置物理体时,它会添加到 scene.physicalsWorld 中。如果您尝试将关节添加到自定义创建的物理世界中,您将收到 Box2D 错误,指出关节容量小于关节数量。 :))

  3. 唯一现实的方法似乎是重建物理主体和关节。但这确实很痛苦,而且我也没有成功。除了潜在的性能影响之外,这种方法还需要非常准确的 body 和关节重新创建顺序,设置它们之前的速度等。

    因此,在网上搜索了 20 多天但没有找到真正有效的解决方案后,我可以说这是一个真正的问题,我认为 Apple 需要考虑重新审视,或者至少提供良好的解决方案。

关于physics - 变焦时关节断裂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21890345/

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