Загрузка и выгрузка новых моделей - PullRequest
0 голосов
/ 03 декабря 2010

Приношу свои извинения, если этот вопрос был опубликован ранее, я просто не могу найти решение моей маленькой проблемы.


Я использую 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, так как мне кажется, что выполнение этого способа приведет к тому, что другие функции не смогут отображать новые модели (следовательно, они не будут видны).

Я бы предпочел попытаться выяснить это самостоятельно, поскольку это кажется довольно простым вопросом, но мой срок приближается, и я не должен останавливаться на чем-то слишком долгом. Я ценю любую оказанную помощь. Большое спасибо за просмотр этого!

1 Ответ

0 голосов
/ 05 декабря 2010

В функции initNewModels() вы повторно объявляете переменные model и model2, поэтому вы работаете не с экземплярами Collada глобальной области действия, а с новыми переменными области действия функции.

Для чеговы делаете, вы должны действительно взглянуть на объектно-ориентированное программирование в AS3, потому что вы дублируете много кода.Вы должны быть более продуктивными и избегать подобных ошибок с помощью простого ООП и, возможно, XML-файла (или массива для настройки)!

Надеюсь, это поможет ...

...