【问题标题】:Loading and unloading new models加载和卸载新模型
【发布时间】:2010-12-03 06:28:33
【问题描述】:

如果这个问题之前已经发布过,我深表歉意,我根本无法找到解决我的小问题的方法。


我正在使用 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 坐标时,它们是可追溯的。

我的问题是:

a) 是否有另一种方法可以将模型从场景中完全移除?当我调用 scene.removeChild(model) 时,该项目不应该是可追踪的,但它是。

b) 有没有更好的方法来解决这个问题?我可能不应该从 initNewModels 函数创建新模型,因为在我看来这样做会导致其他函数无法呈现新模型(因此导致它不可见)。

我宁愿自己尝试解决这个问题,因为这似乎是一个相当简单的问题,但我的截止日期快到了,我不应该在某件事上纠结太久。我感谢提供的任何帮助。非常感谢您浏览此内容!

【问题讨论】:

  • 设法解决了这个问题。无需在函数中重新声明变量。还是谢谢!

标签: actionscript-3 papervision3d


【解决方案1】:

initNewModels() 函数中,您重新声明了 modelmodel2 变量,因此您不是使用全局范围的 Collada 实例,而是使用新的函数范围变量。

对于你正在做的事情,你真的应该看看 AS3 中的面向对象编程,因为你复制了很多代码。通过一些简单的 OOP 和 XML 文件(或用于配置的数组),您应该能够更加多产并避免此类错误!

希望对你有帮助...

【讨论】:

    猜你喜欢
    • 2021-08-09
    • 2014-01-10
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多