gpt4 book ai didi

objective-c - Ball to Ball Collision - 碰撞时获得显着速度

转载 作者:太空狗 更新时间:2023-10-30 04:00:50 37 4
gpt4 key购买 nike

我在 Objective-C 中实现了问题“Ball to Ball Collision - Detection and Handling”中的代码。然而,只要球以一定角度碰撞,它们的速度就会急剧增加。所有矢量数学都是使用 cocos2d-iphone 完成的,标题为 CGPointExtension.h。这种意外加速的原因是什么?

下面是速度提升的例子:

输入:
质量 == 12.56637
velocity.x == 1.73199439
velocity.y == -10.5695238

ball.mass == 12.56637
ball.velocity.x == 6.04341078
ball.velocity.y == 14.2686739

输出:
质量 == 12.56637
velocity.x == 110.004326
velocity.y == -10.5695238

ball.mass == 12.56637
ball.velocity.x == -102.22892
ball.velocity.y == -72.4030228

#import "CGPointExtension.h"
#define RESTITUTION_CONSTANT (0.75) //elasticity of the system

- (void) resolveCollision:(Ball*) ball
{
// get the mtd (minimum translation distance)
CGPoint delta = ccpSub(position, ball.position);
float d = ccpLength(delta);
// minimum translation distance to push balls apart after intersecting
CGPoint mtd = ccpMult(delta, (((radius + ball.radius)-d)/d));


// resolve intersection --
// inverse mass quantities
float im1 = 1 / [self mass];
float im2 = 1 / [ball mass];

// push-pull them apart based off their mass
position = ccpAdd(position, ccpMult(mtd, (im1 / (im1 + im2))));
ball.position = ccpSub(ball.position, ccpMult(mtd, (im2 / (im1 + im2))));

// impact speed
CGPoint v = ccpSub(velocity, ball.velocity);
float vn = ccpDot(v,ccpNormalize(mtd));

// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;

// collision impulse
float i = (-(1.0f + RESTITUTION_CONSTANT) * vn) / ([self mass] + [ball mass]);
CGPoint impulse = ccpMult(mtd, i);


// change in momentum
velocity = ccpAdd(velocity, ccpMult(impulse, im1));
ball.velocity = ccpSub(ball.velocity, ccpMult(impulse, im2));

}

最佳答案

查看原始代码和原始发帖人的评论后,代码似乎是一样的,所以如果原始代码是正确的实现,我会怀疑是错误的矢量库或某种未初始化的变量。

为什么要将 1.0 添加到恢复系数?

发件人:http://en.wikipedia.org/wiki/Coefficient_of_restitution

COR 通常是 [0,1] 范围内的数字。定性地,1 代表完全弹性碰撞,而 0 代表完全非弹性碰撞。 COR大于1在理论上是可能的,代表产生动能的碰撞,例如地雷被扔在一起爆炸。

另一个问题是:

/ (im1 + im2)

您除以质量的倒数之和以获得沿接触向量的冲量 - 您可能应该除以质量本身的总和。这是在放大你的冲动(“她就是这么说的”)。

关于objective-c - Ball to Ball Collision - 碰撞时获得显着速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/894935/

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