Создать сетку перед рендерингом в babylon.js

Я хочу создать новую сетку перед каждым рендером, вот мой код (минимальная демонстрация):

let canvas,
    engine,
    camera,
    scene;

function initEngine(){
    canvas = document.getElementById("renderCanvas");
    engine = new BABYLON.Engine(canvas, true);
}

function createScene(){
    initEngine();

    let scene = new BABYLON.Scene(engine);

    camera = new BABYLON.ArcRotateCamera("camera", Math.PI / 2, Math.PI / 2, 4, BABYLON.Vector3.Zero(), scene);
    camera.attachControl(canvas, true);


    let light1 = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0,1,0), scene);

    let ground = BABYLON.MeshBuilder.CreateGround(
        "ground",
        {
            width:30,
            height:30
        },
        scene
    );

    ground.position.y -= 0.5;

    let sphere1 = BABYLON.MeshBuilder.CreateSphere(
        "sphere1",
        {

        },
        scene
    );

    let sphere2 = sphere1.clone("sphere2");
    let sphere3 = sphere1.clone("sphere3");

    sphere1.position.z = -18;
    sphere2.position.z = -19;
    sphere3.position.z = -20;

    let snake = [
        sphere1,
        sphere2,
        sphere3
    ];

    (function(){
        let counter = 4;
        scene.registerBeforeRender(function(){
            let newOne = BABYLON.MeshBuilder.CreateSphere(
                "sphere" + counter,
                {

                },
                scene
            );
            let head = snake[0];
            newOne.position = head.position;
            newOne.position.x += 0.02;
            snake.unshift(newOne);
            ++counter;
        });
    })();

    window.addEventListener("resize", function(){
        engine.resize();
    });

    return scene;
}

scene = createScene();

engine.runRenderLoop(function(){
    // box.position.z += 0.01;
    scene.render();
});

Мое ожидаемое поведение - создать серию сфер, каждая position.x немного выше, чем предыдущий. Однако после рендеринга в сцене есть только три сетки, например:

результат

Я хочу знать, что не так с моим кодом, и как правильно его реализовать?

Кстати, в чем разница между scene.removeMesh(mesh) а также mesh.dispose()?

1 ответ

Решение

Это из-за этого заявления.

newOne.position = head.position;

Это просто копия ссылки. поэтому теперь новая сфера и snake[0] совместно используют один и тот же экземпляр позиции, поэтому все вновь созданные сферы имеют один и тот же экземпляр позиции (удерживая ссылку на позицию) и находятся в одной и той же позиции.

Другие вопросы по тегам