Papervision3d在平面上点击生成物体

下面我们练习Papervision3d在平面上点击生成一个物体
效果如下
[flash=600,600]/upload/attachment/136275/01960e15-468d-39e9-ad6b-6430bb5f32bd.jpg[/flash]
最主要的原理是把Flash二维的点击转化成为三维的物体上的坐标,这个是我们这个练习需要掌握的知识核心。
先放上代码,咱们后面再分析代码的意义。

package
{
import flash.events.Event;
import flash.events.MouseEvent;

import org.papervision3d.cameras.CameraType;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.math.Plane3D;
import org.papervision3d.core.utils.Mouse3D;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
// import org.papervision3d.objects.primitives.Arrow;
import org.papervision3d.objects.primitives.Cone;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Cylinder;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
[SWF(backgroundColor="#000000", frameRate="30", width="600", height="600")]
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);
}

}
}


进行PaperVision3D基本的场景布置后,我们用一个Number3D的变量var intersect:Number3D来储存PaperVision3D场景里的点的坐标信息。
程序里我们用了两种方法来获得这个信息(两种方法来获得):

var intersect:Number3D=getMousePointOnFloor();//使用方法一
var intersect:Number3D=getMousePointOnFloor2();//使用方法二

我们可以采取其中的任意一种方法。
这里我们用的是方法二:
var intersect:Number3D=getMousePointOnFloor2();

这两种方法的返回值都是Number3D
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值