【Away3D】初步认识[通俗易懂]

【Away3D】初步认识[通俗易懂]1packagezen.funny2{3importcom.greensock.TweenLite;45importflash.display.Sprite;6import

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

 1 package zen.funny  2 {  3 import com.greensock.TweenLite;  4  5 import flash.display.Sprite;  6 import flash.display.StageAlign;  7 import flash.display.StageScaleMode;  8 import flash.events.Event;  9 import flash.events.MouseEvent;  10  11 import away3d.containers.View3D;  12 import away3d.controllers.HoverController;  13 import away3d.entities.Mesh;  14 import away3d.materials.TextureMaterial;  15 import away3d.primitives.CubeGeometry;  16 import away3d.textures.BitmapTexture;  17  18 [SWF(backgroundColor="#000000", frameRate="60", quality="LOW")]  19 public class CubeTest extends Sprite  20  {  21 [Embed(source="../../assets/images/floor_normal.jpg")]  22 private var grassClass:Class;  23  24 private var _view3D:View3D;  25 private var cameraController:HoverController;//360全景展示相机控制器  26 private var box:Mesh;  27  28 private var lastPanAngle:Number;  29 private var lastTiltAngle:Number;  30 private var lastMouseX:Number;  31 private var lastMouseY:Number;  32 private var move:Boolean;  33  34 public function CubeTest()  35  {  36 super();  37  addEventListener(Event.ADDED_TO_STAGE, init);  38  }  39  40 private function init(e:Event):void  41  {  42 stage.scaleMode = StageScaleMode.NO_SCALE;  43 stage.align = StageAlign.TOP_LEFT;  44  45 //渲染3D视窗  46 _view3D = new View3D();  47 _view3D.antiAlias = 4; //抗锯齿平滑系数,2的幂,设置越高锯齿越不明显  48 this.addChild(_view3D);  49  50 //将位图数据转换成贴图材质  51 var bmpTexture:BitmapTexture = new BitmapTexture(new grassClass().bitmapData); //位图纹理,记录贴图信息  52 var material:TextureMaterial = new TextureMaterial(bmpTexture); //位图材质,将材质贴到模型上的皮肤  53  54 var cubeSize:uint = 500;  55 var cube:CubeGeometry = new CubeGeometry(cubeSize, cubeSize, cubeSize); //Geometry相当于骨架  56  57 //Geometry几何体  58 box = new Mesh(cube,material); //Mesh相当于是附着在Geometry上的皮肤,没有Mesh的Geometry是不能被显示的  59  _view3D.scene.addChild(box);  60  initCamera();  61  62 // 添加侦听器来渲染3D世界  63  addEventListener(Event.ENTER_FRAME, enterFrameHandler);  64  stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);  65  stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);  66  stage.addEventListener(MouseEvent.MOUSE_WHEEL,onWheel);  67  }  68  69  70 private function initCamera():void  71  {  72 //创建摄像机功能  73 cameraController = new HoverController(_view3D.camera);  74 cameraController.distance = 1000; //摄像机和目标点距离  75 cameraController.minTiltAngle = 0; //摄像机以Y轴旋转最小角度  76 cameraController.maxTiltAngle = 90; //摄像机以Y轴旋转最大角度  77 cameraController.panAngle = 45; //摄像机以Y轴旋转角度  78 cameraController.tiltAngle = 20; //摄像机以X轴旋转角度  79  }  80  81 private function onWheel(e:MouseEvent):void  82  {  83 if(e.delta > 0)  84  {  85 if(cameraController.distance < 1000)  86 TweenLite.to(cameraController,.5,{distance:cameraController.distance + 100});  87  }  88 else  89  {  90 if(cameraController.distance > 600)  91 TweenLite.to(cameraController,.5,  92 {distance:cameraController.distance - 100});  93  }  94  }  95  96 private function onMouseDown(event:MouseEvent):void  97  {  98 lastPanAngle = cameraController.panAngle;  99 lastTiltAngle = cameraController.tiltAngle; 100 lastMouseX = stage.mouseX; 101 lastMouseY = stage.mouseY; 102 move = true; 103  } 104 105 private function onMouseUp(event:MouseEvent):void 106  { 107 move = false; 108  } 109 110 private function enterFrameHandler(event:Event):void 111  { 112 // 渲染3D世界 113 if (move) 114  { 115 cameraController.panAngle = 0.3 * (stage.mouseX - lastMouseX) + lastPanAngle; 116 cameraController.tiltAngle = 0.3 * (stage.mouseY - lastMouseY) + lastTiltAngle; 117  } 118  _view3D.render(); 119  } 120  } 121 }

 

渲染时的执行优先级依次为:

normalMethod >ambientMethod >shadowMethod >diffuseMethod >specularMethod >colorTransform >其它通过addMethod()方法添加的Method

 

一些常用的Method

EnvMapMethod  环境贴图方法

想要物体表面能反射周围环境(如不锈钢,有机玻璃材质)?用这个就对啦..

 1 //创建一个skybox,6块贴图大家自己找,官方demo里有  2 var cubeTexture:BitmapCubeTexture = new BitmapCubeTexture("6块贴图")  3 scene.addChild(new SkyBox(cubeTexture));  4 //创建一个宽高长均为500的方块  5 var cubeGeometry:CubeGeometry = new CubeGeometry(500, 500, 500);  6 var cubeMaterial:ColorMaterial = new ColorMaterial();  7 cubeMaterial.specular = 0.8;  8 cubeMaterial.alpha = 0.5;  9 //因为要反射skybox的环境,所以共用skybox的贴图材质 10 //如果你想反射别的东西,也可以使用别的材质 11 cubeMaterial.addMethod(new EnvMapMethod(cubeTexture)); 12 var cubeMesh:Mesh = new Mesh(cubeGeometry, cubeMaterial); 13 scene.addChild(cubeMesh);

 

FresnelSpecularMethod  菲涅尔镜面贴图方法

我不想把这东西解释的太复杂,下面有一段摘录自百度百科的内容,相信大家一看就能明白….
(我们站在湖边的时候,低头看脚下的水,水是透明的,反射不是特别强烈;远处的湖面,你会发现水并不是透明的,并且反射非常强烈。这就是“菲涅尔效应”….摘自百度百科)
说白了就是把光线反射变得更柔和,可以使用在湖面材质上,也可以配合SSS散射方式使用在皮肤材质上

FresnelEnvMapMethod  菲涅尔环境贴图方法

SubsurfaceScatteringDiffuseMethod  次表面满散射方式(SSS满散射方式)

这个方法用来模拟光在半透明物体内的折射效果(如人的皮肤,葡萄,蜡烛等)
1 var subsurfaceMethod:SubsurfaceScatteringDiffuseMethod = new SubsurfaceScatteringDiffuseMethod(2048, 2);2 subsurfaceMethod.scatterColor = 0xff7733;3 subsurfaceMethod.scattering = .05;4 subsurfaceMethod.translucency = 4;5 bodyMaterial.diffuseMethod = subsurfaceMethod;


WrapDiffuseMethod

包裹散射方式,接近于SSS满散射方式,但更粗糙一些

ColorTransformMethod

颜色转换方法,效果与直接设置material.colorTransform一样,在执行顺序上会晚于material.colorTransform的设置

一般情况下不推荐使用,请直接使用material.colorTransform,除非你需要解决一些特殊的问题或Bug

1 var m:ColorTransformMethod = new ColorTransformMethod();2 m.colorTransform = new ColorTransform(1,0,0);3 bodyMaterial.addMethod(m);


ColorMatrixMethod

颜色矩阵转换方法,想换贴图的颜色?也可以用它….

但你得具备一些ColorMatrixFilter的知识…

1 var matrix:Array = new Array();2 matrix = matrix.concat([1, 0, 0, 0, 0]); // red3 matrix = matrix.concat([0, 0, 0, 0, 0]); // green4 matrix = matrix.concat([0, 0, 0, 0, 0]); // blue5 matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha6 var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);7 var m:ColorMatrixMethod = new ColorMatrixMethod();8 m.colorMatrixFilter = filter;9 bodyMaterial.addMethod(m);

 


OutlineMethod

轮廓方法,如果材质图某些地方是透明的,但你又想知道整个mesh的形状,可以使用此方法(此方法不受贴图影响,有效边界为geometry边界)

RimLightMethod

轮廓发光方法(有效边界为贴图可视边界,透明部分不受此方法影响)

1 bodyMaterial.addMethod(new RimLightMethod(0xff0000));


 

ProjectiveTextureMethod  投射材质方法

想像一下阳光透过彩色的窗玻璃,这些玻璃上的色彩投射在墙上的效果

或者….heihei…..如果你有一个球体,想再贴一张照片在这球体上….heihei…..

1 var projector:TextureProjector = new TextureProjector(photoBitmapData); 2 projector..position = new Vector3D(0,100,0); 3 bodyMaterial.addMethod(new ProjectiveTextureMethod(projector));


SimpleWaterNormalMethod

想要一些简单的水波效果?用它,就是用它!

SoftShadowMapMethod

想看到物体的阴影被映射在墙角时的弯折效果?就是这个了

DitheredShadowMapMethod  抖动阴影方法

 

 

 

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

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

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

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

(0)


相关推荐

  • msf 漏洞扫描_漏洞扫描方案

    msf 漏洞扫描_漏洞扫描方案目录1msfconsole介绍1msfconsole介绍msfconsole简称msf是一款常用的安全测试工具,包含了常见的漏洞利用模块和生成各种木马,其提供了一个一体化的集中控制台,通过msfconsole,你可以访问和使用所有的metaslopit插件,payload,利用模块,post模块等等。msfconsole还有第三方程序的接口,比如nmap、sqlmap等,可以直接在msfconsole里面使用。kali可直接在命令使用:msfconsoleMsfconsole的系统

  • c++二分法查找_二分法查找python代码

    c++二分法查找_二分法查找python代码二分法:二分法应用条件:1)数组为有序数组。2)同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。区间的定义:区间的定义不同代码就不同。1)定义target在[left,right]区间while(left<=right)要使用<=,因为left==right是有意义的,所以使用<=。if(nums[middle]>target)right要赋值为middle-1,因为当前这个nums[mid

    2022年10月31日
  • 递归算法php,php递归算法经典实例「建议收藏」

    递归算法php,php递归算法经典实例「建议收藏」PHP递归算法就是函数调用函数了操作非常的简单了,我们下面来给各位介绍PHP递归算法及实际的一些关于递归的用法。递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白,直接上例子functiontest($n){echo$n.”…

  • UCloud出海记:神秘的东南亚云计算赛道,还没到划地盘的阶段 …

    UCloud出海记:神秘的东南亚云计算赛道,还没到划地盘的阶段 …

  • IntelliJ IDEA Community Edition 社区版插件汇总「建议收藏」

    IntelliJ IDEA Community Edition 社区版插件汇总「建议收藏」一、前言今年Idea对盗版软件打击力度加大,朋友们会发现,旗舰版自己激活使用,过几天就会失效,需要重新激活,有的小伙伴就会选择去淘宝花钱买个教育邮箱注册,这个方法我使用过,过了两三个月就不能用了,着实让人头疼。如何解决呢?我想到了Idea社区版本,下载一个使用,将我的Springboot项目导入,启动下试试,不出所料,报错了。好啦!步入正题。社区版Idea相比旗舰版少了很多功能,包括Java开发最重要的Web开发能力!Spring项目没有Tomcat插件,不能在Idea启动。SpringBoot

  • LINUX下tar.bz2包的安装方法

    LINUX下tar.bz2包的安装方法声明:个人觉得文章不错,所以转载过来分享以及自己收藏,只是原出处已经无法查明,只能附上我见文章的地址:http://forum.ubuntu.org.cn/viewtopic.php?t=156932大多以tar.gz和tar.bz2打包软件,大多是通过./configure;make;makeinstall来安装的;有的软件是直接make;makeinstall

发表回复

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

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