Почему Js изменяет переменные на Nan и портит другой вектор - PullRequest
0 голосов
/ 23 октября 2019

Итак, я новичок в Javascript, я стараюсь выучить его как можно быстрее, много разыскивая! Но я не могу найти какие-либо решения. Подводя итог, я пишу программу на Js, которая обнаруживает столкновения между шарами и обрабатывает их. Каждый шар имеет вектор «moveDirection», который представляет направление движения мяча, вектор положения, который сохраняет текущее положение мяча и скорость (скаляр). Все векторы имеют 3 переменные (x, y, z), и шар перемещается только в переменных x и z. Я пытаюсь справиться со столкновением между шарами в этой функции:

function reactToCollision(b1, b2) {
    let pos1 = b1.position.clone();
    let pos2 = b2.position.clone();
    let v1 = b1.moveDirection.clone();
    let v2 = b2.moveDirection.clone();

    let a = (v1.sub(v2)).dot((pos1.sub(pos2)));
    let b = Math.pow((pos1.sub(pos2)).length, 2);
    let c = (pos1.sub(pos2)).multiplyScalar(-a / b);
    b1.moveDirection.addScalar(c);

    let d = (v2.sub(v1)).dot(pos2.sub(pos1));
    let e = Math.pow((pos2.sub(pos1)).length, 2);
    let f = (pos2.sub(pos1)).multiplyScalar(-d / e);
    b2.moveDirection.addScalar(f);

    b2.velocity = b1.velocity;
}

Вот где я вызываю функцию:

function moveBall(ball, deltatime) {
    let ballCollided = collision(ball);
    if (ballCollided != null) {
        reactToCollision(ball, ballCollided);
        if (findBall(ballCollided.name) == null) {
            movingBalls.push(ballCollided.name);
        }
    }
    ball.position.x += ball.moveDirection.x * ball.velocity;
    ball.position.z += -ball.moveDirection.z * ball.velocity;
    ball.velocity -= deltatime * friction;
}

Проблема в том, что ball. position и x position.z теперь NaN, а вектор moveDirection теперь очень странный, например:

x: "-0.23202599585056305[object Object]"
y: "0[object Object]"
z: "0.9727095907821058[object Object]"

Я был бы очень признателен за чью-то помощь и терпение, которые помогут мне решить эту проблему! Большое спасибо, если вы зашли так далеко!

1 Ответ

1 голос
/ 23 октября 2019

Я не знаю, где у вас проблема, так как вы вызываете много разных методов, но вот несколько основных правил, которые могут испортить ваш код и привести к этим результатам:
Если вы выполняете какую-либо арифметическую операцию (кроме +) с числом и другими типами, тогда вы получите NaN например:

console.log(51 * 'hello');   // prints NaN
console.log(51 / undefined); // prints NaN
console.log(51 - {});        // prints NaN

+ немного отличается, здесь JS попытается преобразовать их в общий тип, которыйstring в нашем случае. Когда вы преобразуете объект в строку, вы получите '[object Object]', поэтому

console.log(53 + 'Hello'); // prints "53Hello"
console.log(53 + {});      // prints "53[object Object]"
console.log(53 + [1, 2]);  // prints "531,2" - [1, 2] is converted into '1,2'
...