lights 常用基础

3d里面常用的两种光源 DirectionalLight(平行光)& PointLight(点光)。

Error #1014: 无法找到类 flash.display3D.textures::Texture



使用FlashDevelop开发Flash3D应用时,提示如下错误:

Error #1014: 无法找到类 flash.display3D.textures::Texture

经查阅,原来是新建的项目采用的FlashPlayer版本过低的原因,设置FlashPlayer版本为11.0.0.0以上即可。

另外还有几个在开发FLash3D项目可能需要设置的参数,在这里做下记录:(以下设置针对Adobe Flash Builder,FlashDevelop设置类似)
1、项目属性 FP选项设为11.0.0
2、编译参数里加上-swf-version=13
3、然后在html-template目录下的index.template.html里 params.allowfullscreen = "true";
4、下面一行添加 params.wmode="direct";这几条都办到,就没问题了

away3d的贴图原理

我正在做这样一个东西,在球体的表面,贴上多张图片,如四张图片,其实很简单,如果你明白它的贴图原理。
away3d空间中的最小单位是Face(surface的简称),也就是一个三角形Triangle(但是Face和Triangle分别是两个不同的类),每一个模型(sphere,cube等)都是由很多个Face组成的。Face中最重要的内容是:
(1)三个x,y,z坐标的点a(x1,y1,z1),b(x2,y2,z2),c(x3,y3,z3),这三个点决定了三角形在三维空间中的位置;
(2)三个U,V坐标的点(u1,v1),(u2,v2),(u3,v3),这三个坐标是二维平面上的坐标,范围是0~1,决定了三角形的贴图信息。如果要给三角形贴上一个长为w,宽为h的图片,那么,空间中的点(x1,y1,z1)就对应着图片上(u1*w,v1*h)这个点,同理其他两个点也是如此,所以贴图时,只是把图片上(u1*w,v1*h),(u2*w,v2*h),(u3*w,v3*h) 这三个点围起来的三角形的颜色值完全拷贝出来绘制到三维空间的那个目标三角形上。

明白了这个道理。要给球体贴4张图,有两个办法,如下:
1.取出组成球体的所有三角形,改变每个三角形的材质和uv坐标即可。假设4张图要贴在球体上,我们假设四张图组成一张大图globeImg,球体上每个三角形的uv是相对于这张大图globeImg的,所以只要改变uv的值为相对于4张小图就可以。例如某一点的uv为(0.75,0.70),经过计算,假设经过计算这个点对应于第3张小图,那么改变后的uv就是(0.25,0.20),其他两个点同理,再把这个三角形的材质改为第3张图就可以。 要注意的问题是,有可能三角形的3个点不在同一张小图上,遇到这种情况就要自己处理(把三角形再分割,或者其他方法)。

2.知道球体的投影算法,把四张小图以某种方法进行分割,分割成连续的三角形集合,并对每个三角形进行球体投影(即把平面上的uv坐标投影成球体上的某一点(x,y,z)),成为三维空间的一个三角形(有uv,有x,y,z坐标,有材质),绘制这些三角形。属于同一张小图上的三角形的材质就是这张小图。要注意的问题是:每个三角形的uv值是相对于小图片的,而进行球体投影时要把uv转换成相对于整张地图的x,y坐标值,再进行球体投影。-------->因为我最终要实现的是B/S模式的球体地图,所以最终采用了这种方法。

原文出处:http://www.cnblogs.com/jdksummer/articles/2592612.html

away3d(3.6.0)屏幕坐标到三维坐标的转换

away3d版本:3.6.0

项目需求: 空间中有一个球体,球体在视窗内显示时并不是全部显示,每次只显示球体的一部分,现在需要在FrameEnter事件中计算当前显示在窗口中的是球体的哪一部分,这个问题的根本,是要计算视窗/屏幕上四个角的点对应的是球体上的哪四个点,即要把屏幕坐标转换成away3d中的球体上的三维坐标。

问题总结:如何把屏幕坐标转换成空间中某个物体的坐标。

对于这个问题,根据屏幕坐标的来源可以规结为两种解决办法。

(1)点击事件产生的屏幕坐标,如空间中有一个球体sphere,为球体添加了一个mouseDown事件,在该事件的事件处理函数中转换。

this.group.addEventListener(MouseEvent3D.MOUSE_DOWN,MouseDown3D);
……
function MouseDown3D(e:MouseEvent3D):void
{
    var vertex:Vertex=new Vertex(e.sceneX,e.sceneY,e.screenZ);
    trace(vertex); 
}

MouseEvent3D事件中保存了点击位置的屏幕坐标和球体上的三维坐标,MouseEvent3D的详细内容可以看away3d的帮助文档。

(2)对于屏幕上任意的一个点,要转换就要通过 HitManager来进行,其实MouseEvent3D事件中得到的三维坐标本质上也是根据HitManager得到的。

var session:AbstractSession=new SpriteSession();
view.hitManager.findHit(session as AbstractSession,screenX,screenY);  //第一步
var even:MouseEvent3D=view.hitManager.getMouseEvent("click3d");   //第二步
trace(even.sceneX+","+even.sceneY+","+even.sceneZ+"***");

第一步:调用view中的hitManager的findHint方法。
第二步:调用hitManager的getMouseEvent方法得到一个保存了位置信息的MouseEvent3D变量。

如果查看HitManager类的源码就会发现,findHint方法的实现过程,其实是对view中所有的物体的三角形(3d世界中每个物体由很多个小三角形组成)进行扫描,找到第一个包含该屏幕点的三角形(因为我的view中只有一个球体,所以第一个找到的三角形肯定在我的球体上)。getMouseEvent方法, 只是把相关的位置信息封装成一个MouseEvent3D变量作为返回值而已。

原始出处:http://www.cnblogs.com/jdksummer/articles/2599036.html

away3d 4.0 Error #3691: 超出此资源类型的资源限制。

away3d的每个版本差异都特别大,之前使用3.6做了一个东西,在要交工时才发现render方法有内存泄漏,无耐之下又要用4.0重新做一遍,这一做就又是三天,真是差异太大了。

今天遇到一个很奇怪的问题: Error #3691: 超出此资源类型的资源限制。错误定位在 view.rendre()方法。以该错误的英文error #3691 resource limit for this resource type exceeded 在google中搜索(百度在这方面简直是垃圾!),有效解释如下:

“Which means that you are exceeding the texture resource limits in the Flash Player / Stage3D;”
  Limits are described here:http://help.adobe.com/en_US/FlashPla...Context3D.html  

Resource Number allowed Total memory
Vertex buffers 4096 256 MB
Index buffers 4096 128 MB
Programs 4096 16 MB
Textures 4096 128 MB¹
Cube textures 4096 256 MB

又找到这样的解释:

It seems the actual geometry of the Plane is never disposed, which prevents the buffers from being cleaned up”.

( 看起来像是实际的geometry没有销毁,仍然占用着缓存区。)

联想到我的应用,是反复执行删除mesh,添加mesh的操作,删除的代码如下:

/*清空scene中的内容*/
private function clearScene():void
{
while(this.tileGroup.numChildren>0)
  {
    var t:TileMesh=tileGroup.getChildAt(0) as TileMesh;
    tileGroup.removeChild(t);
    t.dispose(); //此处是对mesh的销毁,难道是没有真正销毁?
    t=null;
  }
}

TileMesh是我继承自Mesh类实现的一个自己的mesh类,在从场景中删除时也执行了t.dispose() 这个销毁操作,有没有可能是这个销毁操作没有删除Mesh的Geometry呢?

修改代码如下:

/*清空scene中的内容*/
private function clearScene():void
{
while(this.tileGroup.numChildren>0)
  {
    var t:TileMesh=tileGroup.getChildAt(0) as TileMesh;
    tileGroup.removeChild(t);
    t.distroy(); //distroy是TileMesh中自己实现的一个方法,用于销毁geometry 和 material
    t=null;
  }
}

distroy是TileMesh中自己实现的一个方法,用于销毁geometry 和 material,代码如下:

public function distroy():void
{
this.geometry.dispose();
this.material.dispose();
}

再次执行程序,运行正常,没有再出现之前的错误“ Error #3691: 超出此资源类型的资源限制”。

原文出处:http://www.cnblogs.com/jdksummer/articles/2613030.html

Away3D 4.0中的阴影

away3d 4.0中的加载模型代码变化很大,为加载模型带来挺大的工作量。加载成功后为了实现阴影,首先需要DirectionalLight。

 _light = new DirectionalLight(-1,-1,-1);
_view.scene.addChild(_light);

 

注意:需要放置到建筑物的内部
然后,设置地面的材质:

var floorMaterial:TextureMaterial =  new TextureMaterial(new BitmapTexture(new Grass().bitmapData),true,true,true);
floorMaterial.shadowMethod = new FilteredShadowMapMethod(_light3);
floorMaterial.lightPicker = new StaticLightPicker([_light1,_light2]);
floorMaterial.specular = 0;
var floor:Mesh = new Mesh(new CubeGeometry(1500,2,1500,1,1,1),floorMaterial);
floor.geometry.scaleUV(20,20);
floor.position = new Vector3D(30,-51,0);
_view.scene.addChild(floor);

 

原文出处:http://www.everyinch.net/?p=820

Adobe Flash Builder Flash3D开发错误处理方法汇总

报错:VerifyError: Error #1014: 无法找到类 flash.display3D::Context3D。
处理方案:在项目属性的附加编译器参数中加入-swf-version=13。 注意要和前面的参数以空格分离。即:-locale zh_CN -swf-version=13

报错:Error #2044: 未处理的 ErrorEvent:。 text=Error #3702: Context3D 不可用。
处理方案:在生成的html页面中加入 params.wmode="direct";

[转]Away3d学习笔记2-三维世界的四个基本构件

flash 3d,没近距离接触她之前我感觉她特神秘、特深奥;加之flash3d 引擎国外独大的局势,中文资料少之又少,flash3d对于国内用户来说,她真的很不平易近人!直至硬着头皮啃英文资料开始学习away3D(有很多主流flash3d引擎,如pvd3d、away3d、sandy。。但网上传away3d架构清晰,易学。所以我选她)。原来只要懂得as3,用away3D做三维东东并没有想象中的复杂。出于加深学习目的我写下这套笔记,同时希望可以给flash3d初学者带来帮助(本笔记基于away3d,但所有引擎机理都是差不多的,所以也适合其他引擎用户阅读)。

[转]Away3D学习笔记1 - 戏说Flash 三维引擎

如果把文章开头比作一个入口的话,那我要在入口处立一块牌,上书:“非flash开发人员免入”。因为如果把flash比作一部电影的话,本文以及本博客所有文章都是写给导演而非观众的。

万物总是从低级向高级发展,计算机图形也是由二维(2D)走向三维(3D).这一点在大型游戏里得到充分体现。然3D游戏发展的如火如荼,flash三维(flash3D)的发展步态蹒跚,现在的flash3D水平与8年前的3D游戏在同一级别。 不仅如此,flash3D的发展还很草根! 在flash cs3版本前一直没提供三维功能。万众睹目下,flash 东家adobe才发布flash cs 4,揭开头巾露出flash3D的容貌来。但头巾揭开那刻却也是失望之时,原来头巾里头只是乳臭未干黄毛丫头,而非我们希望的那样丰姿卓著、丰满异常。flash Cs 4实在有点抱歉(cs4我没用过,对3D支持到底则样我不知道,但从网上大家的反应来看我以为然)!不过还好,各路豪杰揭竿而起,为我们开发出各种flash 三维引擎,利用这些引擎我们可以轻松实现一些3D效果。

flash 三维引擎乍听上去高深莫测,其实质就是ActionScritpt的类库。对,就是类库,不是内裤!但每一种flash 三维引擎都自成系统,能独当一面。当然既然都是ActionScritpt的类我们也可以在同一flash影片里综合使用几种引擎。没人规定打架只能一手拿剑或一手拿刀,既然都是武器绝对可以左手拿刀右手拿剑。

flash 三维引擎种类繁多,而且flash3D开发人员各有偏好,大有诸侯割据之势。在众多诸侯之中下列几个脱颖而出:Papervision3D(pv3d)、Away3D、Sandy3D等。

原文地址:http://www.cnblogs.com/nooon/archive/2009/05/18/1459399.html