如何在更改一些 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() 之外,您不需要任何其他东西。
我们可以在 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() 之外,您不需要任何其他东西。