Away3D基础教程(二):加载外部模型[通俗易懂]

Away3D基础教程(二):加载外部模型[通俗易懂]预览地址:http://leoas.host-home-idc.k5.fhfinance.com/tutorials/2/glass.html模型随鼠标转动,中键滚轮缩放。模型和完整源码下载:http

大家好,又见面了,我是你们的朋友全栈君。

预览地址:http://leoas.host-home-idc.k5.fhfinance.com/tutorials/2/glass.html

模型随鼠标转动,中键滚轮缩放。

模型和完整源码下载:https://files.cnblogs.com/njflash/src2.rar

预览图片:

Away3D基础教程(二):加载外部模型[通俗易懂]

  away3d支持的模型格式较为丰富。MD2,MD5,3DS,OBJ等我们常用的格式都支持。另外还有away3d的专有格式awd。awd可以通过away3d 的模型编辑器preFab来导出生成。通常支持骨骼动画的模型有MD2 MD5 3DS AWD 等。这里我们将加载一个AWD模型。

1:首先创建3D视口,设置视口的相关参数

_view = new View3D();
//背景色
_view.backgroundColor = 0x666666;
//抗锯齿参数
_view.antiAlias = 4;
this.addChild(_view);

2:初始化渲染侦听器和鼠标滚轮侦听

this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);

3:用Loader3D类来加载和解析模型

//Parsers.enableAllBundled()这样away3d就能解析所有它能解析的格式了
Parsers.enableAllBundled();
            
_loader = new Loader3D();
_loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE,onResourceComplete);
//_loader.addEventListener(AssetEvent.ASSET_COMPLETE,assetComplete);
_loader.addEventListener(LoaderEvent.LOAD_ERROR, onLoadError);
//AntModel为绑定嵌入的模型资源
_loader.loadData(new AntModel());

4:加载完成后的事件处理函数

_loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE,onResourceComplete);
_loader.removeEventListener(LoaderEvent.LOAD_ERROR, onLoadError);
_view.scene.addChild(_loader);
_view.camera.z=1000;
_view.camera.lookAt(_loader.position);

5:完整源码

package { import away3d.containers.View3D; import away3d.entities.Mesh; import away3d.events.AssetEvent; import away3d.events.LoaderEvent; import away3d.loaders.Loader3D; import away3d.loaders.misc.*; import away3d.loaders.parsers.Parsers; import away3d.library.assets.AssetType; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import flash.events.MouseEvent; [SWF(width="550", height="400", frameRate="60", backgroundColor="0x666666")] public class GettingStartedWithAway3D extends Sprite { [Embed(source="vase.awd",mimeType="application/octet-stream")] public static var AntModel:Class; private var _view : View3D; private var _loader : Loader3D; public function GettingStartedWithAway3D() { _view = new View3D(); //背景色 _view.backgroundColor = 0x666666; //抗锯齿参数 _view.antiAlias = 4; this.addChild(_view); this.addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel); //Parsers.enableAllBundled()这样away3d就能解析所有它能解析的格式了  Parsers.enableAllBundled(); _loader = new Loader3D(); _loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, onResourceComplete); /*下面这个事件精确到侦听模型中每一个Mesh是否加载完成,可以更简单的提取MESH, 可以打开这里的注释和下面的事件处理函数看看不同的效果*/ //_loader.addEventListener(AssetEvent.ASSET_COMPLETE, assetComplete);  _loader.addEventListener(LoaderEvent.LOAD_ERROR, onLoadError); //AntModel为绑定嵌入的模型资源 _loader.loadData(new AntModel()); } /*private function assetComplete(e:AssetEvent):void { //trace(e.asset.assetType == AssetType.MESH); if (e.asset.assetType == AssetType.MESH) { var mesh3d:Mesh = e.asset as Mesh; _view.scene.addChild(mesh3d); } }*/ private function onResourceComplete(ev : LoaderEvent) : void { _loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, onResourceComplete); _loader.removeEventListener(LoaderEvent.LOAD_ERROR, onLoadError); _view.scene.addChild(_loader); _view.camera.z=1000; _view.camera.lookAt(_loader.position); } private function onLoadError(ev : LoaderEvent) : void { trace('Could not find', ev.url); _loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, onResourceComplete); _loader.removeEventListener(LoaderEvent.LOAD_ERROR, onLoadError); _loader = null; } private function onWheel(e:MouseEvent):void{ trace(e.delta); if(e.delta>0){ _view.camera.moveForward(30); }else{ _view.camera.moveBackward(30); } } private function onEnterFrame(ev : Event) : void { _loader.rotationY = stage.mouseX - stage.stageWidth/2; _view.camera.y = 3 * (stage.mouseY - stage.stageHeight/2);  _view.camera.lookAt(_loader.position); _view.render(); } } }

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155212.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Oracle数据库性能优化(Hbase是什么数据库)

    所有数据库包括Oracle的sql优化都是针对程序员的,而不是针对dba的,第一,尽量防止模糊,明确指出,即用列名代替*,第二,在where语句上下工夫。第三多表查询和子查询,第四尽量使用绑定。根据计算机硬件的基本性能指标及其在数据库中主要操作内容,可以整理出如下图所示的性能基本优化法则:这个优化法则归纳为5个层次:1、减少数据访问(减少磁盘…

  • java log4j 配置文件_[Java教程]log4j配置文件详解

    java log4j 配置文件_[Java教程]log4j配置文件详解[Java教程]log4j配置文件详解02016-07-2523:00:18在开发中经常会碰到日志,网上关于日志的框架也很多,像log4j、self4j、common-logging等,下面对log4j进行介绍。log4j是java开发的日志框架,具有低侵入的特点,其重点使用的部分是log4j的配置文件,有两格式的配置文件,一种###setloglevels###log…

  • @RequestParam,@PathParam,@PathVariable等注解区别[通俗易懂]

    @RequestParam,@PathParam,@PathVariable等注解区别[通俗易懂]@RequestParam和@PathVariable注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam是从request里面拿取值,而@PathVariable是从一个URI模板里面来填充@RequestParam看下面一段代码:http://localhost:8080/springmvc/hello/101?param1=10&pa

  • USACO sprime

    USACO sprime

    2021年12月30日
  • JAVA如何遍历arraylist数组,Java 程序使用Lambda表达式遍历ArrayList

    JAVA如何遍历arraylist数组,Java 程序使用Lambda表达式遍历ArrayListJava程序使用Lambda表达式遍历ArrayList在此示例中,我们将学习在Java中使用lambda表达式遍历数组列表的每个元素。要理解此示例,您应该了解以下Java编程主题:示例:将ArrayList作为函数参数传递示例importjava.util.ArrayList;classMain{publicstaticvoidmain(String[]args){//创建Ar…

  • armv7与armv8的区别(v8和w12的区别)

    ARMv7与ARMv8的处理器架构自己一直没有详细了解过,现在来学习一下,在armcommunity中文社区看到一个不错的总结。两者之间的区别主要如下:ARMv8指令集分为Aarch64和Aarch32指令集,而ARMv7使用的是A32和T16指令集(分别为32位和16位)。现今我们常见的手机处理器多为8核,采用大小核心伴侣架构,比如Kirin970处理器(4*Co…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号