Как контролировать список тел, обновляемых в функции world.step - PullRequest
0 голосов
/ 11 апреля 2019

Я интегрирую версию Javascript Box2d или plank.js со своей собственной библиотекой (пространственная координата).У меня есть список / массив, который постоянно меняет каждый цикл перед вызовом world.step .(Причина, по которой мне нужно ограничить то, что обновляется в world.step, заключается в том, что мир должен быть бесконечным)

Я пытался передать этот массив тел в функции world.step , но для этого нет точки входа.

Я также думал о попытке изменить некоторую переменную, такую ​​как this.m_bodyList или b.getNext (), но я не думаю, что они будут работать.

Я даже думал о добавлении тел, затем вызове world.step, а затем об удалении этих тел.

Функция world.step выглядит следующим образом:

World.prototype.step = function(timeStep, velocityIterations, positionIterations) {
    if ((velocityIterations | 0) !== velocityIterations) {
        // TODO: remove this in future
        velocityIterations = 0;
    }
    velocityIterations = velocityIterations || this.m_velocityIterations;
    positionIterations = positionIterations || this.m_positionIterations;
    // TODO: move this to testbed
    this.m_stepCount++;
    // If new fixtures were added, we need to find the new contacts.
    if (this.m_newFixture) {
        this.findNewContacts();
        this.m_newFixture = false;
    }
    this.m_locked = true;
    s_step.reset(timeStep);
    s_step.velocityIterations = velocityIterations;
    s_step.positionIterations = positionIterations;
    s_step.warmStarting = this.m_warmStarting;
    s_step.blockSolve = this.m_blockSolve;
    // Update contacts. This is where some contacts are destroyed.
    this.updateContacts();
    // Integrate velocities, solve velocity constraints, and integrate positions.
    if (this.m_stepComplete && timeStep > 0) {
        this.m_solver.solveWorld(s_step);
        // Synchronize fixtures, check for out of range bodies.
        for (var b = this.m_bodyList; b; b = b.getNext()) {
            // If a body was not in an island then it did not move.
            if (b.m_islandFlag == false) {
                continue;
            }
            if (b.isStatic()) {
                continue;
            }
            // Update fixtures (for broad-phase).
            b.synchronizeFixtures(); 
        }
        // Look for new contacts.
        this.findNewContacts();
    }
    // Handle TOI events.
    if (this.m_continuousPhysics && timeStep > 0) {
        this.m_solver.solveWorldTOI(s_step);
    }
    if (this.m_clearForces) {
        this.clearForces();
    }
    this.m_locked = false;
};

Мне просто нужен world.step только для обработки тел / столкновений в текущем списке тел, который может видеть камера в моей библиотеке.

РЕДАКТИРОВАТЬ:

Есть ли способЯ могу сделать пользовательскую функцию, которая обновляет только одно тело?

...