我正在尝试创建HTML5
类似于 Sushi Cat 游戏的游戏。我按照Emanuele Feronato 的博客文章中的类似教程,然后想出了这个图像中的图片 A 的结构,其中允许灰色轨道相互穿透,而红线是远距离约束。
但问题是当水滴从高处坠落(或撞到角落)时,它会变成图 B 中的样子。
我尝试使用弹簧,不同的约束力,更小的轨道,但它们不能正常工作。
我的问题:
解决方案是什么?或者我在哪里可以在网上找到解决方案?
是否有任何其他具有特定功能的 js 物理引擎来执行此任务?
我正在尝试创建HTML5
类似于 Sushi Cat 游戏的游戏。我按照Emanuele Feronato 的博客文章中的类似教程,然后想出了这个图像中的图片 A 的结构,其中允许灰色轨道相互穿透,而红线是远距离约束。
但问题是当水滴从高处坠落(或撞到角落)时,它会变成图 B 中的样子。
我尝试使用弹簧,不同的约束力,更小的轨道,但它们不能正常工作。
我的问题:
解决方案是什么?或者我在哪里可以在网上找到解决方案?
是否有任何其他具有特定功能的 js 物理引擎来执行此任务?
只需为这些点添加一些额外的约束。当前形状的对称性意味着圆形和对折都是有效和放松的配置。
使用从中心到外部的一条线作为参考,给每个辐条一个偏离该线的角度。
然后每个外部点将按如下方式移动。
获取参考线的角度。
var ang = Math.atan2(refLine.p2.y - refLine.p1.y, refLine.p2.x - refLine.p1.x);
然后对于每条线,将端点移向其所需的相对角度位置。
// line is a spoke line with a property angle that is the angle from the
// reference line
var x = refLine.p1.x; // get center point
var y = refLine.p2.y;
// get position relative to ref ang
line.x = Math.cos(line.angle + ang) * line.length + x;
line.y = Math.sin(line.angle + ang) * line.length + y;
对每条辐条线执行此操作,并在应用线长约束后应用它。
参考您给出的图像,从中心到 12 点钟的线是参考线,然后其他辐条线将具有如下限制的角度。
而另一个方向
您将能够忽略 6 点钟线,因为给它一个约束会使对象想要向右滚动。
现在这意味着对于可能的状态只有一种解决方案,而不是您拥有的许多解决方案。
斑点折叠成自身的原因是因为重力会挤压斑点点并且距离关节会找到新的有效配置。距离关节的工作只是保持两点之间的给定距离,它并没有真正做任何事情来防止自折叠。
另一种方法是使用棱柱接头(也称为“滑动接头”)。对于棱柱接头,外部斑点圆将从斑点中心沿径向滑动。为了使斑点有弹性,您可以在斑点中心和圆圈之间添加某种弹簧。如果 blob 仍然自我折叠,您可以对棱柱关节添加限制,因此圆圈只能滑动一定距离。
该视频使用RUBE物理编辑器(在引擎盖下使用 box2d )以类似的方式演示了棱柱关节。
使用p2.js 物理引擎制作了类似的场景,请在此处阅读更多内容。(直接链接到演示)。在 p2.js 演示中构造 Prismatic Joints 的部分代码是:
// Constrain the capsule body to the center body.
// A prismatic constraint lets it move radially from the center body along one axis
var prismatic = new p2.PrismaticConstraint(wheelBody, body, {
localAnchorA : [0, 0],
localAnchorB : [0, 0],
localAxisA : [Math.cos(angle), Math.sin(angle)],
disableRotationalLock: true, // Let the capsule rotate around its own axis
collideConnected: true
});
在 JavaScript 中,有几个可用的 Box2D 端口具有 Prismatic Joint。p2.js 具有 PrismaticConstraint。