You are hereForums / Papervision3D / Question and Answer / Collada interactivity

Collada interactivity


By tjuro - Posted on 23 July 2008

Question about getting a Collada file to recognize mouse clicks: I've created a PV3D2 scene with a Plane and a Collada object, both of which use MovieAssetMaterials. The Plane's interactivity (OBJECT_CLICK) works great, as expected and demonstrated in various web tutorials. However, the Collada object, (which uses a MaterialsList containing the MovieAssetMaterial, rather than applying a single material) doesn't seem to recognize the mouse click, even though it's implemented pretty much the same way as the Plane (other than the MaterialsList). The materials for both objects appear properly, so they appear to implemented correctly. And yes, I did set the 'interactive' property of each material to 'true'. Any ideas why the Collada object isn't recognizing the mouse click would be greatly appreciated. I'd be happy to provide the source if that'll help. Thanks - sites like this are a great help to those of us trying to learn PV3D, since as far as I can tell, no books are available yet. Todd
  1. package {
  2. import flash.display.Sprite;
  3. import flash.events.Event;
  4.  
  5. import org.papervision3d.cameras.Camera3D;
  6. import org.papervision3d.view.Viewport3D;
  7. import org.papervision3d.scenes.Scene3D;
  8. import org.papervision3d.render.BasicRenderEngine;
  9. import org.papervision3d.events.*;
  10.  
  11. import org.papervision3d.objects.primitives.*;
  12. import org.papervision3d.objects.DisplayObject3D;
  13. import org.papervision3d.objects.parsers.Collada;
  14.  
  15. import org.papervision3d.materials.utils.MaterialsList;
  16. import org.papervision3d.materials.*;
  17.  
  18. public class erl_webscape3D extends Sprite {
  19. private var viewport:Viewport3D;
  20. private var scene:Scene3D;
  21. private var camera:Camera3D;
  22. private var renderer:BasicRenderEngine;
  23.  
  24. private var groundPlane:Plane;
  25. private var dome:Collada;
  26. private var pgPlane:Plane;
  27.  
  28. private var gmat:MovieAssetMaterial;
  29. private var dome_material:MovieAssetMaterial;
  30. private var people_material:MovieAssetMaterial;
  31.  
  32. public function erl_webscape3D() {
  33. initPapervision3D();
  34.  
  35. createGroundPlane();
  36. createDome();
  37. createPeoplePlane(2);
  38.  
  39. beginRender();
  40. }
  41.  
  42. // *********** INITIALIZATION ************
  43.  
  44. private function initPapervision3D():void {
  45. // create the viewport
  46. viewport = new Viewport3D(0, 0, true, true);
  47. addChild(viewport);
  48. viewport.buttonMode = true;
  49.  
  50. // create the scene
  51. scene = new Scene3D();
  52.  
  53. // create a camera
  54. camera = new Camera3D();
  55. camera.y = 60;
  56. camera.z = -1000;
  57. camera.zoom = 6;
  58.  
  59. // create the renderer
  60. renderer = new BasicRenderEngine();
  61. }
  62.  
  63. // *********** OBJECT CREATION ************
  64.  
  65. private function createGroundPlane():void {
  66. gmat = new MovieAssetMaterial("worldmap");
  67. gmat.animated = true;
  68. gmat.smooth = true;
  69. gmat.interactive = true;
  70.  
  71. // width, height
  72. var w:Number = 1200;
  73. var h:Number = 600;
  74.  
  75. // segments
  76. var sW:Number = 16;
  77. var sH:Number = 8;
  78.  
  79. groundPlane = new Plane(gmat, w, h, sW, sH);
  80. scene.addChild(groundPlane);
  81. groundPlane.z = -840;
  82. groundPlane.rotationX = -90;
  83.  
  84. groundPlane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onPress);
  85.  
  86. }
  87.  
  88. private function createDome():void {
  89. var domeMatsList:MaterialsList = new MaterialsList();
  90.  
  91. //BitmapFileMaterial, doubleSided draws the color on both sides of the geometry normals
  92. dome_material = new MovieAssetMaterial("lightStreaks", true);
  93. dome_material.animated = true;
  94. dome_material.doubleSided = true;
  95. dome_material.movie.alpha = .33;
  96. dome_material.interactive = true;
  97.  
  98. domeMatsList.addMaterial(dome_material, "dome_material");
  99. // domeMatsList.addMaterial(dome_material);
  100.  
  101. dome = new Collada("dome.dae", domeMatsList, .02);
  102. scene.addChild(dome);
  103. dome.y = 2;
  104. dome.z = -800;
  105. dome.scale = .2;
  106.  
  107. dome.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onPress);
  108.  
  109. }
  110.  
  111. private function onPress(e:InteractiveScene3DEvent):void {
  112. trace ("pressing!!!! target = " + e.target.name);
  113. dome.visible = false;
  114. }
  115.  
  116. // create People Planes, then group them
  117. private function createPeoplePlane(groupNum:Number):void {
  118.  
  119. var pg:String = "people" + groupNum;
  120. // var pg:String = "people1";
  121. people_material = new MovieAssetMaterial(pg, true);
  122. people_material.doubleSided = true;
  123. people_material.interactive = true;
  124. people_material.smooth = true;
  125.  
  126. var w:Number = 25;
  127. var h:Number = 25;
  128.  
  129. // segments
  130. var sW:Number = 4;
  131. var sH:Number = 4;
  132.  
  133. for (var i:Number = 0; i < 2; i++) {
  134. pgPlane = new Plane(people_material, w, h, sW, sH);
  135. scene.addChild(pgPlane);
  136.  
  137. pgPlane.x = Math.round(Math.random() * 10 - 5);
  138. pgPlane.y = 15;
  139. pgPlane.z = -800;
  140. pgPlane.rotationY = Math.round(Math.random() * 60 - 30);
  141. }
  142. }
  143.  
  144. // *********** RENDERING ************
  145.  
  146. private function beginRender():void {
  147. // calls the render function every frame
  148. addEventListener(Event.ENTER_FRAME, render);
  149. }
  150.  
  151. private function render(e:Event):void {
  152.  
  153. var buf:Number = 80;
  154. var camMargin:Number = 100;
  155. var diff:Number;
  156. var dmove:Number;
  157. var nmove:Number;
  158. var camPosX:Number;
  159.  
  160. camPosX = camera.x + (((stage.mouseX-(stage.stageWidth * .5))*2)-camera.x )*.01;
  161.  
  162. // if camera is close to either display limit, buffer the move so it stops moving at the limit
  163. diff = Math.floor(100 - Math.abs(camPosX));
  164. if (diff < buf) {
  165. dmove = camPosX - camera.x;
  166. nmove = dmove * (diff / 100);
  167. camPosX = camera.x + nmove;
  168. }
  169.  
  170. camera.x = camPosX;
  171.  
  172. renderer.renderScene(scene, camera, viewport);
  173. }
  174. }
  175. }
  176. </code
You should see this: http://www.nabble.com/InteractiveScene3DEvent-and-dae-models-td15850889.... "You need to attach the event to a child of the DAE object, not to the DAE object directly. It is a bit quirky getting down to the name of the child - you need to attach a Event.COMPLETE to your DAE, and within it try trace myDAE.childrenList() to get the name of the first object in your DAE, then myDAE.getChildByName("name of the first object in your DAE").childrenList() and so on until you reach the innermost object." 2 things must be done 1. dome_material.interactive = true; - this you have 2. dome.getChildByName("name of the first object in your DAE")addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onPress);
This is great info - Thanks! I'll try it tonight. I really appreciat the detailed reply.