如何在更改一些 JS 变量后更新 BabylonJS 场景?

How to update BabylonJS scene after changing some JS variables?

我们可以在 Babylon.JS 中渲染场景,从表单字段中读取 position/scale 等值。但它是否允许在输入字段中更改场景监听实时更改,如 $('input').val().

var cusotm_position = $('input').val();
canvas = document.getElementById("renderCanvas");
engine = new BABYLON.Engine(canvas, true);
scene = createScene(); //draws a mesh at custom_position 
engine.runRenderLoop(function () {
    scene.render();
});

$("input").change(function(){
    cusotm_position = $('input').val();
    scene.render();//doesn't seem to be updating the mesh to new value of custom_position
});

我尝试调用 scene.render(); 输入变化的事件侦听器,但似乎没有任何作用。是否有类似 refrest/update 的内容可以更改为更新的变量值。如果这可以在不删除所有内容并重新创建新场景的情况下完成,那就更好了。

需要更新mesh位置,让下一个render()自己刷新渲染

因此,当您调用 createScene() 时,保存要更新的网格对象并在更改事件中进行必要的更改。

调用 BABYLON.AbstractMesh 对象(以及任何网格)的 .computeWorldMatrix() 方法就像它在锡上所说的那样 - 强制重新计算对象的变换矩阵。

但实际问题似乎是您的代码没有按您认为的那样进行。这一点:

scene = createScene(); //draws a mesh at custom_position

由于您稍后在同一个场景对象上调用 .render(),因此您的 createScene() 函数 returns 您的主场景,而且它似乎是您为网格分配位置的唯一地方(通过顺便说一句,你最好在你的问题中提供该功能的代码,因为此时我不确定它是否真的做了任何事情)。所以除非你在每一帧都调用它(因为我没有看到它在渲染循环中被调用,我假设你没有),你永远不会为你的网格分配那个值。

您需要做的是:

1) 获取对您的网格的引用。可以这样做:var your_mesh = scene.getMeshById("your_mesh_id");

2) 获取您作为 BABYLON.Vector3 的位置:var custom_position = new BABYLON.Vector3(value_for_x, value_for_y, value_for_z);

3) 给网格分配位置:your_mesh.position = custom_position;

此时,除了渲染循环中调用的 scene.render() 之外,您不需要任何其他东西。