以下开始用AS3的stage3D来设计三维世界,用flashbuilder作为IDE来开发。
重要的概念:
1、stage3D渲染出来的画始终是在stage下面的,也就是说原来的那一套stage上的显示对象肯定会遮盖住stage3D绘制的东西。
2、stage3D有很多层,所以也有层次关系,但一般我们都只使用一层来画画就行了。
3、stage3D的video层在最下面,也就是说你绘制的东西一定会遮住stage3D视频的。
Stage3D类:这个也就在环境搭建初期的时候使用下,一般都是用之后的Context3D实例,而不再直接操作Stage3D实例,所以你可以看做它是来帮你找画家-Context3D的。
Context3D类:在stage3D创建好了环境后才能使用的一个东西,你也可以叫他状态机或者画家,它是来帮你画画的。
开始创建吧:
// 如果你电脑不具备3D环境的话,显然你应该重装系统或者换一台现代化的电脑了。 if(stage.stage3Ds.length==0){trace("没有3D环境!");return;} // 我们随便找到一层可用的stage3D层来使用,这里我们用0层吧。 var stage3D:Stage3D = stage.stage3Ds[0]; // 侦听创建失败的情况:如果3D环境创建失败的话,显然应该同上处理。 stage3D.addEventListener(ErrorEvent.ERROR,function(e:ErrorEvent):void{trace("创建3D环境出错!");}); // 侦听创建成功的情况:调用onCreated3D函数,恩当然如果设备丢失再恢复的话会再次调用<span style="font-family: Arial, Helvetica, sans-serif;">onCreated3D这个函数,比如CTRL+ALT+DEL后再回到桌面时</span> stage3D.addEventListener(Event.CONTEXT3D_CREATE,onCreated3D); // 请求创建! stage3D.requestContext3D();
private function onCreated3D(e:Event):void{ // 记录一下这个画家/状态机 context3D = (e.target as Stage3D).context3D; // 它不存在的话,仍然得做出相应的处理 if(context3D==null){ trace("创建3D环境出错"); return; } // 当发生错误的时候会显示错误信息,着色语言阶段出错时开启此选项就会报具体的错误信息,你好因此排查错误 context3D.enableErrorChecking=true; // 设定后台缓冲区,一般就是要画画的区域大小了,还有抗锯齿为2的N次方(0表示不抗锯齿画的效率更高但画面更丑) context3D.configureBackBuffer(stage.stageWidth, stage.stageHeight, 0, true); // -- 如果已创建过的话以下数据无需再次初始化,上面说过了当你在设备恢复的时候也会再次调用此函数所以这里简单的return下 // 实际在项目开发过程中应该要恢复当前绘制的东西不然就报错了。比如要重新上传vb、ib、着色代码等 if(alreadyCreated3DOnce){return} alreadyCreated3DOnce=true; }
// 透视投影变量,adobe提供的库而不在系统自带里,相关库网上都有下载 private var projectionMatrix:PerspectiveMatrix3D = new PerspectiveMatrix3D(); // 以下代码可以放到<span style="font-family: Arial, Helvetica, sans-serif;">onCreated3D函数中,因为一旦确立一般后面也不用变,就是一个固定的投影变换了。</span> // 矩阵归零:就是让这个矩阵变换为零变换,没有位移也没有旋转也没有缩放 projectionMatrix.identity(); // 设定为透视投影,越远越小越接近屏幕中心的那种,右手坐标系RightHand // -- 第一个参数表示透视角度 // -- 第二个参数表示宽高比例 // -- 第三个参数表示裁剪的最近距离,比这个个还近就无法显示 // -- 第四个参数表示裁剪的最远距离,比这个还远的东西就无法显示 projectionMatrix.perspectiveFieldOfViewRH(45.0,stage.stageWidth/stage.stageHeight,0.01,5000.0);