away3d学习笔记 转载

http://abcdefgea.blog.163.com/blog/static/13278774120121155041956/

away3D_4.1.0_教程使用到的3D文件格式  

.3ds(3D Studio):只能导出模型文件和灯光,无法附带模型的uv,是一种比较初级的格式。

.obj(OBJ-Importer):常用格式,支持材质和贴图,支持uvw坐标。不支持动作

MD5:Doom3中使用的3D模型文件,模型的几何数据储存在*.md5mesh文件里,动画数据存储在*.md5anim文件里。支持骨骼动画,支持顶点蒙皮,使用四元数(一种可以用来旋转定位的数学模型)来定位方向。

.md2:战锤II引擎中使用的模型。

.ac3D、.dae、.awd

 

1. 通常支持骨骼动画的模型有:md2、md5、3ds、awd

2. awd是away3D的专有格式,可以通过away3D的模型编辑器preFab来导出生成。


away3D_4.1.0加载3D文件,通常都能获取Mesh,根据模型不同获取额外的数据

function onAssetComplete(e:AssetEvent):void{


    if(e.asset.assetType == AssetType.MESH){


    }else if(e.asset.assetType == AssetType.MATERIAL){


    }else if(e.asset.assetType == AssetType.ANIMATION_SET){

    } 

}


http://blog.sina.com.cn/s/blog_5f48de2f0101749q.html


away3d 4.0学习

要学away3d的话要先搭建环境,
要使用away3d,可以下载away3d的swc导入到项目里面用,
也可以将away3d的源码导入到项目里面使用。
前者的好处是编译快,
后者的好处是编译花时间,下载也花时间,但是后者对于调试帮助很大,你可以熟悉away3d的所有源码,所以我选择的是第二种。

两者都可以从away3d的官网www.away3d.com的download下载到,如果要下载away3d的历史版本的话,右边有一个release的选项,里面有所有版本的away3d资源供下载。

新建一个as项目或者flex项目,配置away3d后,就可以正是开始away3d编程了。

源码如下:

package
{
import away3d.containers.View3D;
import flash.display.Sprite;
import flash.events.Event;
[SWF(frameRate=30,width=1000,height=600)]
public class Awaytest extends Sprite
{
//away3d的窗户,View3D是awy3d于flash displaylist唯一的关联类
private var _view:View3D;
public function Awaytest()
{
//是否添加到舞台,添加到舞台后开始初始化的操作
if(stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init)
}
private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//初始化away3d视窗,设置背景色并添加到显示列表
_view = new View3D();
_view.backgroundColor = 0x0c0c0c;
addChild(_view)
addEventListener(Event.ENTER_FRAME, onEnter);
}
private function onEnter(e:Event):void
{
//每帧调用View3D的render方法渲染
_view.render();
trace("rendering....");
}
}
}

代码注释都在里面了。
debug运行之后如果console(控制台)有输出rendering...的话那么代表一切正常。

由于将要进行很多的例子操作,所以估计敲new View3D都要敲很多次,所以把所有例子里面公用的代码抽出来做成一个基类,顺带介绍一下AwayStats这个类,源码如下:


package template
{
import away3d.containers.View3D;
import away3d.debug.AwayStats;
import flash.display.Sprite;
import flash.events.Event;

public class AwayTemplate extends Sprite
{
protected var _view:View3D;
private var stats:AwayStats;
public function AwayTemplate()
{
if(stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, init)
}
private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
initView();
addEventListener(Event.ENTER_FRAME, onEnter);
}
protected function initView():void
{
_view = new View3D();
_view.backgroundColor = 0x0c0c0c;
addChild(_view)
stats = new AwayStats(_view);
addChild(stats);
}
protected function render():void
{
trace("rendering....");
}
private function onEnter(e:Event):void
{
_view.render();
render();
}
}
}

上面的内容主要是:
1 把view3D的初始化过程提取出来,写成protected方法,以备子类使用;
2 在enterframe里面加了一个render方法,以备例子里面用来渲染游戏里面的某些逻辑;
3 增加了AwayStats实例,用来监控away3d的内存使用,cpu占用还有面数,这个看了下源码,似乎有单例可以使用,记得注意的是构造器里面要传View3D实例,否则的话它就会不知道要监控哪一个View3D的Poly也就是面的使用,我今天就犯了这个错误。

如果一切正常的话,debug之后得到的结果将是如下:
away3d <wbr>4.0学习(2)

之前学习away3d essential的时候做了些笔记,有一哥们不知道away3d 4.0如果画sphere,这里画一个吧。


首先away3d4.0和之前的版本不一样,away3d 4.0的显示物件分为两个部分,一个是材质Texture,另一个是Gemometry也就是几何定义,两者可以合成一个Mesh(个人理解,如有误导,实在抱歉)。

代码如下:
package samples
{
import away3d.entities.Mesh;
import away3d.materials.TextureMaterial;
import away3d.primitives.SphereGeometry;
import away3d.utils.Cast;
import template.AwayTemplate;
public class SphereTest extends AwayTemplate
{
[Embed(source="assets/earth.jpg")]
private var earth:Class;
private var sphere:Mesh;
public function SphereTest()
{
super();
}
override protected function initView():void
{
super.initView();
initSphere();
}
private function initSphere():void
{
//建立球体的几何对象
var geo:SphereGeometry = new SphereGeometry(400);
//建立球体的材质数据
var texture:TextureMaterial = new TextureMaterial(Cast.bitmapTexture(earth));
sphere = new Mesh(geo,texture);
//将物体添加到场景里面显示
_view.scene.addChild(sphere);
}
}
}

运行结果如下:
away3d <wbr>4.0学习(3)

如果你运行时出现错误说找不到图片的话,你自己应该知道是什么原因。

添加以下代码会有惊喜:

override protected function render():void
{
sphere.yaw(1);
}


嗯,最近在导出找3d模型玩,google的模型库里面倒是有蛮多的,但是天朝的网络不给力,不是墙就是下不了,并且google的模型库需要下载专门的软件,于是就没怎么研究下去了。

然后从朋友那里得来一个3d max,晚上回去无聊乱搞搞,自己瞎搞了个模型出来了,于是顺道练习了一下3ds文件在away3d中的使用。

东西简陋了点,但是由于是第一次搞,还是蛮有成就感的。

源码如下:

package
{
import away3d.containers.ObjectContainer3D;
import away3d.controllers.FirstPersonController;
import away3d.controllers.HoverController;
import away3d.controllers.LookAtController;
import away3d.events.AssetEvent;
import away3d.loaders.Loader3D;
import away3d.loaders.parsers.Max3DSParser;
import base.TemplateBase;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.geom.Vector3D;
import flash.net.URLRequest;
import flash.ui.Keyboard;
public class ModelLoaderTest extends TemplateBase
{
private var loader:Loader3D;
private var controler:HoverController;
private var step:Number=5;
private var placeHolder:ObjectContainer3D;
private var stageMouseX:Number;
private var stageMouseY:Number;
public function ModelLoaderTest()
{
super();
}
override protected function init(e:Event=null):void
{
super.init(e);
_view.camera.y = 500;
loader = new Loader3D();
Loader3D.enableParser(Max3DSParser);
loader.addEventListener(AssetEvent.ASSET_COMPLETE, onAssetComplete);
loader.load(new URLRequest("assets/houseScene.3ds"));
loader.scale(10);
_view.scene.addChild(loader);
placeHolder = new ObjectContainer3D();
placeHolder.y = 100;
placeHolder.x = - 100;
_view.camera.addChild(placeHolder);
controler = new HoverController(_view.camera);
initEvents();
}
private function initEvents():void
{
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
stage.addEventListener(MouseEvent.MOUSE_WHEEL, onWheel);
}
private function mouseDown(e:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
stageMouseX = stage.mouseX;
stageMouseY = stage.mouseY;
}
private function onWheel(e:MouseEvent):void
{
controler.distance *= (1+e.delta/100); 
}
private function mouseUp(e:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
var deltaX:Number = stage.mouseX - stageMouseX;
var deltaY:Number = stage.mouseY - stageMouseY;
controler.panAngle = 0.5*deltaX+controler.panAngle;
controler.tiltAngle = 0.5*deltaY+controler.tiltAngle;
}
private function onAssetComplete(e:AssetEvent):void
{
}
override protected function onEnter(e:Event):void
{
super.onEnter(e);
}
}
}

效果图如下:
away3d <wbr>4.0学习(4)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值