私は単純なthree.jsアプリケーションを作成しようとしていますが、JavaScriptのニュアンスに悩まされています。私は実際に例を見ないと問題を説明する方法を知らない:関数呼び出し後にJavascriptメンバーが更新されない
var Model = function() {
THREE.Object3D.call(this);
this.loadedMesh = null;
this.meshIsLoaded = false;
};
Model.prototype = {
constructor: Model,
load: function(path, mtlName, objName) {
var onProgress = function(xhr) {...};
var onError = function(err) {...};
THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader());
mtlLoader.setPath(path);
mtlLoader.load(mtlName, function(materials) {
materials.preload();
objLoader.setMaterials(materials);
objLoader.setPath(path);
objLoader.load(objName, function(object) {
object.position.set(0, -5, 10);
object.scale.set(5, 5, 5);
object.rotation.y = Math.PI; // 180 degrees
scene.add(object);
this.loadedMesh = object;
this.meshIsLoaded = true;
});
}, onProgress, onError);
}
};
このラッパーは、3つのモデルのコンテナにする必要があります。読み込みはうまくいきますが、モデルを変数に保存しようとすると、内部スコープの外に変更された内部メンバーはありません。
var spaceman = new Model();
spaceman.load("ACES/", "acesjustforroomshow.mtl", "acesjustforroomshow.obj");
...
function update() {
if (spaceman.meshIsLoaded)
spaceman.loadedMesh.rotation.x += 0.1;
}
私はアプリをデバッグし、モデルがロードされるまで待っていれば、私は内部のメンバーの上にマウスを置くことができ、それらが装着されているので、それは奇妙です。 spacemanオブジェクトの上にマウスを置くと、loadedMeshおよびmeshIsLoadedの値はデフォルトのままです。
私がここで理解していないプロトタイプのいくつかの側面はありますか?
すごいです!それがまさに問題でした。私は一時的な「それ」のアプローチで行きました。 – RomanLarionov