纳金网

标题: pv3d知识 [打印本页]

作者: .    时间: 2013-3-21 14:30
标题: pv3d知识
PV3D坐标系X正向指向屏幕右侧,Y正向指向屏幕上方,Z正向垂直屏幕向内
PV3D里的y轴与Flash里面的y轴相反
PV3D的坐标原点和对象注册点都是(0,0,0)
import flash.display.BitmapData;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.media.Camera;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import org.papervision3d.materials.VideoStreamMaterial;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.objects.primitives.Cone;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.primitives.PaperPlane;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.primitives.Arrow;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.view.BasicView;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.materials.BitmapAssetMaterial;//位图元件材质
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.materials.MovieAssetMaterial;//影片元件材质
import org.papervision3d.materials.utils.PrecisionMode;
import org.papervision3d.materials.special.CompositeMaterial;//组合
org.papervision3d.materials.utils


localRotationX自身X轴
localRotationY自身Y轴
localRotationZ自身Z轴
stage.frameRate = 40;


整个场景的段数总数最好在3000 以下
平面
plane=new Plane(材质=null,宽=0,高=0,水平段数=0,垂直段数=0);
plane.x
plane.y
plane.z
plane.material.doubleSided = ***e;显示双面材质
plane.geometry.vertices.length;//获取定点个数
plane.geometry.vertices.x
plane.geometry.vertices.y
plane.geometry.vertices.z

球体
sphere = new Sphere(材质=null,半径=100,水平段数=8,垂直段数=6);
sphere.localRotationX
sphere.localRotationY
sphere.localRotationZ

圆柱体
cylinder:Cylinder = new Cylinder(材质=null,半径=100,高度=100,水平段数=8,垂直段数=6,上表面圆半径=-1,上表面是否创建=***e,下表面是否创建=***e);
第6个参数为-1表示上半径与下半径相同

圆锥体
cone:Cone = new Cone(材质=null,半径=100,高度=100,水平段数=8,垂直段数=6);

立方体
cube:Cube=new Cube(材质列表,宽=500,深=500,高=1);
cube:Cube=new Cube(材质列表,宽=500,深=500,高=1,宽度段的数量=1,高度段的数量=1,深度段的数量=1,内部可见的面数=0,不创建的面=0);

red:ColorMaterial = new ColorMaterial(0xFF0000);
materialsList:MaterialsList = new MaterialsList();
materialsList.addMaterial(red,"front");
materialsList.addMaterial(red,"back");
materialsList.addMaterial(blue,"left");
materialsList.addMaterial(blue,"right");
materialsList.addMaterial(green,"top");
materialsList.addMaterial(green,"bottom");
materialsList.addMaterial( green,"all");



纸飞机
paperPlaneaperPlane = new PaperPlane(材质,放大倍数);
paperPlane.boundingBox().size.x
paperPlane.boundingBox().size.y
paperPlane.boundingBox().size.z

箭头
arrow:Arrow = new Arrow();
arrow.scale = 0.5;

do3D代表3D对象
do3D.geometry.faces;//访问对象的三角面片


x: 距离原点或其父对象的x 轴上的距离
Y: 距离原点或其父对象的y 轴上的距离
Z: 距离原点或其父对象的z 轴上的距离
localRotationX: 绕自身x 轴旋转
localRotationY: 绕自身y 轴旋转
localRotationZ: 绕自身z 轴旋转
Geometry: 访问对象的几何信息(顶点和三角)
sceneX: x 轴上对象距离场景原点的距离
sceneY: y 轴上对象距离场景原点的距离
sceneZ: z 轴上对象距离场景原点的距离
scale: 3d 缩放从对象的原点开始起作用

球体或者长方体双面贴图
material.doubleSided = ***e;
或者
material.oneSide = false;

只要在球体的内侧贴图
material.opposite = ***e;
material.smooth = ***e;

var material:WireframeMaterial = do3D.material as WireframeMaterial
var material:WireframeMaterial = new WireframeMaterial(颜色=0xFF00FF,透明度=1,粗细=0);
透明度0-1
粗细0-255

var material:ColorMaterial = new ColorMaterial(颜色=0xFF00FF,透明度=1,交互性=false);
位图材质
var circle:Shape = new Shape();
circle.graphics.beginFill(0xFF0000);
circle.graphics.drawCircle(100,100,100);
var bmp:BitmapData = new BitmapData(200,200,***e,0x0);//宽 高 透明度 原始填充色
bmp.draw(circle);
var material:BitmapMaterial = new BitmapMaterial(bmp);
material.smooth = ***e;

var imgLoaderoader = new Loader();
imgLoader.contentLoaderInfo.addEventListener (Event.COMPLETE,loadComplete);
imgLoader.load(new URLRequest("assets/mill.jpg"));


var bitmap:Bitmap = e.target.content as Bitmap;
var material:BitmapMaterial = new BitmapMaterial(bitmap.bitmapData);
位图文件材质

var material:BitmapFileMaterial = new BitmapFileMaterial("assets/mill.jpg");
当使用BitmapFileMaterial时,请先设置对象的宽和高
BitmapFileMaterial 对象会发出一个FileLoadEvent.LOAD_COMPLETE 事件
FileLoadEvent.LOAD_COMPLETE: 外部位图加载完成时,发出该事件。
FileLoadEvent.LOAD_PROGRESS: 外部位图加载过程中,发出该事件。
FileLoadEvent.LOAD_ERROR: 外部位图找不到时,发出该事件。
FileLoadEvent.SECURITY_LOAD_ERROR: 安全错误发生时,发出该事件。


位图元件材质
var material:BitmapAssetMaterial = new BitmapAssetMaterial(连接标示符,是否使用材质的精度=false);
只能在flex Builder 和Flash Builder 中使用
[Embed (source="assets/mill.jpg")] public var mill:Class;
var millAsset:BitmapAsset = new mill() as BitmapAsset;
var material:BitmapMaterial = new BitmapMaterial(millAsset.bitmapData);

影片剪辑材质
new MovieMaterial(DisplayObject对象,材质是否支持透明度=false,影片每一帧快照=false,精度=false,边界=null);
var material:MovieMaterial = new MovieMaterial(DisplayObject对象都可以);
material.smooth = ***e;
material.doubleSided = ***e;

影片元件材质
new MovieAssetMaterial(连接标示符,透明=false,影片每一帧快照=false,创建一个副本=false,精度=false);
var material:MovieAssetMaterial = new MovieAssetMaterial("material",false,***e);
material.doubleSided = ***e;
material.rect = new Rectangle(0,0,200,200);
material.smooth = ***e;
material.precise = ***e;
当precise 属性设置为***e 时,PV3D 将自动的将三角形面细分以创建更多的新的三角形面这样就更精确了
material.precisionMode = PrecisionMode.STABLE;
精度模式默认为:PrecisionMode.NORMAL


视频流材质
VideoStreamMaterial 类继承自MovieMaterial,构造函数有五个参数:
Parameter Data type Default
value
Description
1 Video视频 Video — 用做抓拍源的视频实例对象
2 Stream流 NetStream — 操作视频的NetStream对象
3 Precise精度 Boolean false 材质的精度
4 Transparent透明度 Boolean false 创建的材质是否支持透明度


var video:Video = new Video();
video.attachCamera(Camera.getCamera());



var conn:NetConnection = new NetConnection();
conn.connect(null);
var stream:NetStream = new NetStream(conn);
var material:VideoStreamMaterial = new VideoStreamMaterial (video, stream);
material.animated = ***e;//材质的动画属性设为***e.


组合材质

var material:CompositeMaterial = new CompositeMaterial();
material.addMaterial(bmpMaterial);
material.addMaterial(wireMaterial);


交互
要与材质或者 3D 对象进行鼠标交互必须先设置viewport 的interactive 属性为***e。Viewport 的interactive
属性默认为false。
viewport.interactive = ***e;
viewport.buttonMode = ***e;
如果类是继承自BasicView,那么也可以通过下面的方法来实现:
super(640,480,false,***e);
请一定要在startRendering()方法执行前,先调用super()方法。
还有一种方法,就是在创建一个 Viewport3D 对象时,用参数来指定:
var viewport:Viewport3D = new Viewport3D(640,480,false,***e);
为了能通过材质进行交互,必须将材质的interactive 属性设为***e:
material.interactive = ***e;

如果你再影片剪辑元件中有一个命名为”btn”的按钮
MovieClip(material.movie).getChildByName("btn").addEventListener( MouseEvent.CLICK,click);


material.interactive = ***e;
plane.addEventListener(InteractiveScene3DEvent. OBJECT_CLICK,click);
(e:InteractiveScene3DEvent)
e.displayObject3D.localRotationY


do3D会发出如下事件:
InteractiveScene3DEvent.OBJECT_ADDED
InteractiveScene3DEvent.OBJECT_CLICK
InteractiveScene3DEvent.OBJECT_DOUBLE_CLICK
InteractiveScene3DEvent.OBJECT_MOVE
InteractiveScene3DEvent.OBJECT_OUT
InteractiveScene3DEvent.OBJECT_OVER
InteractiveScene3DEvent.OBJECT_PRESS
InteractiveScene3DEvent.OBJECT_RELEASE
InteractiveScene3DEvent.OBJECT_RELEASE_OUTSIDE

材质平铺
使用平铺得置三个属性第一个属性tiled为***e第二个和第三个是水平和纵向重复次数。
material.tiled = ***e;
material.maxU = 8;
material.maxV = 4;


翻转材质
是翻转其实就是把缩放比设置成负数
加载好了的材质才可以翻转
设置材质的opposite属性为***e,这样才能使矩形内面也可见
material.doublesided 或者 material.opposite为***e

flippedSprite.scaleX = -1;
flippedSprite.addChild(graphic1);
BitmapMaterialTools.mirrorBitmapX(material.bitmap);
BitmapMaterialTools.mirrorBitmapX()为横向翻转
BitmapMaterialTools.mirrorBitmapY()为纵向翻转

幂数纹理
最好使用尺寸是2的幂数的图片,但宽高比不要是1:1
当我们无法使用2的幂数的尺寸时,我们可以使用PV3D实现的自动细化功能,这是BitmapMaterial类的一个静态属性。
BitmapMaterial.AUTO_MIP_MAPPING = ***e;

WireframeMaterial 线框材质
ColorMaterial 颜色材质
BitmapMaterial 位图材质
BitmapFileMaterial 位图文件材质
BitmapAssetMaterial 位图元件材质
MovieMaterial 影片材质
MovieAssetMaterial 影片元件材质
VideoStreamMaterial 视频流材质
CompositeMaterial 组合材质

平滑材质使用 material.smooth = ***e.
双面材质使用 material.doubleSided = ***e.
动画材质使用 material.animated= ***e.
阻止材质扭曲使用 material.precise = ***e.
材质和物体可以交互使用 viewport.interactive = ***e
material.interactive = ***e.
翻转材质使用DisplayObject的 scaleX属性,或者使用BitmapMaterialTools功能类的
静态方法来翻转bitmap数据:BitmapMaterialTools.mirrorBitmapX( material.bitmap).
平铺材质使用 material.tiled = ***e并设置 material.maxU 和 material.maxV这两个
横线和纵向重复数.


摄影机
设置焦距:
camera.focus = 12;
设置视野.
camera.fov = 90;
为了放大我们看到的物体便需要降低fov 的值
camera.zoom = 80;

降低缩放或焦距,视野变大
 增加缩放或焦距,视野变小
 增加或降低视野将降低或增加焦距,但不改变缩放

camera.near = 30;
camera.far = 15000;
camera.z = -2000;
camera.focus = 20;
camera.far = 20000;
为了避免对象超过远面的物体被渲染, 你需要设置
camera.useCulling 为***e.
有4 种摄影机:
 目标摄影机
 自由摄影机
 调试摄影机
 弹性摄影机


super(stage.stageWidth,stage.stageHeight,***e,false,CameraType.TARGET);
CameraType.TARGET
 CameraType.FREE
 CameraType.DEBUG
 CameraType.SPRING
import org.papervision3d.cameras.CameraType;

camera.target = myTarget;
DisplayObject3D.ZERO 返回一个空的,坐标为(0,0,0)的DsiplayObject3D 对象


moveForward(): 沿自身z 轴向前移动对象.
 moveBackward(): 沿自身z 轴向后移动对象.
 moveLeft(): 沿自身x 轴向左移动对象
 moveRight(): 沿自身x 轴向右移动对象
 moveUp(): 沿y 轴向上移动对象
 moveDown(): 沿y 轴向下移动对象

import org.papervision3d.cameras.SpringCamera3D;
import org.papervision3d.core.math.Number3D;
var camera:SpringCamera3D = SpringCamera3D(camera);
camera.mass = 20;
camera.damping = 4;
camera.stiffness = 1;
camera.positionOffset = new Number3D(0,150,-500);
camera.lookOffset = new Number3D(0,0,100);
plane.lookAt(camera);
pitch():绕自身 x 轴旋转物体(localRotationX)
 yaw():绕自身 y 轴旋转物体(localRotationY)
 roll():绕自身 z 轴旋转物体(localRotationZ)
区别
do3D.localRotationY = 35;
do3D.localRotationY = 10;
只会旋转10度而不是45度
do3D.yaw(35);
do3D.yaw(10);
让do3D 对象旋转45度


rotataionX:将物体绕本地空间(local space)下的x 轴旋转。
 rotataionY:将物体绕本地空间(local space)下的y 轴旋转。
 rotataionZ:将物体绕本地空间(local space)下的z 轴旋转。 【来源:互联网】
更多精彩教程,尽在web3D纳金网http://www.narkii.com/college/
作者: shenyg77    时间: 2014-1-27 22:05
太好了,支持一下
作者: 89684598    时间: 2014-2-22 15:24
好东西啊,感谢分享




欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5