首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装卸新模型

装卸新模型
EN

Stack Overflow用户
提问于 2010-12-03 06:28:33
回答 1查看 377关注 0票数 0

我很抱歉,如果这个问题已经发布过,我根本无法找到解决我的小问题的办法。

我正在使用pv3d为一个学校项目加载几个模型。模型通常不做什么,他们只是旋转在一个刻度盘,当点燃。

在任何给定的时间里,只显示了两个模型。我最初的想法是利用两个全局Collada实例,并有一个函数调用Collada函数将新模型加载到实例中。从Collada解析器中可以看出,load函数似乎附加了新的模型,将现有的模型放在那里,而不是在一个新的顶点集合中加载。

当然可以。此时,我决定将模型从场景中移除,并在每次函数触发时创建新模型。

这是我的问题所在。这可能是因为我对AS3/pv3d的工作缺乏了解,所以请容忍我。当我从场景中移除模型并再次添加它们时,模型不会出现在场景中。但是,当我运行跟踪时,模型实例仍然是可跟踪的。

这是供参考的代码。我省略了重复的部分。

实例是在全局级别上创建的,因为如果我在任何其他级别上创建它,onRenderTick似乎无法引用它

代码语言:javascript
复制
public var model:Collada = new Collada();
public var model2:Collada = new Collada();

在创建时设置初始属性,如x、y位置和螺距。

代码语言:javascript
复制
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()加载模型

代码语言:javascript
复制
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;
   }
  }

_adds将加载的守护程序放到场景中,自我解释的

代码语言:javascript
复制
  public function daeLoaded(e:FileLoadEvent):void {
   e.target.removeEventListener(FileLoadEvent.LOAD_COMPLETE, daeLoaded);
   scene.addChild(DisplayObject3D(e.target));
  }

在从场景中删除模型时调用initNewModels(),以添加新的模型

代码语言:javascript
复制
  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(模型)时,这个项目不应该是可跟踪的,但它仍然是可跟踪的。

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

我宁愿自己解决这个问题,因为这似乎是一个相当简单的问题,但我的最后期限即将到来,我不应过多地谈论一些事情。我很感谢你的帮助。非常感谢你把这个看完!

EN

回答 1

Stack Overflow用户

发布于 2010-12-05 20:05:36

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

对于您正在做的事情,您应该真正地关注AS3中的面向对象编程,因为您正在重复大量的代码。您应该能够更多地使用一些简单的OOP和XML文件(或用于配置的数组)来避免此类错误!

希望能帮上忙..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4343039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档