2010-12-03 4 views
0

Toutes mes excuses si cette question a déjà été publiée, je ne peux simplement pas trouver la solution à mon petit problème. J'utilise pv3d pour charger un couple de modèles pour un projet d'école. Les modèles ne font généralement pas grand-chose, ils tournent simplement sur un cadran lorsqu'ils sont allumés.Chargement et déchargement de nouveaux modèles

À un moment donné, seuls deux modèles sont représentés. Ma pensée initiale est d'utiliser deux instances Collada globales et d'avoir une fonction appelée la fonction de chargement Collada pour charger les nouveaux modèles dans les instances. En regardant à travers l'analyseur Collada, il semblerait que la fonction de chargement ajoute le nouveau modèle, laissant les modèles existants vers le haut, plutôt que de charger dans un nouvel ensemble de sommets.

Assez juste. À ce stade, je décide que je devrais retirer les modèles de la scène, et en créer de nouveaux à chaque fois que la fonction se déclenche.

Voici où se trouve mon problème. C'est probablement dû à mon manque de compréhension sur le fonctionnement de AS3/pv3d, alors s'il vous plaît, supportez-moi. Lorsque je retire les modèles de la scène et que je les rajoute, les modèles n'apparaissent pas dans la scène. Toutefois, les instances de modèle restent toujours traçables lorsque je cours une trace.

Voici le code de référence. J'ai omis les parties qui sont des doublons.

instances sont créées au niveau mondial que onRenderTick ne peut pas sembler faire référence si je crée sur un autre niveau

public var model:Collada = new Collada(); 
public var model2:Collada = new Collada(); 

Les propriétés initiales telles que la position et la hauteur xy sont réglées lorsque les cadrans sont créés

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); 
    } 

Après les cadrans sont configurés, les modèles sont chargés à l'aide 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; 
    } 
    } 

_adds les Daes chargés sur la scène, explicite

public function daeLoaded(e:FileLoadEvent):void { 
    e.target.removeEventListener(FileLoadEvent.LOAD_COMPLETE, daeLoaded); 
    scene.addChild(DisplayObject3D(e.target)); 
    } 

initNewModels() est appelé lors du retrait des modèles de la scène, pour ajouter de nouveaux modèles

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 

À ce stade, en utilisant ce code, ce qui se passe est que les modèles se chargent d'abord bien sur le premier clic. Lorsque j'essaie de charger les modèles suivants, les cadrans tournants restent, mais les modèles ne sont pas visibles. Cependant, ils sont traçables quand je cours une trace, en me renvoyant leurs coordonnées x, y, z.

Mes questions sont les suivantes:

a) Y at-il une autre façon de supprimer complètement le modèle de la scène?L'élément ne doit pas être traçable lorsque j'appelle scene.removeChild (modèle), mais c'est le cas.

b) Y a-t-il une meilleure façon d'aborder cela? Je ne devrais probablement pas créer les nouveaux modèles à partir de la fonction initNewModels, car il me semble que cela ferait en sorte que les autres fonctions seraient incapables de rendre les nouveaux modèles (ce qui les rendrait invisibles).

J'aurais préféré essayer de comprendre cela par moi-même car cela semble être un problème plutôt simple, mais mon échéance approche et je ne devrais pas m'attarder sur quelque chose de trop long. J'apprécie toute aide apportée. Merci beaucoup d'avoir regardé ça!

+0

réussi à résoudre le problème. il n'est pas nécessaire de re-déclarer la variable dans la fonction. Merci quand même! – Roy

Répondre

0

Dans la fonction initNewModels(), vous déclarez de nouveau les variables model et model2 afin de ne pas utiliser les instances Collada à portée globale mais avec de nouvelles variables de périmètre de fonction.

Pour ce que vous faites, vous devriez vraiment jeter un oeil à la programmation orientée objet dans AS3 parce que vous dupliquez beaucoup de code. Vous devriez être capable d'être plus prolifique et d'éviter ce genre d'erreurs avec de simples POO et peut-être un fichier XML (ou un tableau pour la configuration)!

Espérons que cela aide ...

Questions connexes