`

papervision3d 中的坐标(2)--获取鼠标的空间坐标的两个方法

阅读更多

用鼠标在灰色的平面上 点点看:

 

 

 public class PlaneSelect extends BasicView
 {
  private var mouse3D:Mouse3D;
 
 
  public function PlaneSelect()
  {
    super(600,600,false,true,CameraType.FREE);
   
     var frameMt:WireframeMaterial=new WireframeMaterial( 0x000000);//线框材质
     var colorMt:ColorMaterial=new ColorMaterial( 0xD3D2D0);//色块材质
    
     /*××××××××××××××××××××××××× */ /* 使用第二种方法时 必须设置的2属性*/
      colorMt.interactive=true;//让材质能够感知鼠标 以便获取鼠标在材质上点击的位置
       Mouse3D.enabled = true;
       mouse3D = viewport.interactiveSceneManager.mouse3D;/* 创建虚拟3d鼠标 */
     /*××××××××××××××××××××××××× */
    
     var floor:Plane = new Plane(colorMt, 1000, 1000, 10, 10);//地板
 
    
          
            scene.addChild(floor);
           
     camera.y = -400;//镜头在floor前下方
     camera.z=-600;//到floor的距离
     camera.lookAt(floor);//让镜头对准地板,而不是平视远方
   
    startRendering();
    
    /* 注册事件*/
     //addEventListener(MouseEvent.MOUSE_UP, removeDragListener);
           addEventListener(MouseEvent.MOUSE_DOWN, setDragListener);
  }
  

 
   private function setDragListener(evt:MouseEvent=null):void
    {
       //  var intersect:Number3D=getMousePointOnFloor();//使用方法一
         var intersect:Number3D=getMousePointOnFloor2();//使用方法二
        
        var materialsList:MaterialsList = new MaterialsList();
         materialsList.addMaterial(new  WireframeMaterial(0xf000000), "all"); //定义正方形所有面使用同一材质,也可以分别定义
     var cube:Cube = new Cube(materialsList,30,30,30);
   cube.position=intersect;//把方块的位置和鼠标位置设为相同
   cube.z=-10;
   scene.addChild(cube);
    }
   private function move3DMap(evt:MouseEvent=null):void{}
   private function removeDragListener(evt:MouseEvent=null):void
  {
  //   removeEventListener(MouseEvent.MOUSE_MOVE, move3DMap);
  }
 
 
  /**
   *鼠标的三维坐标 方法一
   * @return
   *
   */ 
  private function getMousePointOnFloor():Number3D {
   
     var ray:Number3D =  camera.unproject( viewport.containerSprite.mouseX,  viewport.containerSprite.mouseY);
         //创建一条镜头到鼠标的射线
        ray = Number3D.add(ray, camera.position);
        //通过三个点创建一个虚拟平面,其实就是建立一个和x轴y轴相交的平面
        var  plane3D:Plane3D  = Plane3D.fromThreePoints( new Number3D(0,100,0), new Number3D(100,0,0), new Number3D(0,0,0));
       //找到射线和平面的交点
        var intersect:Number3D = plane3D.getIntersectionLineNumbers(camera.position, ray);
        return intersect;
   }
  /**
   *鼠标的三维坐标 方法二, 大概的原理是获取鼠标在材质上点击的位置 
   * @return
   *
   */ 
  private function getMousePointOnFloor2():Number3D {
     return new Number3D(mouse3D.x,mouse3D.y,mouse3D.z);
     }
 
 }

 

5
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics