所有papervision里面primitives比如像plane,cube,sphere都可以直接应用InteractiveScene3DEvent这个事件,InteractiveScene3DEvent能使3D场景中的物体产生类似MC一样的点击事件。
但是导入的collada(dae)模型去不行,通过google和自己研究。其实要加入FileLoadEvent.LOAD_COMPLETE这个事件告诉flash模型已经导入然后通过getChildByName得到模型的节点,再在上面加入click事件等。
package {
import flash.display .Bitmap ;
import flash.events .MouseEvent ;
import flash.utils .ByteArray ;
import flash.net .URLRequest ;
import flash.display .Loader ;
import flash.display .BitmapData ;
import flash.events .Event ;
import org.papervision3d .events .InteractiveScene3DEvent ;
import org.papervision3d .materials .BitmapColorMaterial ;
import flash.display .Sprite ;
import flash.events .Event ;
import org.papervision3d .cameras .Camera3D ;
import org.papervision3d .objects .primitives .Plane ;
import org.papervision3d .render .BasicRenderEngine ;
import org.papervision3d .scenes .Scene3D ;
import org.papervision3d .view .Viewport3D ;
import org.papervision3d .objects .parsers .DAE ;
import org.papervision3d .events .FileLoadEvent ;
import org.papervision3d .objects .DisplayObject3D ;
import org.papervision3d .core .utils .Mouse3D ;
import flash.geom .Point ;
public class InteractiveCollada extends Sprite {
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera :Camera3D;
private var vMouse:Mouse3D;
private var renderer:BasicRenderEngine;
private var material:BitmapColorMaterial;
public function InteractiveCollada( ) {
init( ) ;
}
private function init( ) :void {
initPapervision( ) ;
initObjects( ) ;
initListeners( ) ;
}
private function initPapervision( ) :void {
viewport=new Viewport3D( 640 ,480 ,false ,true ) ;
addChild( viewport ) ;
scene = new Scene3D( ) ;
camera = new Camera3D( ) ;
renderer = new BasicRenderEngine( ) ;
}
private function initObjects( ) :void {
Mouse3D.enabled =true ;
vMouse=viewport.interactiveSceneManager .mouse3D ;
////
var obj_dae:DAE = new DAE( ) ;
obj_dae.load ( "c.DAE" ) ;
obj_dae.scale =40 ;
scene.addChild ( obj_dae) ;
obj_dae.addEventListener ( FileLoadEvent.LOAD_COMPLETE , compCollada) ;
function compCollada( event:Event) :void {
trace ( "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ) ;
trace ( "obj_dae.materials" +obj_dae.materials )
obj_dae.materials .getMaterialByName ( "cMaterial" ) .interactive =true ;
var dae_rootNode:DisplayObject3D=obj_dae.getChildByName ( "COLLADA_Scene" ) ;
var targetMesh:DisplayObject3D=dae_rootNode.getChildByName ( "C-Ext01" ) ;
trace ( "targetMesh" +targetMesh) ;
targetMesh.addEventListener ( InteractiveScene3DEvent.OBJECT_CLICK , mouseClick) ;
}
}
private function mouseClick( e :InteractiveScene3DEvent) :void {
trace ( "click" ) ;
var axis:Point=new Point( vMouse.x ,vMouse.y ) ;
trace ( axis.x + " / " + axis.y ) ;
}
private function initListeners( ) :void {
addEventListener( Event.ENTER_FRAME , onEnterFrame ) ;
}
private function onEnterFrame ( e :Event ) :void {
renderer.renderScene ( scene, camera , viewport ) ;
}
}
}
下面这个是普通的plane的效果
(Either JavaScript is not active or you are using an old version of Adobe Flash Player. Please install the newest Flash Player .)
package {
import org.papervision3d .events .InteractiveScene3DEvent ;
import org.papervision3d .materials .BitmapColorMaterial ;
import flash.display .Sprite ;
import flash.events .Event ;
import org.papervision3d .cameras .Camera3D ;
import org.papervision3d .objects .primitives .Plane ;
import org.papervision3d .render .BasicRenderEngine ;
import org.papervision3d .scenes .Scene3D ;
import org.papervision3d .view .Viewport3D ;
public class InteractiveScene3DEventOBJECT_PRESS extends Sprite {
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera :Camera3D;
private var renderer:BasicRenderEngine;
private var material:BitmapColorMaterial;
private var plane:Plane;
public function InteractiveScene3DEventOBJECT_PRESS( ) {
init( ) ;
}
private function init( ) :void {
initPapervision( ) ;
initMaterials( ) ;
initObjects( ) ;
initListeners( ) ;
}
private function initPapervision( ) :void {
viewport=new Viewport3D( 300 ,300 ,false ,true ) ;
addChild( viewport ) ;
scene = new Scene3D( ) ;
camera = new Camera3D( ) ;
renderer = new BasicRenderEngine( ) ;
}
private function initMaterials( ) :void {
material=new BitmapColorMaterial( 0xcc0000) ;
material.doubleSided =true ;
material.interactive =true ;
}
private function initObjects( ) :void {
plane=new Plane( material,500 ,500 ) ;
scene.addChild ( plane ) ;
}
private function initListeners( ) :void {
plane.addEventListener ( InteractiveScene3DEvent.OBJECT_PRESS , objectPress ) ;
addEventListener( Event.ENTER_FRAME , onEnterFrame ) ;
}
private function objectPress( e :InteractiveScene3DEvent ) :void {
plane.rotationX +=Math .random ( ) *10
plane.rotationZ +=Math .random ( ) *10
}
private function onEnterFrame ( e :Event ) :void {
plane.rotationY +=2 ;
renderer.renderScene ( scene, camera , viewport ) ;
}
}
}