Приношу свои извинения, если этот вопрос был опубликован ранее, я просто не могу найти решение моей маленькой проблемы.
Я использую pv3d для загрузки пары моделей для школьного проекта. Модели обычно мало что делают, они просто крутятся на циферблате при включении.
В любой момент времени показаны только две модели. Сначала я хотел использовать два глобальных экземпляра Collada и вызвать функцию, вызывающую функцию загрузки Collada, для загрузки новых моделей в экземпляры. При просмотре синтаксического анализатора Collada может показаться, что функция загрузки добавляет новую модель, оставляя там существующие модели, в отличие от загрузки в новом наборе вершин.
Достаточно справедливо. На этом этапе я решаю, что должен удалять модели со сцены и создавать новые при каждом срабатывании функции.
Здесь моя проблема. Это, вероятно, из-за моего непонимания работы AS3 / pv3d, поэтому, пожалуйста, потерпите меня. Когда я удаляю модели со сцены и добавляю их снова, модели не появляются внутри сцены. Однако экземпляры модели все еще остаются отслеживаемыми, когда я запускаю трассировку .
Вот код для справки. Я опустил части, которые являются дубликатами.
Экземпляры создаются на глобальном уровне, так как onRenderTick не может ссылаться на него, если я создаю его на любом другом уровне
public var model:Collada = new Collada();
public var model2:Collada = new Collada();
Исходные свойства, такие как положение x y и высота тона, задаются при создании циферблатов
public function setupDials():void {
var materialList:MaterialsList = new MaterialsList();
var bitmapFileMaterial:BitmapFileMaterial = new BitmapFileMaterial("assets/images/UV/marble.jpg");
materialList.addMaterial(bitmapFileMaterial, "all");
dial = new Collada("assets/Dial.dae", materialList);
dial2 = new Collada("assets/Dial.dae", materialList);
dial.scale = 2;
dial.x = 400;
dial.y = -100;
dial.pitch(-10);
dial2.scale = 2;
dial2.x = -400;
dial2.y = -100;
dial2.pitch(-10);
scene.addChild(dial);
scene.addChild(dial2);
// run once only
model.x = 450;
model.y = 100;
model.pitch(-10);
model2.x = -450;
model2.y = 100;
model2.pitch(-10);
}
После установки циферблатов модели загружаются с помощью loadAnimals ()
public function loadAnimals(param1:String):void {
if (!first) {
scene.removeChild(model);
scene.removeChild(model2);
initNewModels();
} // end if
first = false;
model.addEventListener(FileLoadEvent.LOAD_COMPLETE, daeLoaded);
model2.addEventListener(FileLoadEvent.LOAD_COMPLETE, daeLoaded);
if (param1 == "environment1") {
var leopardMats:MaterialsList = new MaterialsList();
var bitmapFileMaterial:BitmapFileMaterial = new BitmapFileMaterial(textures[0]);
leopardMats.addMaterial(bitmapFileMaterial, "all");
model.load("assets/Leopard.dae", leopardMats);
model.scale = 2;
var wolverineMats:MaterialsList = new MaterialsList();
var bitmapFileMaterial2:BitmapFileMaterial = new BitmapFileMaterial(textures[1]);
wolverineMats.addMaterial(bitmapFileMaterial2, "all");
model2.load("assets/Wolverine.dae", wolverineMats);
model2.scale = 0.7;
}
else if (param1 == "environment2") {
var markhorMats:MaterialsList = new MaterialsList();
var markhorFileMaterial:BitmapFileMaterial = new BitmapFileMaterial(textures[4]);
markhorMats.addMaterial(markhorFileMaterial, "all");
model.load("assets/Markhor.dae", markhorMats);
model.scale = 2;
var oryxMats:MaterialsList = new MaterialsList();
var oryxFileMaterial:BitmapFileMaterial = new BitmapFileMaterial(textures[5]);
oryxMats.addMaterial(oryxFileMaterial, "all");
model2.load("assets/Oryx.dae", oryxMats);
model2.scale = 10;
}
}
_добавляет загруженных daes на сцену, само за себя
public function daeLoaded(e:FileLoadEvent):void {
e.target.removeEventListener(FileLoadEvent.LOAD_COMPLETE, daeLoaded);
scene.addChild(DisplayObject3D(e.target));
}
initNewModels () вызывается при удалении моделей со сцены для добавления новых моделей
public function initNewModels():void {
var model:Collada = new Collada();
var model2:Collada = new Collada();
model.x = 450;
model.y = 100;
model.pitch(-10);
model2.x = -450;
model2.y = 100;
model2.pitch(-10);
} // end initModels function
На данном этапе, используя этот код, происходит то, что модели изначально нормально загружаются при первом нажатии. Когда я пытаюсь загрузить последующие модели, вращающиеся циферблаты остаются, но моделей нигде не видно. Однако они отслеживаются, когда я запускаю трассировку, возвращая мне их координаты x, y, z.
Мои вопросы:
а) Есть ли другой способ полностью удалить модель со сцены? Элемент не должен быть отслеживаемым, когда я вызываю scene.removeChild (model), но все же он есть.
б) Есть ли лучший способ приблизиться к этому? Я, вероятно, не должен создавать новые модели из функции initNewModels, так как мне кажется, что выполнение этого способа приведет к тому, что другие функции не смогут отображать новые модели (следовательно, они не будут видны).
Я бы предпочел попытаться выяснить это самостоятельно, поскольку это кажется довольно простым вопросом, но мой срок приближается, и я не должен останавливаться на чем-то слишком долгом. Я ценю любую оказанную помощь. Большое спасибо за просмотр этого!