0

在过去的两天里,我一直在弄清楚从弓上射出的箭的运动,但没有完美的最终结果。这是我到目前为止所拥有的:

    - (void) update:(ccTime) dt {
    elapsedTime += dt;
    CGFloat t = elapsedTime;
    float theta = CC_DEGREES_TO_RADIANS(angle);
    velocity = ccp (initialVelocity.x* cos(theta), initialVelocity.y*sin(theta));


    float k = 0.3; //this would be the air resistance factor
    float vvx = sqrtf( velocity.x*velocity.x + velocity.y*velocity.y );
    float vvy = sqrtf( velocity.x*velocity.x + velocity.y*velocity.y );

    CGFloat ax = -k*vvx; //accelerationX
    CGFloat ay = -k*vvy - gravity; //accelerationY


    velocity = ccp(velocity.x + ax * t , velocity.y + ay * t);

    CGPoint oldPosition = self.position;
    CGPoint newPosition = ccp(self.position.x + velocity.x * t + ax * t * t, self.position.y + velocity.y * t + ay * t * t);

    CGPoint v1 = CGPointMake(0.0, 0.0);
    CGPoint v2 = CGPointMake(newPosition.x - oldPosition.x ,  newPosition.y - oldPosition.y);
   CGFloat newAngle = (atan2(v2.y, v2.x) - atan2(v1.y, v1.x));
    self.rotation = CC_RADIANS_TO_DEGREES(-newAngle);
    self.position = newPosition;

}

使用此代码,我得到了这种行为:

使用:k = 0.3,角度 = 0 度,重力 = 9.8

initialVelocity = 100 时,箭头的抛物线轨迹很好

initialVelocity = 200 时,箭头移动得更快,但轨迹与 initialVelocity = 100 完全相同

在 initialVelocity = 300 时,箭头移动得更快,轨迹略有不同,但仍然非常接近 initialVelocity = 100 的轨迹

我的代码有问题吗?请注意,我对所有概念都没有很好的理解,根据我在网上阅读的内容,大部分实现都是命中注定的。

4

2 回答 2

1

您正在多次添加加速度。你有:

velocity = ccp(velocity.x + ax * t , velocity.y + ay * t);

然后在下面:

CGPoint newPosition = ccp(self.position.x + velocity.x * t + ax * t * t, self.position.y + velocity.y * t + ay * t * t);

在我看来,您可以将第二行简化为

CGPoint newPosition = ccp(self.position.x + velocity.x * t, self.position.y + velocity.y * t);

但是,我认为您的整体算法比它需要的更复杂,这使得错误更难找到。不应该有任何理由跟踪角度;只需分离向量并独立处理。在伪代码中,是这样的:

// setup
vx = cos(InitAngle) * InitVelocity;
vy = sin(InitAngle) * InitVelocity;
locx = 0;
locy = 0;
gravity = -1.0;
friction  -0.01;

// loop
Update(t) {
  vx *= 1+(friction * t);
  vy +=gravity * t;
  locx += vx * t;
  locy += vy * t;
}

(我可能把 sin/cos 颠倒了;我总是弄错。)

于 2012-11-01T15:20:45.363 回答
0

Horatiu,如果您不想使用物理引擎并且想通过hit&miss,我建议您从没有空气阻力的情况下开始。从简单开始,从简单的物理学中获得帮助:抛出物体的方程(加速度、速度、位置、推导和时间),然后在合适的时候加上空气摩擦。当您拥有正确的方程式时,编码将是一个简单的步骤!

于 2012-11-01T14:51:09.167 回答