
flash 3D引擎简介
http://www.cnblogs.com/morrispan/archive/2010/08/20/1804078.html
flash3D引擎有不下10款,在使用的时候真的是会让人犯难,我个人曾经使用过一段时间PV3D,感觉PV3D的创建时间,用户规模等等相对都要更加成熟,因此我自己更加推荐PV3D 。
结论:目前我在用PaperVision。如果Away3D能修复问题,提高执行效率,我会换用A3D。如果GreatWhite (PV3D2)继续出错不断,Away3D的问题解决不了,我会考虑Alternativa。
Flash 3D 基础
http://flash3d.esojourn.org/cn/Flash-3D-Basics
本教程适用于电脑3D图形新手。教程中将介绍常用术语并解释如何在Flash中实现3D。如果你不知道什么是网格(mesh),贴图(texture)或都着色引擎(shader)(译者注:参见什么是shader? - 文章未完成) ,那么本文可以在你准备使用Papervision3D, Away3D 和 Sandy这些引擎制作3D Flash之前,为你讲解一些必要的基础知识。因为本教程只涉及一般电脑3D基础知识,所以不需要编程基础。
本教程是为刚刚入门的新手编写的,不过你也可以在教程中找到其他一些信息。所有示例都是使用Away3D实现的,你也可以随意下载示例源代码。直接研究代码是学习Flash 3D的最好办法。在这里(文章未完成)有如果使用这些代码的说明。最后提醒一下,每个例子都需要用鼠标指向才会运行。如果所有Flash文件都一起运行,你的浏览器马上就会挂掉。下面也会讲到这是为什么。
好了,进入主题。3D很简单。就象你每天用双眼看到的一样,是你非常习惯的东西。因此你的大脑对3D世界很了解。在电脑中的3D与在现实中十分类似。区别只是在电脑中,你看到的一切是某些人设计出来的,而且只显示在平面的显示器上。(译者注,现实世界也不是凭空变出来的)
flash 3d引擎分类
1.商用和免费:商用引擎是需要付费才可以商业应用的,而免费则可以随意使用。
2.开源和非开源:开源引擎是指源代码开放的引擎,引擎的内核代码是可以随便研究的。而非开源则相反。
flash 3d常用引擎
Alternativa 3D引擎;Away3d引擎;CopperCube引擎;Flare 3D 引擎;Sandy 3D引擎;
papervision3d引擎;NewX3D引擎;Sharikura 3D引擎;Alchemy3D引擎等。
flash 3d引擎现状和未来
由于目前flash网页播放器还不支持GPU,而只能基于CPU运算,所以表现复杂图像时往往显得力不从心。目前各flash 3d引擎能实时渲染面数为3000-5000个面,八倍网已实现了3万面运行非常流畅。视电脑配置稍有些不同。但是Adobe的官方已经发话,在不久flash网页播放器将支持GPU运算,那时flash 3d引擎能实时渲染面数将达到几十万面.Alternativa 3D官方已经放出一段引擎游戏的视频,30万面的场景运行的非常流畅。
flash 3d引擎学习资料
国内目前知名的几个flash3d爱好者可以找资料的地方:
Flash3d官方网站 - 拥有最新最全的Flash3d引擎学习资料,是flash3d爱好者研究学习的家园。
Flash3d研究所 - 代表国内flash3d最高技术团队,QQ群涵盖大部分flash3d业内高手。
天地会3d应用区 - 天地会凭借其海量flash人员,此3d区拥有很多flash3d爱好者。
Flash 官方3D引擎:Stage3D
Flash 3D引擎发布 腾讯游戏副总裁“押宝”网页游戏
热腾2012-5月5日消息 近日腾讯游戏副总裁程武一则极具暗示性的微博引来超过1.2万人的转播与评论,火爆围观后更是引发了网络大猜想。目前,该则微博被业界普遍认为是程武在预示着腾讯游戏未来发展重点,“几乎所有游戏都可能移植到网页上”更是让众网友对腾讯未来推出的Web游戏充满憧憬与期许。
幻想还是现实?程武微博大剖析
究竟腾讯游戏副总裁程武何以得出“几乎所有游戏都有可能移植到网页上”的结论?结合微博原文,笔者认为是基于2个事实得出的:
首先,继百兆宽带入户广州、天津、成都和杭州等一二线城市,上海市也正式宣布2012年将实现光纤“百兆到户、千兆进楼、T级出口”。无不预示着“百兆宽带进入光纤网络生活”即将全面到来。
其次,Adobe近期发布了极具划时代意义的Flash 3D引擎。Flash 3D引擎支持硬件加速功能将非常重要,特别是对于那些处理能力和电池续航时间有限的移动设备。此举将极大地扩展Flash在游戏市场的地盘,也让Web Game 3D化成为了现实。
由此可见,“几乎所有游戏都有可能移植到网页上”是可行的并且是顺应潮流的举措。
既然“移植”是未来网页游戏的发展潮流,同行抢滩页游的竞争也越发激烈,该微博是否意味着腾讯游戏接下来将全力进军Web游戏领域,乘着《七雄争霸》同时在线60万的大好东风顺势打下这块江山呢?让我们拭目以待。
页游新品发布会隆重举行 腾讯游戏全面发力
腾讯游戏2011年度发布会上正式发布七款网页和社交游戏新品,产品类型涵盖角色扮演、经营、养成等不同题材。至此,腾讯游戏旗下页游产品已覆盖策略、经营、战棋、摹拟、养成等多种细分种类。而程武在接受“经济观察网”专访时,更是透露腾讯游戏将在2011年大力推广10款左右的重点网页游戏。腾讯游戏副总裁王波一句“接下来,腾讯游戏还将在军事、科幻、体育等细分类别开疆辟土,在更多的细分市场做出尝试。”也印证了腾讯游戏在拓展网游第五类细分市场的坚定决心。
Papervision3D
算是最老牌最流行的3d引擎了,as2时代就有。性能算是十分的不错(DEMO),支持 ASE 和 DAE 格式的3d模型,其中 DAE 格式的贴图支持得非常的不错。支持的材质方式十分之多,几乎我们所能想到的方式基本都有。但是相对来说,模型却不多,而且Camera也不是很好用,没有默认的控制器。并且我发现他最近更新不快,很多功能没有陆续增加,实在是可惜。如果你需要做一个需要高性能,不需要动态灯光,碰撞检测等的项目,pv3d是不错的选择。许可:MIT MIT License。
Papervision 3D. 我非常喜欢这个引擎。和Away 3D很类似。但我发现PV3D的性能要好一些,也没有三角型丢失的问题。如果PV3D能尽快出一个稳定版就好了。现在很多东西还在修改中。还有过时的文档也会带来一些问题。
Alternativa 3D
一群俄罗斯人写的一个商业性的3d引擎,支持3DS格式模型,支持碰撞检测。有一个类似Counter-Strike的控制器,操作镜头是十分的方便。但是如果你希望动态的设置个别模型的位置什么的,那就惨了,性能十分的差。由于他不是开源项目,所以你是做商业应用,就得好好考虑了。许可:Alternativa3D License。
Alternativa,这个引擎比较完善。因为版权协议的问题,我没有深入研究过这个引擎。如果他们在商业开发版权协议中,加入针对个人开发者的免费协议条款,我肯定会考虑这个引擎。版权费用是个大问题。
在Molehill出来之前,用此引擎开发的Tanki Online就让大家惊艳。去年Adobe MAX大会上的3D赛车让大家印象深刻,这个游戏就出自Alternativa3D引擎。
引擎相关特性:
•支持加载大多数流行3D文件,如Collada, OBJ 等
•拥有3ds MAX 2010输出插件
•可以类似DisplayObject方式方便的管理3D对象
•高效的三维深度排序
•光照系统、鼠标交互、多摄像机系统等。
官方网址: http://www.alternativaplatform.com/
授权方式:免费但不开源,今年4月就将推出支持Molehill的最新免费版本。
开发环境:Flex(Flash)Builder,FlashDevelop及其他ActionScript开发环境。
演示案例:
•http://www.alternativaplatform.com/en/demos/maxracer/
•http://www.alternativaplatform.com/en/demos/metro2033online/
•http://tankionline.com/
•http://war.q1.ru/art/screenshots/
更多采用此引擎的游戏展示: http://www.alternativaplatform.com/en/showcase/
Away3d
这是一个功能很强大的3d引擎,支持多种(ASE, DAE, KMZ, 3DS, Md2, Obj)模型格式,支持3D动画,支持动态灯光等,不过性能貌似不怎么样,一个1024*1024的立方体都跑得够呛,不知道是不是我没有设置好。许可:Apache License2。
Away3D是个很好的3D引擎,有很好的社区支持,结构清晰不断改进的文档。使用Away3D,你可以选择一种你所喜爱的开发工具,开始进行3D Flash开发。
我喜欢Away3D,因为他的API最清楚,文档和示例做得最好。但是三角型消失的问题让人头疼。
值得一提的是,Away3D具有一个可视化编辑场景及模型的工具- Prefab3D ( http://www.closier.nl/prefab/),这个运用Adobe AIR开发的工具功能相当强大,开发者和设计人员可以方便的对三维场景进行材质贴图,编辑光照及设置动画等,并输出为Away3D使用的文档。
在Adobe Molehill公布的当天,他们也发布了最新支持Molehill的4.0 Alpha版本。
引擎相关特性:
•支持加载大多数流行3D文件,如Collada, OBJ 等
•拥有可视化编辑场景及模型的免费工具Prefab3D
•功能全面的资源加载、事件处理、光照、摄像机、骨骼动画及音效处理等
官方网址: http://www.away3d.com/
授权方式:开源且免费
开发环境:Flex(Flash)Builder,FlashDevelop及其他ActionScript开发环境。
演示案例:
•http://infiniteturtles.co.uk/projects/away3d/broomstick/ShallowWaterDemo.html
•http://www.ringo.nl/projects/away3d/broomstick/LoaderOBJTest.html
•http://not-so-stupid.com/clients/not-so-stupid/away4/duck/
•http://infiniteturtles.co.uk/projects/away3d/broomstick/LoaderMD5Test.html
更多采用此引擎的游戏展示: http://away3d.com/projects-using-away3d
用Away3D引擎的Flash3D推箱子游戏原型-最终版本
原文链接:使用Away3D引擎的Flash3D推箱子游戏原型 - 最终版本
这是Away3D中的脚本,其中包括我在Flare3D版本中展示的同样的功能。
这里有几个问题,如果像我在62行那样使用Z轴排序的话,像246和248行那样更改了箱子顶部材质,一旦越过了目标,并且帧率很低,那就不对了。
不管怎么样,下面这些就是它的代码:
package {
//需要导入的Flash内置类
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.geom.Vector3D;
import flash.display.BitmapData;
//需要导入的Away3D引擎的内置类
import away3d.containers.*;
import away3d.primitives.*;
import away3d.cameras.*;
import away3d.core.render.*;
import away3d.materials.*;
import away3d.lights.DirectionalLight3D;
import away3d.debug.*;
public class Main extends Sprite {
private const CUBESIZE:Number=50;
//推箱子演示的玩家等级和玩家位置
private var levels:Array=[[1,1,1,1,0,0,0,0],[1,0,0,1,1,1,1,1],[1,0,2,0,0,3,0,1],[1,0,3,0,0,2,4,1],[1,1,1,0,0,1,1,1],[0,0,1,1,1,1,0,0]];
private var playerCol:uint;
private var playerRow:uint;
private var playerRotation:Number=0;
private var playerAngle:Number=0;
private var playerMovement:Number=0;
private var dRow:int;
private var dCol:int;
//Away3D引擎变量
private var view:View3D;// View3D类表示绘图背景
private var theCamera:SpringCam;// 自定义一个摄像机来管理第一和第三人物摄像机
private var player:Sphere;// 玩家控制物体
private var cameraTarget:Sphere;
private var movingCrate:Cube;// 箱子物体
// 位图对象
private var crateBitmap:BitmapData=new BitmapData(256,256);
private var crateTopBitmap:BitmapData=new BitmapData(256,256);
private var floorBitmap:BitmapData=new BitmapData(256,256);
private var wallBitmap:BitmapData=new BitmapData(256,256);
private var goalBitmap:BitmapData=new BitmapData(256,256);
private var crateTopGoalBitmap:BitmapData=new BitmapData(256,256);
private var backBitmap:BitmapData=new BitmapData(512,512);
private var playerBitmap:BitmapData=new BitmapData(512,512);
// 一些材质对象
private var floorMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(floorBitmap);
private var wallMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(wallBitmap);
private var goalMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(goalBitmap);
private var crateMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(crateBitmap);
private var crateTopMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(crateTopBitmap);
private var crateTopGoalMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(crateTopGoalBitmap);
private var backMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(backBitmap);
private var playerMaterial:WhiteShadingBitmapMaterial=new WhiteShadingBitmapMaterial(playerBitmap);
function Main() {
floorBitmap.draw(new floorPic(256,256));
wallBitmap.draw(new wallPic(256,256));
crateBitmap.draw(new cratePic(256,256));
crateTopBitmap.draw(new crateTopPic(256,256));
crateTopGoalBitmap.draw(new crateTopGoalPic(256,256));
goalBitmap.draw(new goalPic(256,256));
backBitmap.draw(new backPic(512,512));
playerBitmap.draw(new playerPic(512,512));
// 场景设置
view=new View3D({x:320,y:240});
//view.renderer = Renderer.CORRECT_Z_ORDER;
var stats:AwayStats=new AwayStats(view);
addChild(view);
addChild(stats);
theCamera= new SpringCam();
view.camera=theCamera;
var light:DirectionalLight3D = new DirectionalLight3D();
light.direction=new Vector3D(CUBESIZE*10,- CUBESIZE*6,CUBESIZE*4);
view.scene.addLight(light);
var sky:Skybox=new Skybox(backMaterial,backMaterial,backMaterial,backMaterial,backMaterial,backMaterial);
view.scene.addChild(sky);
// 等级结构设置
var cube=Cube;
for (var i:uint=0; i<6; i++) {
for (var j:uint=0; j<8; j++) {
switch (levels[i][j]) {
case 0 :
cube=new Cube({material:floorMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE/2,x:CUBESIZE*i,y:0,z:CUBESIZE*j});
view.scene.addChild(cube);
break;
case 1 :
cube=new Cube({material:floorMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE/2,x:CUBESIZE*i,y:0,z:CUBESIZE*j});
view.scene.addChild(cube);
cube=new Cube({material:wallMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE,x:CUBESIZE*i,y:CUBESIZE*3/4,z:CUBESIZE*j});
view.scene.addChild(cube);
break;
case 2 :
cube=new Cube({material:goalMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE/2,x:CUBESIZE*i,y:0,z:CUBESIZE*j});
view.scene.addChild(cube);
break;
case 3 :
cube=new Cube({material:floorMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE/2,x:CUBESIZE*i,y:0,z:CUBESIZE*j});
view.scene.addChild(cube);
cube=new Cube({material:crateMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE,x:CUBESIZE*i,y:CUBESIZE*3/4,z:CUBESIZE*j});
cube.cubeMaterials.bottom=crateTopMaterial;
cube.name="crate_"+i+"_"+j;
view.scene.addChild(cube);
break;
case 4 :
cube=new Cube({material:floorMaterial,depth:CUBESIZE,width:CUBESIZE,height:CUBESIZE/2,x:CUBESIZE*i,y:0,z:CUBESIZE*j});
view.scene.addChild(cube);
player=new Sphere({material:playerMaterial,radius:CUBESIZE/2,segmentsW:16,segmentsH:16,x:CUBESIZE*i,y:CUBESIZE*3/4,z:CUBESIZE*j});
view.scene.addChild(player);
cameraTarget=new Sphere({material:playerMaterial,radius:CUBESIZE/5,segmentsW:4,segmentsH:4,x:CUBESIZE*i,y:CUBESIZE*3/4,z:CUBESIZE*j});
view.scene.addChild(cameraTarget);
playerCol=j;
playerRow=i;
break;
}
}
}
// 事件
addEventListener(Event.ENTER_FRAME,onEnterFrm);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDwn);
}
private function onKeyDwn(e:KeyboardEvent):void {
if (playerRotation==0&&playerMovement==0) {
switch (e.keyCode) {
case 37 :
playerRotation=-9;
break;
case 38 :
movingCrate=null;
var playerAngle:Number=Math.round(player.rotationY)%360;
if (playerAngle<0) {
playerAngle+=360;
}
// 我们需要判断出当前的行列数值
// 并且新的行列数值将取决于玩家的方向
switch (playerAngle) {
case 0 :
dRow=0;
dCol=-1;
break;
case 90 :
dRow=-1;
dCol=0;
break;
case 180 :
dRow=0;
dCol=1;
break;
case 270 :
dRow=1;
dCol=0;
break;
}
if (levels[playerRow+dRow][playerCol+dCol]==0||levels[playerRow+dRow][playerCol+dCol]==2) {
// 玩家可以移动了
playerMovement=- CUBESIZE/10;
} else {
if (levels[playerRow+dRow][playerCol+dCol]==3||levels[playerRow+dRow][playerCol+dCol]==5) {
if (levels[playerRow+2*dRow][playerCol+2*dCol]==0||levels[playerRow+2*dRow][playerCol+2*dCol]==2) {
// 玩家可以移动并推动箱子
movingCrate=view.scene.getChildByName("crate_"+(playerRow+dRow)+"_"+(playerCol+dCol))as Cube;
playerMovement=- CUBESIZE/10;
}
}
}
break;
case 39 :
playerRotation=9;
break;
}
}
}
private function onEnterFrm(e:Event):void {
if (playerRotation) {
// 下面的代码是Away3D如何旋转一个物体
player.rotationY+=playerRotation;
cameraTarget.rotationY+=playerRotation;
var reachedAngle:Number=Math.round(player.rotationY);
if (reachedAngle%90==0) {
playerRotation=0;
}
}
if (playerMovement) {
playerAngle=Math.round(player.rotationY)%360;
if (playerAngle<0) {
playerAngle+=360;
}
// 下面的代码是Away3D如何移动一个物体
cameraTarget.moveForward(playerMovement);
switch (playerAngle) {
case 0 :
player.z+=playerMovement;
if (Math.round(player.rotationZ)%360==0) {
player.rotationX+=18;
} else {
player.rotationX-=18;
}
break;
case 90 :
player.x+=playerMovement;
player.rotationZ+=18;
break;
case 180 :
player.z-=playerMovement;
if (Math.round(player.rotationZ)%360==0) {
player.rotationX+=18;
} else {
player.rotationX-=18;
}
break;
case 270 :
player.x-=playerMovement;
player.rotationZ-=18;
break;
}
if (movingCrate) {
if (playerAngle<0) {
playerAngle+=360;
}
switch (playerAngle) {
case 0 :
movingCrate.moveForward(playerMovement);
break;
case 90 :
movingCrate.moveRight(playerMovement);
break;
case 180 :
movingCrate.moveBackward(playerMovement);
break;
case 270 :
movingCrate.moveLeft(playerMovement);
break;
}
}
// 我们需要通过这种方式来判断玩家控制的物体是否到达目的地
if (Math.round(player.rotationY)%180==0) {
if (Math.round(player.z)%CUBESIZE==0) {
playerMovement=0;
}
} else {
if (Math.round(player.x)%CUBESIZE==0) {
playerMovement=0;
}
}
if (playerMovement==0) {
levels[playerRow+dRow][playerCol+dCol]+=4;
levels[playerRow][playerCol]-=4;
if (movingCrate) {
levels[playerRow+2*dRow][playerCol+2*dCol]+=3;
if (levels[playerRow+2*dRow][playerCol+2*dCol]==5) {
movingCrate.cubeMaterials.bottom=crateTopGoalMaterial;
} else {
movingCrate.cubeMaterials.bottom=crateTopMaterial;
}
levels[playerRow+dRow][playerCol+dCol]-=3;
movingCrate.name="crate_"+(playerRow+2*dRow)+"_"+(playerCol+2*dCol);
movingCrate=null;
}
playerRow+=dRow;
playerCol+=dCol;
}
}
// 摄像机管理
theCamera.target=cameraTarget;
theCamera.positionOffset=new Vector3D(0,CUBESIZE*8,CUBESIZE*6);
theCamera.lookOffset=new Vector3D(0,0,-2*CUBESIZE);
theCamera.damping=10;
theCamera.view;
view.render();
}
}
}
下面是最终编译的结果:
http://www.emanueleferonato.com/wp-content/uploads/2011/02/sokoaway3.swf
在Flash, Flex或Flashdevelop中安装使用Away3D
http://flash3d.esojourn.org/cn/Installing-Away3D-for-Flash-Flex-or-Flashdevelop%20
如果你正准备开始学习Flash 3D。但不知道如何开始。本教程会帮助你在Flash, Flex和Flashdevelop中设置基本开发环境。
用Away3D的最新版本开始,有两种不同方式得到最新版代码。
方法1:到 http://away3d.com/downloads/ 下载。只需要下载ZIP文件(away3d源代码)并解压。
方法2:安装Subversion(SVN)(Sonic注,一款很常用的版本控制软件),然后从Google 代码库下载。使用SVN是下载最新版代码或退回之前版本的最好方法。如果你使用Flex,你可以从这里学习如何在Flex中设置使用SVN(英文,尚未翻译)。在Windows平台上使用Flash的用户可以看看这篇很棒的SVN教程。这篇“为什么要使用版本控制软件”的文章讲解了更多关于Subversion的信息,以及版本控制软件对程序员的好处。
Flash
For Flash to find the Away3D files, you have two options.
Option 1: Store the Away3D files with the FLA
Just copy the "away3d" and "nochump" folders into the folder that your FLA file resides in. This will cause Flash to find them automatically. This has also has the benefit of making it easy to share the project. Just compress the entire folder to a ZIP archive and the recipient will have all the required code. The drawback is that if you have a lot of projects, you'll get a lot of duplicate files.
Option 2: Update Actionscript settings
Keeping the Away3D source in just one location and pointing Flash to that folder will save you a lot of duplicate files. It'll also make it easier to update to the latest version by just replacing the folder contents.
•Select File -> Publish Settings.
•Click the "Settings" button (next to Actionscript version)
•In the Classpath box at the bottom, Click the plus to add a path and then click the target icon to locate the file
Keep in mind that if you use a direct path such as "C:\\Documents and Settings\\UserName\\My Documents\\Away3D source", the project will only work on your computer. If you use relative paths cleverly ("../Away3D source"), you can easily share the file with others that use a similar setup.
To view any of the pre-made Away3D Tutorial files, copy the class file to the same directory as the FLA. If you want to view the file "Renderers.as", copy this file as well as "Cover.as" (required). Next, type "Renderers" in the input field for "Document class" in the Properties panel and export. To view the source file itself, just click the pencil next to the "Document class" input field.
Flex
First, create a new Actionscript Project to hold your code (File -> New... -> Actionscript Project). In Flex you have the same two options as with Flash, either copy "away3d" and "nochump" folders into your project folder or link to a folder on your filesystem. If you chose the SVN option or want to link to a folder on your system, follow these steps:
•Right click the project you just created and select Properties.
•Select "Actionscript Build Path", click "Add folder..." and browse to the location of the Away3D source code.
•Click OK to close the dialogue and you're ready to go
To view any of the pre-made Tutorial files in Flex, copy the file you want to view (i.e. Renderers.as) as well as Cover.as (required) to your project folder. Right click "Renderers.as" in the Flex Navigator, select "Set as Default Application" and run the file.
使用Away3D,一小时内创造天地
http://flash3d.esojourn.org/cn/Create-the-Earth-and-heavens-in-less-than-an-hour-with-Away3D
本篇教程将演示如何建立一个逼真的虚拟互动地球,还包括太阳和星空。很难吗?不会,用Away3D来实现很容易!
近来,关于3D的讨论风靡Flash社区。不少3D引擎,各有优缺点。Carlos Pinho为我们列出一张很好的3D引擎清单。本文中,我们将会使用Away3D来实现一个漂亮的场景。
Sandy 3D
看上去十分象PV3D,实际上我觉得他比PV3d好用,结构更加清晰,性能也十分不错。不过我觉得他还不够成熟,所以选择时需要谨慎。许可:Mozilla Public License 1.1 。
我下载过,但是不喜欢他的文档和示例。后就没再多在这上面多费时间。
Sharikura 3D
一个日本人写的,相信大家都看过 pictaps,那是相当的不错。在MAX会上演示的 ECO ZOO更是叹为观止。十分流畅的3D动画,都怀疑是否是flash做的。不过我们目前还只能看看这些漂亮的demo。
Zero3D
zero3d是一款完全由国人自主研制开发,基于Flash Player 10 的Flash 3D完全开源引擎. 官方网站是:www.zero3d.cn 开源地址:zero3d.googlecode.com
目前最新版本为v1.3. 目前功能支持几乎所有的主流Flash 3D内容.并且具有特色的物理,粒子,刚体,精灵系统. 全中文的文档.全中文的代码注释.为从使用到开发上都提供了方便和完整的技术支持. 最重要的,这是一款我们中国人自己的引擎.
Flare3D
Flare3D是一个 创建Flash 3D游戏的引擎。其最大特色是具有较完整的Flash 3D游戏开发工作流程。
引擎相关特性:
•支持导入3ds MAX模型
•可视化的对场景及模型进行编辑、贴图等
•光照系统、骨骼、摄像机系统等
•比较直观的开发流程
官方网址: http://www.flare3d.com/
授权方式:商业授权,30天试用版本 。
开发环境:Flex(Flash)Builder,FlashDevelop及其他ActionScript开发环境。
演示案例:
•http://www.flare3d.com/games/AlmaxRace/
•http://www.beyond-reality-face.com/demo
•http://www.flare3d.com/demos/animations/
更多采用此引擎的游戏展示:http://www.flare3d.com/showcase
比较和分析
Papervision 3D的效率要稍微高那么些。
我用away3d生成的swf至少也在100k左右,但是同样的效果用pv3d却能减小到20k。但是占用的CPU差不多。
Papervision 3D 用的人最多,可以问的人也多,学习资料多。
Alternativa 3D 效率应该更高些把?但是没开源。
结论:先上手 Away3D实例,再研究Papervision 3D。
