简单的box2d Javascript射线投射示例

4

我一直在查看关于使用Box2D进行射线投射的各种教程,但是我没有看到任何清晰的示例。我希望熟悉box2dweb的人能够给出一个清晰的示例,说明如何设置一个简单的函数,最终看起来类似于这样:

var myRayCastFunction = function(p1,p2,maxFraction){
    //Code here
}

这个想法是让它用起来像这样:
var retVal = myRayCastFunction(p1,p2,maxFraction)
var fixture = retVal.fixture
var point = retVal.point
var normal = retVal.normal
var fraction = retVal.fraction

在这种情况下,我只是返回一个交点,比如最近的一个,但我想知道如何制作一个类似的函数,其中retVel是每个交点的输出列表。
我一直在努力理解box2D中RayCasting的所有细节,我知道这需要制作一个自定义回调函数(我认为是这样?),但我从未弄清楚该函数应放置在哪里以及它应该是什么。
1个回答

2
我正准备在我的项目中添加raycasting,因此开始回答这个问题。我意识到在完成这个任务之前,需要修复box2dweb中的一些错误。为了避免混淆,我将链接详细信息: http://www.iforce2d.net/box2dweb-fixes.txt 以下是我成功使用射线投射回调的方法。声明您的回调类并为其提供ReportFixture函数:
var RaycastCallback = function() {
    this.m_hit = false;
}
RaycastCallback.prototype.ReportFixture = function(fixture,point,normal,fraction) {

    if ( ... not interested in this fixture ... ) 
        return -1;

    this.m_hit = true;
    this.m_point = point;
    this.m_normal = normal;
    return fraction;
};

现在创建一个实例并将其传递到世界的RayCast函数中:
var rayStart = ...;
var rayEnd = ...;

var callback = new RaycastCallback();

world.RayCast(callback, rayStart, rayEnd);
if ( callback.m_hit ) {
    ... use callback.m_point etc ...
}

谢谢您的回复。我有几个问题: 1.您能详细说明“...不感兴趣的这个装置...”部分吗?我不确定应该放什么。 2.那个“RaycastCallback”代码将被放在哪里?现在我正在将其放在box2d / dynamics / b2World.js文件中,这样做是否正确/是否有关系?谢谢。 - Marcell
  1. 任何你想要的。例如,如果你想忽略传感器装置,你可以使用“if (fixture.IsSensor())”。
  2. 如果它在那里工作,我不认为这是个问题 :)
- iforce2d
很抱歉晚些才回来回答这个问题,但似乎我的方法并不完全正确。显然,我之前的测试用例并不完整。我该如何确保回调函数返回最近的对象和点?测试有点困难,因为我认为返回的对象是不确定的。有时我能得到最近的点,有时却不能。任何见解都将不胜感激。 - Marcell
请阅读手册中关于“光线投射”的部分:http://www.box2d.org/manual.html#_Toc258082976 或查看测试示例:https://code.google.com/p/box2d/source/browse/trunk/Box2D/Testbed/Tests/RayCast.h 或者这个教程:http://www.iforce2d.net/b2dtut/world-querying - iforce2d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接