在Stack Overflow社区的帮助下,我写了一个非常基本但有趣的物理模拟器.

单击并拖动鼠标以启动球.它会反弹并最终停在"地板"上.
我想要添加的下一个重要特征是球与球的碰撞.球的运动被分解为ax和y速度矢量.我有重力(每一步的y矢量小减少),我有摩擦(每次与墙碰撞的两个矢量的小减少).球真诚地以令人惊讶的逼真方式移动.
我想我的问题有两个部分:

处理"墙壁"的碰撞检测和由此产生的矢量变化很容易,但我发现球 - 球碰撞的并发症更多.对于墙壁,我只需要采取适当的x或y向量的负数,然后关闭它将朝正确的方向前进.有球我认为不是这样.
一些快速澄清:为了简单起见,我现在可以完全弹性碰撞,现在我的所有球都具有相同的质量,但我将来可能会改变它.
编辑:我发现有用的资源
带矢量的2d球物理:无三角碰撞的二维碰撞.pdf
2d球碰撞检测示例:添加碰撞检测
我的球碰撞检测和响应工作很棒!
相关代码:
碰撞检测:
for (int i = 0; i < ballCount; i++)
{
for (int j = i + 1; j < ballCount; j++)
{
if (balls[i].colliding(balls[j]))
{
balls[i].resolveCollision(balls[j]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将检查每个球之间的碰撞但跳过多余的检查(如果你必须检查球1是否与球2碰撞,那么你不需要检查球2是否与球1碰撞.此外,它会跳过检查是否与自身发生碰撞).
然后,在我的球类中,我有我的colliding()和resolveCollision()方法:
public boolean colliding(Ball ball)
{
float xd = position.getX() - ball.position.getX();
float yd = position.getY() - ball.position.getY();
float sumRadius = getRadius() + ball.getRadius();
float sqrRadius …Run Code Online (Sandbox Code Playgroud) Box2D有几个不同的JavaScript 端口.哪一个是最好的?
Box2DJS - "以自动方式从Box2DFlashAS3_1.4.3.1转换"
Box2Dflash 2.0移植到JavaScript - "恰好工作的一个大讨厌的黑客"
box2dweb - "一个Box2DFlash 2.1a到JavaScript的端口.我开发了一个ActionScript 3到JavaScript转换器来生成代码"
HBehrens/box2d.js - "Box2D 2.1a的JavaScript版本"(2011年11月21日添加)
kripken/box2d.js - "使用Emscripten将Box2D 2D物理引擎直接移植到JavaScript"(已于2013年9月24日添加)
任何版本http://chrome.angrybirds.com/使用的想法,如果有的话?
首先请不要对我的英语太过批评.我不是母语人士.我希望我能解释自己从未如此!此外,我读到我应该表明我已经做了一些努力来自己解决给定的问题.为了表明我的帖子变得相对较长.
我是新的(三周)到javascript,我尝试通过html5 canvas和javascript构建一个池台球桌.最后,用户应该能够通过拖动十六个球来在虚拟池桌面上呈现某种游戏情况.我在stackoverflow上发现了很多关于路径和拖放的提示.
一会儿,圆圈几乎看起来像池球,我可以用鼠标移动它们.到现在为止还挺好.
当然,池球在现实中碰撞并且不重叠.关于碰撞检测,我发现了一个有用的帖子,告诉我使用Pythagorean therm a*a + b*b = c*c来做这件事.我理解这个概念.我绝对不明白的是我必须在我的代码中实现检测.在我的脚本中有一个函数(moveBall00(e)),如果球被拖动(dragok = true),它会计算新的x和y坐标.但是,如何在同时计算拖动球的新坐标的同时计算球之间的距离?这可能很容易成为新手问题!
我试过这个:
新变量"x"
var x = true;
用于检测球之间距离的新功能
function collision(){if((Math.pow(bp [1] [0] - bp [1] [1],2))+(Math.pow(bp [2] [0] - bp [2] [ 1],2))<= 576){x = false; }}
每10毫米调用"碰撞()"
(function isIntersecting(){return setInterval(collision,10);})();
如果"x = true",则仅拖动球
function moveBall00(e){if(dragok && x){bp [1] [0] = e.pageX - canvas.offsetLeft; bp [2] [0] = e.pageY - canvas.offsetTop; }}
结果是圆圈(球)重叠直到它们休息.他们覆盖的越多,我拖得更快.这接缝是第一个问题?!
对于经验丰富的开发人员来说,最确定的是步行穿过公园而不是我.
我是坚持类型,并将学习在javascript中做这些东西,但目前我不知道如何解决上述问题.
我很感激任何帮助,这将在未来的结果发布!
(为了简化它,只有白球是可绘制的.)
<!doctype html>
<html>
<head>
<meta charset="UTF-8" /> …Run Code Online (Sandbox Code Playgroud)