2017-09-25 5 views
0

Wir können eine Szene in Babylon.JS rendern, die Werte wie Position/Skala aus Formularfeldern liest. Aber erlaubt es Änderungen in Szenen zu machen, die Echtzeitänderungen in Eingabefeldern wie $('input').val() hören.Wie wird die BabylonJS-Szene aktualisiert, nachdem einige JS-Variablen geändert wurden?

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 
}); 

Ich versuchte scene.render(); auf Ereignis-Listener der Änderung des Eingangs zu nennen, aber das scheint nicht, etwas zu tun. Gibt es etwas wie refrest/update, um zu aktualisierten Variablenwerten zu wechseln? Besser, wenn das gemacht werden kann, ohne alles zu entfernen und neue Szenen neu zu erstellen.

Antwort

0

Der Aufruf der .computeWorldMatrix() -Methode des BABYLON.AbstractMesh-Objekts (und damit eines beliebigen Meshs) macht genau das, was es auf dem Kasten sagt - erzwingt die Neuberechnung der Transformationsmatrix des Objekts.

Aber das eigentliche Problem scheint zu sein, dass Ihr Code nicht tut, was Sie denken, dass es tut. Dieser Punkt:

scene = createScene(); // ein Netz an custom_position zieht

Da Sie später anrufen .render() auf der gleichen Szene Objekt, Ihre createScene() gibt Ihre Hauptszene, und es scheint der einzige Ort, wo Sie eine Position zuweisen Dein Netz (übrigens würdest du gut tun, um den Code für diese Funktion in deiner Frage zur Verfügung zu stellen, da ich an diesem Punkt nicht sicher bin, dass es wirklich irgendetwas davon tut). Wenn Sie also nicht jedes Bild aufrufen (und da ich es nicht in der Render-Schleife aufgerufen habe, nehme ich an, dass Sie das nicht tun), weisen Sie diesen Wert niemals Ihrem Mesh zu.

Was Sie tun müssen, ist:

1) einen Verweis auf Ihre Masche holen. Es kann so gemacht werden: var your_mesh = scene.getMeshById ("your_mesh_id");

2) Holen Sie sich Ihre Position als BABYLON.Vector3: var custom_position = neu BABYLON.Vector3 (value_for_x, value_for_y, value_for_z);

3) Position dem Mesh zuweisen: your_mesh.position = custom_position;

An diesem Punkt sollten Sie nichts mehr als die scene.render() in Render-Schleife aufgerufen haben.

0

Sie müssen die Netzposition aktualisieren und das nächste rendern() das Rendering selbst aktualisieren lassen.

Wenn Sie also createScene() aufrufen, speichern Sie das Netzobjekt, das Sie aktualisieren möchten, und nehmen Sie die erforderlichen Änderungen am Änderungsereignis vor.

Verwandte Themen