Papervision3d Children meghatározása hibás


 Sziasztok!
Papervision3d 1.5.1 komponenst használok. Letölthető itt->Letöltés
Csináltam egy egyszerű példát az egyszerűség kedvéért amiben demonstrálom, hogy mi is a problémám.
Itt a tesztverzió róla ->Példaprogram futási időben
A program kódja:
Van egy "scene3d" nevő Collada scene a stage-n.
import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.components.as3.flash9.PV3DColladaScene;
import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.events.FileLoadEvent; import org.papervision3d.scenes.InteractiveScene3D; import flash.display.MovieClip;
import GlobalValtozok2;
stop();
scene3d.addEventListener(PV3DColladaScene.SCENE_COMPLETE, init); var group:DisplayObject3D = new DisplayObject3D("group");
scene3d.addEventListener(PV3DColladaScene.SCENE_LOAD_PROGRESS, handleProgress); scene3d.addEventListener(PV3DColladaScene.SCENE_LOAD_ERROR, handleLoadError);
function init(...rest):void {
group.addChild(scene3d.collada); scene3d.scene.addChild(group); scene3d.scene.removeChild(scene3d.collada); group.z=-4900; //A model megfelelő távolságra tétele
stage.addEventListener(Event.ENTER_FRAME, handleFrames);
kijelez.text=kijelez.text+ " "+scene3d.collada.childrenList(); //Kiíratom a Gyerek listát
var my3DObject:DisplayObject3D = scene3d.collada.getChildByName("Model"); //A Model nevű gyerekhez event hozzáadás
my3DObject.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, handleObjectClick); my3DObject.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, handleObjectOver); my3DObject.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, handleObjectOut); }
//Forgatás function handleFrames(e:Event):void { group.yaw(10); }
// COLLADA Scene event handlers =================================== function handleProgress(e:FileLoadEvent):void { trace("Betöltés",Math.floor(e.bytesLoaded/e.bytesTotal)*100); }
function handleLoadError(e:FileLoadEvent):void { trace("Collada load error", e.file, e.message); }
function handleObjectOut(e:InteractiveScene3DEvent):void { trace("out"); }
function handleObjectOver(e:InteractiveScene3DEvent):void { trace("over"); }
function handleObjectClick(e:InteractiveScene3DEvent):void { trace("click"); }
A problémám, hogy miont látható és a futási időben a példán is sárgával kiírattam a scene3d.collada gyermekeit. Utána a scene3d.collada.getChildByName("Model"); utasítással és utána pár soron át próbálok eventet adni a Model nevű gyermekhez, mivel gondoom ez lenne a borosüveg. Például hogy fölé viszem az egeret stb... Csakhogy nem történik semmi... Külföldön is utána néztem példa programokban , pedig ezt így kell. Ki is írja hogy ott a Model nevű gyermek , mégsem adja hozzá az eventeket... :/ ötlet?
Forrás file esetleg itt letölthető : Forrás file ZIP
Köszönöm előre is!
Üdv. |
Így ránézésre teljesen jó a kód.
Viszont, amit hozzácsatolsz Material objektumot az üvegedhez, annak kell lennie egy interactive tulajdonságának, és azt állítsd true-ra.
Utána már működni fognak az eseménykezelőid.
Üdv. Laci |
Hello, név szerint melyikre gondolsz? Nem tudom most mire gondolsz és hol lehetne állítani.
Mert így próbáltam - bár nem tudom jónak e:ú
for each(var mat:MaterialObject3D in scene3d.collada.materials.materialsByName) { mat.interactive = true; }
De ehhez be kell importálni a import org.papervision3d.core.proto.MaterialObject3D; de ezt nem lehet a komponensnél... |
"nem" fog segíteni, de:
én is próbáltam utánanézni, szerintem is olyasmi lehet a gond, amit tlaci2006 írt, hogy az "InteractiveScene3DEvent"-hez az adott material-(oka)t interaktívvá kell tenni, én próbáltam a komponens példányban a "Mat" alatt "felülírni a collada file-ban definiált anyagot, de nekem nem sikerült, illetve, ha kiírattam a my3DObject (a Model) tulajdonságait, illetve lekérdeztem a materialList-et nekem mindig null jött vissza... én nem is értem, hogy...
esetleg, ha nem (ezt) a komponenst használnád, hanem "csak" szkript szinten (igaz, hogy így nem látod a szerkesztőben, de) kezelnéd?
nekem CS3-alatt azzal is gondom volt, hogy túl nagy (pixelméretben) a texturához való jpg, szerkesztés közben is sokszor fagyott (legális CS3), ezért kisebbre vettem...
bocs, hogy belepofáztam, de sokszor jól jön, ha az ember tudja "nincs egyedül", |
| Hát, ha végképp nem lesz megoldás, áttérek a script verzióra... De olyan nincs, hogy ne legyen megoldás :) |
Megcsináltam scriptből, de az obj1.materials null-t ad vissza, pedig szükségem lenne rá, hogy kiírassam , mivel az interactivva tételhez kell a neve . (getMaterialByName)
import org.papervision3d.objects.*; import org.papervision3d.objects.parsers.*; import org.papervision3d.view.*;
import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.cameras.CameraType;
var view: BasicView = new BasicView(320, 240,false,false,"Free");
scene3d.addChild(view); //Hozzáadás a movicelcliphez var obj1: Collada = new Collada("bor2.dae"); //obj1.x = 1000; obj1.z =-2900; obj1.scale = 0.342; view.scene.addChild(obj1);
obj1.addEventListener(FileLoadEvent.LOAD_COMPLETE, modelLoaded);
view.cameraAsCamera3D.z=-8389.61038961039; view.cameraAsCamera3D.focus=1974.6753246753246; view.cameraAsCamera3D.zoom = 0.41;
function enterFrame(aEvent: Event): void { obj1.yaw(5);
view.singleRender(); }
function modelLoaded(e:FileLoadEvent):void { trace("Materialok kiiratasa: " + obj1.materials); }
addEventListener(Event.ENTER_FRAME, enterFrame);
//obj1.getMaterialByName("texture0_jpg").interactive = true;
//obj1.getChildByName("Model", true).addEventListener //(InteractiveScene3DEvent.OBJECT_CLICK, katt);
function katt(e:InteractiveScene3DEvent):void { trace("click"); }
|
obj1.collada.materials vagy obj1.scene.materials?
Én Papervision 2.0-át használok, ott kicsit megint másabbak a történések...  |
Ezt Papervision3D_2.1.932-ben írtam .... És neked van papervision 2.0-ban működő eseménykezelőd? Megosztanád esetleg? Mert ez így nem működik ahogy leírtad.
Esetleg az én kódomat átültetve papervision2.0-ba. Bár nem hiszem , hogy olyan nagy különbség lenne. |
Mondjuk én még Collada-val nem dolgoztam kifejezetten.
De amint lesz időm, hamarosan utánanézek megígérem. |
szerintem:
1) a view-dat rossz paraméterrel hoztad létre, a BasicView() konstruktorának a 3. paramétere felel az "interaktivitás" lehetőségéért, azaz
var view: BasicView = new BasicView(320, 240, false, true, "Free");
2) megnéztem a Collada osztály definíciójánál: a getMaterialsList()-tel tudod a materialokat lekérdezni, azaz
trace("Materialok kiiratasa: " + obj1.getMaterialsList());
a múltkor közzétett bor2.dae file-odat használva ez alapján "material0-effect_1" a materiálod neve, azaz ("bedrózozva")
obj1.getMaterialByName("material0-effect_1").interactive = true;
3) ellenőrizve (rekurzívan bejárva) a betöltött file-odat szerintem rossz objektumra kötöd az eseménykezelőt, nem a "Model"-hez kell kötni, hanem a "mesh1"-hez,
ha jól látom a dae-t, akkor ez ("mesh1") csak a geometria benne, mintha a "Model"-ed egy group/dummy object/null (nem tudom, hogy az általad használt 3dsMax-ban mi a terminológia rá) lenne és ennek a gyereke lenne a "mesh1"?
azaz elképzelhető, ha pld. a palackot úgy modelleznéd ki, hogy maga a palack csak egy (üres) group, aminek van két gyereke az üveg teste és a dugó, akkor sajnos mind a kettőre meg kell adnod az eseménykezelőt, nem elég a groupra (sőt arra felesleges(?) is, mert nincs geometriája), azaz egy komplex modellnél, ha azt szeretnéd, hogy minden "alkatrésze" reagáljon, akkor pld. rekurzívan bejárva az összes geometriára egyenként meg kell adnod az eseménykezelőt, ebben nem vagyok biztos, csak gyanítom, sajnos nincs a gépemen semmilyen 3d-s program, még Blender sem, szóval kipróbálni nem tudom,
továbbá szerintem az eseménykezelőt csak akkor definiálhatod, ha már betöltődött/létrejött a modelled, azaz a "modelLoaded()" törzsében
obj1.getChildByName("mesh1", true).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, katt);
ezeket a módosításokat elvégezve nálam működik (kipróbáltam az általad használt Papervision3D_2.1.932-vel) |
Szia, megírtam az álltalad javasolt módszert, és működik, a megoldás:
import org.papervision3d.objects.*; import org.papervision3d.objects.parsers.*; import org.papervision3d.view.*; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.events.FileLoadEvent; import org.papervision3d.cameras.CameraType;
var view: BasicView = new BasicView(320, 240,false,true,"Free");
var obj1: Collada = new Collada("bor2.dae"); //obj1.x = 1000; obj1.z =-2900; obj1.scale = 0.342; view.scene.addChild(obj1); scene3d.addChild(view); //scene3d egy movieclip
view.cameraAsCamera3D.z=-8389.61038961039; view.cameraAsCamera3D.focus=1974.6753246753246; view.cameraAsCamera3D.zoom = 0.41;
obj1.addEventListener(FileLoadEvent.LOAD_COMPLETE, modelLoaded) stage.addEventListener(Event.ENTER_FRAME, enterFrame);
function enterFrame(aEvent: Event): void { obj1.yaw(5); view.singleRender(); }
function modelLoaded(e:FileLoadEvent):void { trace("Materialok kiiratasa: " + obj1.getMaterialsList()); obj1.getMaterialByName("material0-effect_1").interactive = true;
obj1.getChildByName("mesh1", true).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, katt);
}
function katt(e:InteractiveScene3DEvent):void { trace("click"); }
Ezen soroknak:
obj1.getMaterialByName("material0-effect_1").interactive = true;
obj1.getChildByName("mesh1", true).addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, katt); a model loaded-be kellett kerülni :) Köszi a segítséget mindenkinek, de neked jár a pont, tLacinak is köszönöm. |
|