从圆形边界反弹球

Posted

技术标签:

【中文标题】从圆形边界反弹球【英文标题】:Bouncing a ball from circular boundary 【发布时间】:2013-11-23 22:32:53 【问题描述】:

这是我发现的公式:

r = v - [2 (n · v) n]

我就是这样申请的

    //Calculating normal
    nx = 350 -  SmileyReds[i].xpos ;
    ny = 350 -  SmileyReds[i].ypos ;

  //new calc
   v_newx = SmileyReds[i].xspeed - (2 *( nx * SmileyReds[i].xspeed + ny * SmileyReds[i].yspeed ) ) * nx;
   v_newy = SmileyReds[i].yspeed - (2 *( nx * SmileyReds[i].xspeed + ny * SmileyReds[i].yspeed ) ) * ny;

   SmileyReds[i].xspeed = v_newx;
   SmileyReds[i].yspeed = v_newy;

但球没有弹跳,而是在到达边界时消失:

完整的src和预览http://jsfiddle.net/gj4Q7/4/

感谢您的宝贵时间,欢迎提供任何提示!

【问题讨论】:

我还没有解决所有问题,但我已经解决了一些问题jsfiddle.net/gj4Q7/3 btw 为什么会有这么多循环?我已经删除了大部分。 @plalx 非常感谢你,我知道循环不是必需的,但是当弹跳正常工作时,我打算最后将它们结合起来,在你的版本中,红色笑脸正在消失圈子:(你知道为什么吗? 是的,这就是为什么我说“修复了一些事情”。也许如果你告诉我你在哪里找到公式以及在哪里解释它,我可以提供帮助。 @plalx here : gamedev.stackexchange.com/questions/33384/… 我发现错误并更新了小提琴,但一段时间后笑脸仍然粘在圆圈边界上并离开圆圈... 【参考方案1】:

我认为你需要正常化:)

之后

//Calculating normal
nx = 350 -  SmileyReds[i].xpos;
ny = 350 -  SmileyReds[i].ypos;

插入

var len = Math.sqrt(nx * nx + ny * ny);
nx = nx / len;
ny = ny / len;

您可以看到,否则您可以轻松获得 350*350 范围内的速度值,将您的物体弹射到太空中......

【讨论】:

是的,我后来也发现了,现在的问题是你可以在更新的小提琴上看到,为什么一段时间后红色的笑脸会粘在圆圈的边界上,这是它应该工作的方式?当我更改标签时,我也看到圈外的笑脸......

以上是关于从圆形边界反弹球的主要内容,如果未能解决你的问题,请参考以下文章

游戏制作人:球不会自己从墙上反弹

Pythondemo实验21练习实例求球反弹高度

如何设置场景物理主体的边界以正确反弹?

如果脉冲太小,SKPhysicsBody 球不会反弹

遍历 Java 集合以使这些球反弹,有啥提示吗?

如何让海龟在 netlogo 中从世界边界反弹