gpt4 book ai didi

javascript - p2.js 物体穿过其他物体

转载 作者:行者123 更新时间:2023-12-03 09:35:12 24 4
gpt4 key购买 nike

我正在用js制作一棵树。我把它画在 Canvas 上。我使用 p2.js 物理引擎来实现 Twig 的真实移动。我正在加入 RevoluteConstraint 的分支机构。我有一个问题。我的 Twig 夹在中间。

一切顺利。但我希望分支的 body 是绝对的,并且可以穿过其他分支。

我尝试将世界解算器的容差设置为高或低,但它不起作用。

代码:

world = new p2.World({
gravity: [0, 10]
});

//new branch (fromX, fromY - from prev branch)
var body = new p2.Body({
mass: 0,
angle: this._generateAngle(-45, 45)
});
body.position[0] = fromX-(Math.sin(body.angle))*shape.height/2;
body.position[1] = fromY-(-Math.cos(body.angle))*shape.height/2;
body.addShape(new p2.Rectange(0.3, Math.random()*2));

//joining prev branch and this branch
var rc = new p2.RevoluteConstraint(prev_branch, body, {
localPivotA: [0, -prev_branch.shapes[0].height/2],
localPivotB: [0, body.shapes[0].height/2]
});
rc.setLimits(-Math.PI/8, Math.PI/8);
world.addConstraint(rc);
world.addBody(body);

完整代码:http://dkaraush.shpp.me/tree.js

最佳答案

最简单的解决方案是禁用场景中的所有碰撞。这是通过关闭所有物体上的碰撞响应来完成的:

// Turns off collisions with this body
body.collisionResponse = false;

如果您想禁用分支之间的碰撞,但仍启用与场景中其他事物的碰撞,则需要使用碰撞组和 mask 。

为此,我们创建两个碰撞组,一组用于风景形状,一组用于 Twig 形状。在场景中创建形状时,我们告诉它们属于哪个组 (.collisionGroup) 以及它们可以与哪个组发生碰撞 (.collisionMask)。

示例:

// Create collision groups
var SCENERY_GROUP = 1;
var BRANCH_GROUP = 2;

// Branch shape
branchShape.collisionGroup = BRANCH_GROUP; // Set group for this branch.
branchShape.collisionMask = SCENERY_GROUP; // It can only collide with scenery.

// Ground shape
groundShape.collisionGroup = SCENERY_GROUP; // Set group for the ground.
groundShape.collisionMask = BRANCH_GROUP; // It can only collide with branches.

如果您想查看此 p2.js 功能的实际效果,请查看 Ragdoll demo .

关于javascript - p2.js 物体穿过其他物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com