如果以前发过这个问题我很抱歉,我根本无法找到解决我的小问题的方法。
我正在使用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函数创建新模型,因为在我看来这样做会导致其他函数无法呈现新模型(因此导致它不可见)。
我宁愿尝试自己解决这个问题,因为这似乎是一个相当简单的问题,但我的截止日期即将到来,我不应该花太多时间。我感谢任何帮助。非常感谢您顺利通过!
答案 0 :(得分:0)
在initNewModels()
函数中,您重新声明model
和model2
变量,因此您不使用全局范围的Collada实例,而是使用新的函数范围变量。
对于你正在做的事情,你应该真正看看AS3中的面向对象编程,因为你复制了很多代码。你应该能够更多产,并通过一些简单的OOP和XML文件(或配置数组)来避免这些错误!
希望它有所帮助...