let Engine = Matter.Engine,
  Render = Matter.Render,
  Runner = Matter.Runner,
  World = Matter.World,
  Bodies = Matter.Bodies,
  Constraint = Matter.Constraint;

let engine = Engine.create(),
  world = engine.world;

let render = Render.create({
  element: document.body,
  engine: engine,
  options: {
    width: 800,
    height: 600,
    wireframes: false,
    background: "#fafafa",
  },
});

let base = Bodies.rectangle(400, 100, 350, 20, {
  isStatic: true,
  render: { fillStyle: "#2e3276" },
});

let side_base = Bodies.rectangle(280, 280, 20, 350, {
  isStatic: true,
  render: { fillStyle: "#2e3276" },
});

let ball = Bodies.circle(800, 300, 20, {
  density: 0.04,
  frictionAir: 0.005,
  restitution: 0.8,
  friction: 0.01,
  render: { fillStyle: "#4CAF50" },
});

let pendulum = Constraint.create({
  pointA: { x: 400, y: 100 },
  bodyB: ball,
  render: { strokeStyle: "#000000" },
  length: 170,
});

let spring = Constraint.create({
  pointA: { x: 280, y: 300 },
  bodyB: ball,
  stiffness: 0.0001,
  render: { strokeStyle: "#000000" },
});

World.add(world, [base, side_base, ball, pendulum, spring]);
Runner.run(engine);
Render.run(render);
<script src="https://cdn.jsdelivr.net/npm/matter-js@0.18.0/build/matter.min.js"></script>

例如,首先,我有一个矩形和一个圆.我创造了一个从矩形到圆形的约束,它起作用了,就像一个钟摆.现在,我需要创建一个从另一个矩形到创建之前的约束的新约束,但它不起作用.你对这个问题有什么 idea 吗?谢谢.这个问题是在matter.js中创建的

pendulum with a spring

Example

是这样的,但我需要的是线上的弹簧,而不是圆圈里的弹簧.

推荐答案

如果我理解正确的话,听起来约束K的目标是保持水平,在L线上上下移动,在任何x点K和L相交的地方连接.

一种方法是计算L的x截距,然后在每一帧上定位一个看不见的、不碰撞的物体.不可见实体将成为约束K的终点.

const engine = Matter.Engine.create();

const render = Matter.Render.create({
  engine,
  element: document.body,
  options: {
    width: 800,
    height: 600,
    wireframes: false,
    background: "#fafafa",
  },
});

const base = Matter.Bodies.rectangle(400, 100, 350, 20, {
  isStatic: true,
  render: {fillStyle: "#2e3276"},
});

const sideBase = Matter.Bodies.rectangle(280, 280, 20, 350, {
  isStatic: true,
  render: {fillStyle: "#2e3276"},
});

const ball = Matter.Bodies.circle(300, 300, 20, {
  density: 0.04,
  frictionAir: 0.005,
  restitution: 0.8,
  friction: 0.01,
  render: {fillStyle: "#4CAF50"},
});

const pendulum = Matter.Constraint.create({
  pointA: {x: 400, y: 100},
  bodyB: ball,
  render: {strokeStyle: "#000000"},
  length: 170,
});

const lineAnchor = Matter.Bodies.circle(0, 0, 0, {
  isStatic: true,
  isSensor: true,
});

const spring = Matter.Constraint.create({
  pointA: {x: 280, y: 200},
  bodyB: lineAnchor,
  stiffness: 0.0001,
  render: {strokeStyle: "#000000"},
});

Matter.Composite.add(engine.world, [
  base,
  sideBase,
  ball,
  pendulum,
  spring,
  lineAnchor,
]);
Matter.Runner.run(engine);
Matter.Render.run(render);

const findXCoordinate = (x1, y1, x2, y2, y) => {
  // slope
  const m = (y2 - y1) / (x2 - x1);

  // y-intercept (b)
  const b = y1 - m * x1;

  // x-coordinate when the line passes through y
  const x = (y - b) / m;
  return x;
};

Matter.Events.on(engine, "afterUpdate", () => {
  const {x: x1, y: y1} = ball.position;
  const {x: x2, y: y2} = pendulum.pointA;
  const {y} = spring.pointA;
  const x = findXCoordinate(x1, y1, x2, y2, y);
  Matter.Body.setPosition(lineAnchor, {x, y});
});
<script src="https://cdn.jsdelivr.net/npm/matter-js@0.19.0/build/matter.min.js"></script>

这里(可能的)问题是,约束K不会对摆线L施加任何力,因为setPosition凌驾于物理之上.考虑到约束的刚度如此之低,这似乎是所需的行为.

如果这不是目的,它似乎与纯粹的水平约束有点相反--我会在线上 Select 一个固定点并将约束绑定到它上,可能会将线分成由主体连接的两个部分.这样,如果球被水平约束使劲拉,连接点下方的底部将自然下垂(或者,如果不需要,则将底部身体附加到刚性约束上).

另一种 Select 是使用链接到球的约束保留原始设计,但使该约束不可见.然后使用上面的水平约束来添加所需的可视效果.最终,行为将不会是物理上完美的,因为L约束将 pull 球而不是链子,但可能足够近,以创建必要的错觉来满足您的需要.

Javascript相关问答推荐

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

Klaro与Angular的集成

. NET中Unix时间转换为日期时间的奇怪行为

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何从调整大小/zoom 的SVG路径定义新的d属性?""

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

屏幕右侧屏障上的产卵点""

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

如何从网站www.example.com获取表与Cheerio谷歌应用程序脚本

Angular 中的类型错误上不存在获取属性

连接到游戏的玩家不会在浏览器在线游戏中呈现

让chart.js饼图中的一个切片变厚?

VSCode中出现随机行

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

MarkLogic-earch.suggest不返回任何值

无法设置RazorPay订阅API项目价格

Reaction即使在重新呈现后也会在方法内部保留局部值

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

如何将缓冲区数组转换回音频