flash引导层怎么做与PV3D层问题

Flash的3D效果 - [FLASH技术交流] -
闪吧论坛 flash,flash8,闪客 - Powered by Discuz!
帖子18&积分5&技术分2 &来自China&在线时间6 小时&注册时间&
Flash的3D效果
先给出一个模仿3D的CD封面效果:
下载次数: 571
下载次数: 411
下载次数: 321
在Flash中进行3D效果处理已经不是新兴的应用技术了,火柴人动画很流行的年代,就有了类似于VR特警的3D场景火柴人射击游戏。在Flash CS4中也加入了一些用于处理3D的类。但是Flash之前的版本中并没有直接处理3D效果的类,做这个东西的的另一方面原因是出于个人兴趣,总之,本文所涉及的内容都是关于3D效果处理的最基本知识。 一、3D空间的坐标表示以及坐标变换这是3D处理的最核心内容,在3D空间中使用三维坐标系来标定坐标,关键问题是互相垂直的x、y、z轴如何在Flash的二维场景中表示出来。实际上,目前大多数的3D效果都是在二维场景中虚拟出来的,如何虚拟出这样一个效果涉及到几个方面的问题:1.z坐标是如何影响x和y坐标的;2.如何实现透视效果,既近大远小的问题。通的说,就是怎样将三维坐标准确变换到二维坐标系中。看到网上很多3D相册等东西,都没有处理好透视的问题,虽然真实空间中并不存在“近大远小”,但为了满足人眼的“需求”或者说更逼真的模仿3D效果,加入透视效果还是非常有必要的。处理这两个问题,大概要从仿生学和数学入手,首先看一下人眼是如何成像的,如图1-1:
图 1-1 人眼成像图中,实物AB的反射光线经过瞳孔(可以认为是一个放大镜)后,倒影在视网膜上形成A'B',若以瞳孔的中心点为原点O(图中z表示瞳孔到实物的距离,z'表示瞳孔到视网膜的距离),则三角形ABO和三角形A'B'O相似,由相似形的相关定理,有OZ':OZ=A'B':AB。其中AB是实物的真实高度或真实宽度,Z是实物在空间中表示距离人眼远近的坐标,都是可以测得的,或认为是已知的。OZ'也是已知的,这样不难计算出A'B'。实际上,对应AB上的每一个点,都能够相应的映射到视网膜上。若AB是垂直于水平面的竖直方向,则在水平方向也可以得到同样的变换,这样我们可以看到实物的Z坐标在视网膜上对X、Y坐标的影响,也就是实现了三维空间坐标到二维空间坐标的变换,并且具有了透视效果,现在完成了一个基本的坐标变换模型。可是,这种变换得到的像是倒立的,我们的大脑要将像再倒过来才能成为正立的像,这么做确实很麻烦,为什么不能更简单一些?这是由人眼的物理结构所决定的,人眼只能成倒立的像,可是计算机中没有这样的物理结构限制,因此可以简化算法,将A'B'O移到左边去,如图 1-2: 图 1-2 简化模型简化后的模型,只需要一次变换就可以得到正立的像。若将AB看成是实物所在平面,A'B'为Flash的舞台,将得到图 1-3: 图 1-3 最终的3D模型图中cd为实物,c'd'为cd在场景中的投影,根据相似型来计算的话,还需要知道OD的值,有的时候这个值可以随意定义,也可以通过定义角A'OB'来确定OD,而角A'OB'可由人眼的水平视角来定义,这里将角A'OB'设定为75度。所以OD=(A'B'/2)*tan(A'OB'/2),A'B'取Flash场景的宽度,通常OD只需要计算一次。现在看一下在3D空间中这个数学模型是如何工作的,图 1-4 是在空间中这种变换的演示: 图 1-4 3D空间中的模型看一下该变换模型的AS代码:
/**
& && && && && &* 将空间3D坐标换算到二维场景的x、y坐标
& && && && && &* 既实现三维坐标系到二维坐标系的变换
& && && && && &* 以一个三维坐标为参数,返回一个二维的坐标
& && && && && &*/
& && && && &&&public function point3D(value:Point3):Point{
& && && && && && && &var _point2D:Point=new Point();
& && && && && && && &//先运算_D/(_D+value.z)
& && && && && && && &//如果先运算(_O.x-value.x)*_D,再/(_D+value.z)时有可能会出现误差,尤其是在value.z=0时
& && && && && && && &_point2D.x=_O.x-(_O.x-value.x)*(_D/(_D+value.z));
& && && && && && && &//先算除法,原因同上
& && && && && && && &_point2D.y=_O.y-(_O.y-value.y)*(_D/(_D+value.z));
& && && && && && && &//返回2D坐标
& && && && && && && &return _point2D;
& && && && &&&}
以上这段代码最终将写入到S3D类中,S3D类完整的代码将在本文最后给出。原点_O和表示空间距离OD的_D在构造函数中计算:
public function S3D(_StageWidth:Number,_StageHeight:Number):void{
& && && && && && && &//初始化_D
& && && && && && && &_D=Math.tan(Math.PI*52.5/180)*_StageWidth/2;
& && && && && && && &//初始化场景宽与高
& && && && && && && &_SWidth=_StageW
& && && && && && && &_SHeight=_StageH
& && && && && && && &//初始化原点_O
& && && && && && && &_O.x=_StageWidth/2;
& && && && && && && &_O.y=_StageHeight/2;
& && && && &&&}
函数中使用了一个Point3为参数,该类大致相当于Point类,只是加入了z坐标。以下是该类的完整代码:
package S3D{
& && & public class Point3{
& && && && &&&
& && && && &&&private var _x:Number=new Number();
& && && && &&&private var _y:Number=new Number();
& && && && &&&private var _z:Number=new Number();
& && && && &&&
& && && && &&&public function Point3(x:Number=0,y:Number=0,z:Number=0):void{
& && && && && && && &_x=x;
& && && && && && && &_y=y;
& && && && && && && &_z=z;
& && && && &&&}
& && && && &&&
& && && && &&&public function set x(value:Number):void{
& && && && && && && &_x=
& && && && &&&}
& && && && &&&public function get x():Number{
& && && && && && && &return _x;
& && && && &&&}
& && && && &&&
& && && && &&&public function set y(value:Number):void{
& && && && && && && &_y=
& && && && &&&}
& && && && &&&public function get y():Number{
& && && && && && && &return _y;
& && && && &&&}
& && && && &&&
& && && && &&&public function set z(value:Number):void{
& && && && && && && &_z=
& && && && &&&}
& && && && &&&public function get z():Number{
& && && && && && && &return _z;
& && && && &&&}
& && & }
}
帖子18&积分5&技术分2 &来自China&在线时间6 小时&注册时间&
二、位图的3D化首先,获取位图的BitmapData(关于如何处理位图、Bitmap和BitmapData不是本文叙述的重点,如有相关方面疑问,请参看相关的AS帮助文档),然后进行行扫描或列扫描,将原图的BitmapData拷贝到新的坐标中,新的坐标将由图像的三维坐标x、y、z共同确定。新的BitmapData被设置成和场景一样大小,但实际上可以通过图形的长和宽对新的图形大小进行预测,这样可能会节省一部分内存开支,但实际拷贝图形的时候仅仅处理原图的所有点的像素,而与其他像素无关,所以,进行预测不会减少CPU的负担。另外,新的BitmapData的背景色必须是透明的,否则,未被新图像素覆盖的位置将出现不应该有的颜色。行扫描或列扫描实际上是对原图的拷贝,只是在拷贝的过程中考虑的新图像的z坐标,从而对新图像产生的影响,使之具有3D效果。处理位图的AS代码如下:
/**
& && && && && &* 只有平移而无旋转
& && && && && &* 扫描后直接进行坐标系统变换
& && && && && &*/
& && && && &&&public function BitMap3D(_Image:Bitmap,_BitMapPoint:Point3):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &//进行行扫描
& && && && && && && &BitPoint3D.z=_BitMapPoint.z;
& && && && && && && &for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && & BitPoint3D.y=
& && && && && && && && && & for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && && && &&&BitPoint3D.x=
& && && && && && && && && && && &&&Pbit=point3D(BitPoint3D);
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}复制代码这段代码同样会被封装到S3D类中。这段代码同时实现了位图的三维平移。 三、3D旋转三维空间中的物体变换通常需要经过 平移—绕x、y或z轴旋转—再平移 的过曾,如果能够给出绕平行于x、y或z坐标轴的轴旋转公式,则上述过程变为,平移—绕平行于某个坐标轴的轴旋转。这些过程的组合将产生千变万化的效果。首先先给出一个点绕平行于Y轴的轴旋转公式:x'=(x-xc)*CosC-(z-zc)*SinC+y'=y;z'=(z-zc)*CosC+(x-xc)*SinC+其中C为点与旋转轴所在平面与xy平面的夹角,xc、zc为转轴坐标。绕平行于其他坐标轴的的轴旋转公式类似,不再赘述。关于该公式的推到,可以参考图 3-1: 图 3-1 P点绕Y轴旋转其中P点x=r*CosC,z=r*SinC,r为旋转半径如果再旋转一个角度C',则有x'=r*Cos(C+C');z'=r*Sin(C+C');图中点P的y坐标不变,有y'=y。展开x有x'=r*CosC*CosC'-r*SinC*SinC';将x和z带入有x'=x*CosC'-z*SincC';考虑到平行于Y轴的轴为Y轴的平移,则需要对应的减去转轴的坐标,得到x'-xc=(x-xc)*CosC-(z-zc)*SinC;于是有x'=(x-xc)*CosC-(z-zc)*SinC+同样可得到z'=(z-zc)*CosC+(x-xc)*SinC+看一下绕平行于Y的点轴旋转AS代码 /**
& && && && && &* 绕与Y轴平行的轴旋转,以下的绕平行与X轴和平行与Z轴的轴旋转类似,只是公式有些变化
& && && && && &* 需要该轴在3D坐标系统中的x、z坐标为参数以确定转轴位置
& && && && && &* 需要旋转角度的 cos 和 sin 值为参数,在以相同角度旋转多个点时,不需要重复计算该角度的三角函数
& && && && && &* 需要所旋转点的三维坐标为参数
& && && && && &* Y坐标值不变
& && && && && &* 返回二维坐标
& && && && && &*/
& && && && &&&public function RotationY(_xc:Number,_zc:Number,_CosC:Number,_SinC:Number,value:Point3):Point{
& && && && && && && &//应用坐标变换公式
& && && && && && && &var _Rx:Number=(value.x-_xc)*_CosC-(value.z-_zc)*_SinC+_
& && && && && && && &var _Rz:Number=(value.z-_zc)*_CosC+(value.x-_xc)*_SinC+_
& && && && && && && &//变换x、z值
& && && && && && && &value.x=_Rx;
& && && && && && && &value.z=_Rz;
& && && && && && && &//应用坐标系统变换并返回二维坐标
& && && && && && && &return point3D(value);
& && && && &&&}复制代码其中CosC和SinC有可能重复调用,而有不需要重复计算,所以在外部计算好后作为RotationY方法的参数。_xc和_zc是转轴坐标,value为所要旋转的点三维坐标。下面看一下如何使位图进行绕平行于Y的轴旋转的:
/**
& && && && && &* 实现位图的绕平行于Y轴的轴旋转,以下实现绕平行于绕X轴的轴旋转和绕平行于Z轴的轴旋转方法类似,只是部分公式和扫描循环不同
& && && && && &* 注释掉的部分为应用视觉变换的部分,该部分计算出垂直与视线的平面与场景平面的夹角,并应用该角度
& && && && && &* 如果打算使用视觉变换,需要注释掉变换部分的下两行
& && && && && &* 需要位图初始位置的三维坐标为参数
& && && && && &* 需要转轴的三维坐标为参数
& && && && && &*/
& && && && &&&public function BitMapRotation3DY(_Image:Bitmap,_BitMapPoint:Point3,_Rx:Number,_Rz:Number,_Ra:Number):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &//位图上某一点的x、y坐标
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &//需要确定的新三维坐标
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &//应用坐标变换所获得的二维坐标
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &//调用位图高度与宽度再加上初始位置所对应的偏移量,从而获得扫描循环的上限
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &/*var WidthPer2:Number=_bitmapData.width/2;
& && && && && && && &var _Rr2:Number=Math.pow((_O.x-_BitMapPoint.x),2)+Math.pow((_D+_BitMapPoint.z),2);
& && && && && && && &var _Rr:Number=Math.sqrt(_Rr2);
& && && && && && && &var _Sinr:Number=(_O.x-_BitMapPoint.x)/_Rr;
& && && && && && && &var _Cosr:Number=(_D+_BitMapPoint.z)/_Rr;
& && && && && && && &var _Sinb:Number=WidthPer2/_Rr;
& && && && && && && &var _Cosb:Number=Math.sqrt(_Rr2-Math.pow(WidthPer2,2))/_Rr;
& && && && && && && &
& && && && && && && &var _Cosa:Number=_Cosr*_Cosb+_Sinr*_S
& && && && && && && &var _Sina:Number=_Sinr*_Cosb-_Cosr*_S
& && && && && && && &
& && && && && && && &var _CosRa:Number=Math.cos(_Ra);
& && && && && && && &var _SinRa:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &var _CosC:Number=_CosRa*_Cosa-_SinRa*_S
& && && && && && && &var _SinC:Number=_SinRa*_Cosa+_CosRa*_S*/
& && && && && && && &
& && && && && && && &//应用该两行或者应用以上注释掉的代码
& && && && && && && &var _CosC:Number=Math.cos(_Ra);
& && && && && && && &var _SinC:Number=Math.sin(_Ra);
& && && && && && && &//进行行扫描输出新的点坐标,以初始位置为循环下限
& && && && && && && &for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && & //在外层循环赋值,避免在内层循环中多次赋值
& && && && && && && && && & BitPoint3D.y=
& && && && && && && && && & for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && && && &&&BitPoint3D.x=
& && && && && && && && && && && &&&BitPoint3D.z=_BitMapPoint.z;
& && && && && && && && && && && &&&//输出位图的每个点经过3D管道后的二维坐标
& && && && && && && && && && && &&&Pbit=RotationY(_Rx,_Rz,_CosC,_SinC,BitPoint3D);
& && && && && && && && && && && &&&//获得对应点的 ARGB 颜色信息
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}复制代码该代码与将位图方知道三维空间中的代码类似,只是在计算每个像素新的坐标点的时候所调用的方法不同。代码中最上方注释掉的部分可有可无,加入这部分代码主要是因为方知道空间中的图形不出于视觉中心点O点极其在Z方向的延长线上的时候会与场景有一定的夹角 如图 3-2看到同样宽度或高度的图形实际上与XY平面构成了不同的角度,而这一夹角可以包含在旋转角度之中,也可以不包含于其中,唯一的影响只是初始化位置不同。 图 3-2 球形的视觉平面也就是说,实际的视觉面应该是球面而非二维场景的平面。由于这一部分的影响不是很大,所以是否使用该部分代码要看程序设计人员的喜好,但是加入该部分代码后将增加CPU的负担,尤其是具有多个运动的3D对象时。另外,在使用该部分代码时请注释掉其下的两行代码,既var _CosC:Number=Math.cos(_Ra)和var _SinC:Number=Math.sin(_Ra)。看一下静态三维空间中的图像效果: 图 3-3 由S3D生成的三维空间中的静态图像
帖子18&积分5&技术分2 &来自China&在线时间6 小时&注册时间&
四、遗留问题
以上所述只是简单3D的基础知识,关于三维空间中多边形,贴图,材质、光照和纹理等问题尚未涉及。空间中多个物体的相互遮挡涉及了Z缓存等方面问题也没有处理,但是已经给出了基本的3D问题处理方法。 五、S3D类Point3类的代码上文以给出,这里给出完整的S3D类代码:
package S3D{
& && &
& && & import S3D.Point3;
& && & import flash.geom.P
& && & import flash.display.B
& && & import flash.display.BitmapD
& && &
& && & public class S3D{
& && && && &&&private var _D:Number=new Number();
& && && && &&&//场景的宽与高
& && && && &&&private var _SWidth:Number=new Number();
& && && && &&&private var _SHeight:Number=new Number();
& && && && &&&//原点
& && && && &&&var _O:Point=new Point();
& && && && &&&
& && && && &&&/**
& && && && && &* S3D的构造函数,需要初始化场景的宽和高以确定视觉中心点的x、y坐标
& && && && && &* 通过场景宽度确定原点_O到场景的距离_D
& && && && && &*/
& && && && &&&public function S3D(_StageWidth:Number,_StageHeight:Number):void{
& && && && && && && &//初始化_D
& && && && && && && &_D=Math.tan(Math.PI*52.5/180)*_StageWidth/2;
& && && && && && && &//初始化场景宽与高
& && && && && && && &_SWidth=_StageW
& && && && && && && &_SHeight=_StageH
& && && && && && && &//初始化原点_O
& && && && && && && &_O.x=_StageWidth/2;
& && && && && && && &_O.y=_StageHeight/2;
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 将空间3D坐标换算到二维场景的x、y坐标
& && && && && &* 既实现三维坐标系到二维坐标系的变换
& && && && && &* 以一个三维坐标为参数,返回一个二维的坐标
& && && && && &*/
& && && && &&&public function point3D(value:Point3):Point{
& && && && && && && &var _point2D:Point=new Point();
& && && && && && && &//先运算_D/(_D+value.z)
& && && && && && && &//如果先运算(_O.x-value.x)*_D,再/(_D+value.z)时有可能会出现误差,尤其是在value.z=0时
& && && && && && && &_point2D.x=_O.x-(_O.x-value.x)*(_D/(_D+value.z));
& && && && && && && &//先算除法,原因同上
& && && && && && && &_point2D.y=_O.y-(_O.y-value.y)*(_D/(_D+value.z));
& && && && && && && &//返回2D坐标
& && && && && && && &return _point2D;
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 只有平移而无旋转
& && && && && &* 扫描后直接进行坐标系统变换
& && && && && &*/
& && && && &&&public function BitMap3D(_Image:Bitmap,_BitMapPoint:Point3):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &//进行行扫描
& && && && && && && &BitPoint3D.z=_BitMapPoint.z;
& && && && && && && &for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && & BitPoint3D.y=
& && && && && && && && && & for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && && && &&&BitPoint3D.x=
& && && && && && && && && && && &&&Pbit=point3D(BitPoint3D);
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 绕与Y轴平行的轴旋转,以下的绕平行与X轴和平行与Z轴的轴旋转类似,只是公式有些变化
& && && && && &* 需要该轴在3D坐标系统中的x、z坐标为参数以确定转轴位置
& && && && && &* 需要旋转角度的 cos 和 sin 值为参数,在以相同角度旋转多个点时,不需要重复计算该角度的三角函数
& && && && && &* 需要所旋转点的三维坐标为参数
& && && && && &* Y坐标值不变
& && && && && &* 返回二维坐标
& && && && && &*/
& && && && &&&public function RotationY(_xc:Number,_zc:Number,_CosC:Number,_SinC:Number,value:Point3):Point{
& && && && && && && &//应用坐标变换公式
& && && && && && && &var _Rx:Number=(value.x-_xc)*_CosC-(value.z-_zc)*_SinC+_
& && && && && && && &var _Rz:Number=(value.z-_zc)*_CosC+(value.x-_xc)*_SinC+_
& && && && && && && &//变换x、z值
& && && && && && && &value.x=_Rx;
& && && && && && && &value.z=_Rz;
& && && && && && && &//应用坐标系统变换并返回二维坐标
& && && && && && && &return point3D(value);
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 实现位图的绕平行于Y轴的轴旋转,以下实现绕平行于绕X轴的轴旋转和绕平行于Z轴的轴旋转方法类似,只是部分公式和扫描循环不同
& && && && && &* 注释掉的部分为应用视觉变换的部分,该部分计算出垂直与视线的平面与场景平面的夹角,并应用该角度
& && && && && &* 如果打算使用视觉变换,需要注释掉变换部分的下两行
& && && && && &* 需要位图初始位置的三维坐标为参数
& && && && && &* 需要转轴的三维坐标为参数
& && && && && &*/
& && && && &&&public function BitMapRotation3DY(_Image:Bitmap,_BitMapPoint:Point3,_Rx:Number,_Rz:Number,_Ra:Number):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &//位图上某一点的x、y坐标
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &//需要确定的新三维坐标
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &//应用坐标变换所获得的二维坐标
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &//调用位图高度与宽度再加上初始位置所对应的偏移量,从而获得扫描循环的上限
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &/*var WidthPer2:Number=_bitmapData.width/2;
& && && && && && && &var _Rr2:Number=Math.pow((_O.x-_BitMapPoint.x),2)+Math.pow((_D+_BitMapPoint.z),2);
& && && && && && && &var _Rr:Number=Math.sqrt(_Rr2);
& && && && && && && &var _Sinr:Number=(_O.x-_BitMapPoint.x)/_Rr;
& && && && && && && &var _Cosr:Number=(_D+_BitMapPoint.z)/_Rr;
& && && && && && && &var _Sinb:Number=WidthPer2/_Rr;
& && && && && && && &var _Cosb:Number=Math.sqrt(_Rr2-Math.pow(WidthPer2,2))/_Rr;
& && && && && && && &
& && && && && && && &var _Cosa:Number=_Cosr*_Cosb+_Sinr*_S
& && && && && && && &var _Sina:Number=_Sinr*_Cosb-_Cosr*_S
& && && && && && && &
& && && && && && && &var _CosRa:Number=Math.cos(_Ra);
& && && && && && && &var _SinRa:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &var _CosC:Number=_CosRa*_Cosa-_SinRa*_S
& && && && && && && &var _SinC:Number=_SinRa*_Cosa+_CosRa*_S*/
& && && && && && && &
& && && && && && && &//应用该两行或者应用以上注释掉的代码
& && && && && && && &var _CosC:Number=Math.cos(_Ra);
& && && && && && && &var _SinC:Number=Math.sin(_Ra);
& && && && && && && &//进行行扫描输出新的点坐标,以初始位置为循环下限
& && && && && && && &for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && & //在外层循环赋值,避免在内层循环中多次赋值
& && && && && && && && && & BitPoint3D.y=
& && && && && && && && && & for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && && && &&&BitPoint3D.x=
& && && && && && && && && && && &&&BitPoint3D.z=_BitMapPoint.z;
& && && && && && && && && && && &&&//输出位图的每个点经过3D管道后的二维坐标
& && && && && && && && && && && &&&Pbit=RotationY(_Rx,_Rz,_CosC,_SinC,BitPoint3D);
& && && && && && && && && && && &&&//获得对应点的 ARGB 颜色信息
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 绕与X轴平行的轴旋转
& && && && && &*/
& && && && &&&public function RotationX(_yc:Number,_zc:Number,_CosC:Number,_SinC:Number,value:Point3):Point{
& && && && && && && &var _Ry:Number=(value.y-_yc)*_CosC-(value.z-_zc)*_SinC+_
& && && && && && && &var _Rz:Number=(value.z-_zc)*_CosC+(value.y-_yc)*_SinC+_
& && && && && && && &
& && && && && && && &value.y=_Ry;
& && && && && && && &value.z=_Rz;
& && && && && && && &
& && && && && && && &return point3D(value);
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 实现位图的绕平行于X轴的轴旋转
& && && && && &*/
& && && && &&&public function BitMapRotation3DX(_Image:Bitmap,_BitMapPoint:Point3,_Ry:Number,_Rz:Number,_Ra:Number):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &/*var WidthPer2:Number=_bitmapData.width/2;
& && && && && && && &var _Rr2:Number=Math.pow((_O.y-_BitMapPoint.y),2)+Math.pow((_D+_BitMapPoint.z),2);
& && && && && && && &var _Rr:Number=Math.sqrt(_Rr2);
& && && && && && && &var _Sinr:Number=(_O.y-_BitMapPoint.y)/_Rr;
& && && && && && && &var _Cosr:Number=(_D+_BitMapPoint.z)/_Rr;
& && && && && && && &var _Sinb:Number=WidthPer2/_Rr;
& && && && && && && &var _Cosb:Number=Math.sqrt(_Rr2-Math.pow(WidthPer2,2))/_Rr;
& && && && && && && &
& && && && && && && &var _Cosa:Number=_Cosr*_Cosb+_Sinr*_S
& && && && && && && &var _Sina:Number=_Sinr*_Cosb-_Cosr*_S
& && && && && && && &
& && && && && && && &var _CosRa:Number=Math.cos(_Ra);
& && && && && && && &var _SinRa:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &var _CosC:Number=_CosRa*_Cosa-_SinRa*_S
& && && && && && && &var _SinC:Number=_SinRa*_Cosa+_CosRa*_S*/
& && && && && && && &
& && && && && && && &var _CosC:Number=Math.cos(_Ra);
& && && && && && && &var _SinC:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &//进行列扫描
& && && && && && && &for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && & BitPoint3D.x=
& && && && && && && && && & for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && && && &&&BitPoint3D.y=
& && && && && && && && && && && &&&BitPoint3D.z=_BitMapPoint.z;
& && && && && && && && && && && &&&Pbit=RotationX(_Ry,_Rz,_CosC,_SinC,BitPoint3D);
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 绕与Z轴平行的轴旋转
& && && && && &*/
& && && && &&&public function RotationZ(_xc:Number,_yc:Number,_CosC:Number,_SinC:Number,value:Point3):Point{
& && && && && && && &var _Rx:Number=(value.x-_xc)*_CosC-(value.y-_yc)*_SinC+_
& && && && && && && &var _Ry:Number=(value.y-_yc)*_CosC+(value.x-_xc)*_SinC+_
& && && && && && && &
& && && && && && && &value.x=_Rx;
& && && && && && && &value.y=_Ry;
& && && && && && && &
& && && && && && && &return point3D(value);
& && && && &&&}
& && && && &&&
& && && && &&&/**
& && && && && &* 实现位图的绕平行于Z轴的轴旋转
& && && && && &*/
& && && && &&&public function BitMapRotation3DZ(_Image:Bitmap,_BitMapPoint:Point3,_Rx:Number,_Ry:Number,_Ra:Number):Bitmap {
& && && && && && && &var _bitmapData:BitmapData=_Image.bitmapD
& && && && && && && &var BitDat3D:BitmapData=new BitmapData(_SWidth,_SHeight,true,0x);
& && && && && && && &var bitx:int=
& && && && && && && &var bity:int=
& && && && && && && &
& && && && && && && &var BitPoint3D:Point3=new Point3();
& && && && && && && &var Pbit:Point=new Point();
& && && && && && && &
& && && && && && && &var Height:Number=_BitMapPoint.y+_bitmapData.
& && && && && && && &var Width:Number=_BitMapPoint.x+_bitmapData.
& && && && && && && &
& && && && && && && &/*var WidthPer2:Number=_bitmapData.width/2;
& && && && && && && &var _Rr2:Number=Math.pow((_O.y-_BitMapPoint.y),2)+Math.pow((_D+_BitMapPoint.z),2);
& && && && && && && &var _Rr:Number=Math.sqrt(_Rr2);
& && && && && && && &var _Sinr:Number=(_O.y-_BitMapPoint.y)/_Rr;
& && && && && && && &var _Cosr:Number=(_D+_BitMapPoint.z)/_Rr;
& && && && && && && &var _Sinb:Number=WidthPer2/_Rr;
& && && && && && && &var _Cosb:Number=Math.sqrt(_Rr2-Math.pow(WidthPer2,2))/_Rr;
& && && && && && && &
& && && && && && && &var _Cosa:Number=_Cosr*_Cosb+_Sinr*_S
& && && && && && && &var _Sina:Number=_Sinr*_Cosb-_Cosr*_S
& && && && && && && &
& && && && && && && &var _CosRa:Number=Math.cos(_Ra);
& && && && && && && &var _SinRa:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &var _CosC:Number=_CosRa*_Cosa-_SinRa*_S
& && && && && && && &var _SinC:Number=_SinRa*_Cosa+_CosRa*_S*/
& && && && && && && &var _CosC:Number=Math.cos(_Ra);
& && && && && && && &var _SinC:Number=Math.sin(_Ra);
& && && && && && && &
& && && && && && && &//行扫描,由于z坐标没有变化,不需要在循环中为z赋值
& && && && && && && &BitPoint3D.z=_BitMapPoint.z;
& && && && && && && &for (bity=_BitMapPoint.y; bity&=H bity++) {
& && && && && && && && && & for (bitx=_BitMapPoint.x; bitx&=W bitx++) {
& && && && && && && && && && && &&&BitPoint3D.x=
& && && && && && && && && && && &&&BitPoint3D.y=
& && && && && && && && && && && &&&Pbit=RotationZ(_Rx,_Ry,_CosC,_SinC,BitPoint3D);
& && && && && && && && && && && &&&BitDat3D.setPixel32(Pbit.x,Pbit.y,_bitmapData.getPixel32(bitx-_BitMapPoint.x,bity-_BitMapPoint.y));
& && && && && && && && && & }
& && && && && && && &}
& && && && && && && &var BitMap3D:Bitmap=new Bitmap(BitDat3D);
& && && && && && && &return BitMap3D;
& && && && &&&}
& && & }
}复制代码附上源代码:
下载次数: 143
帖子6318&积分1079&技术分63 &在线时间3650 小时&注册时间&
很了不起,辛苦了.期待你在多边形,贴图,材质、光照和纹理方面有新的突破.并且能象PV3D那样流行.
不过我个人认为,你如果能在现有的FLASHCS4的3D类库基础上加以扩展,更有价值.可行的话,搞成插件之类的.
帖子297&积分57&技术分4 &在线时间210 小时&注册时间&
顶一个啊,嘻嘻,支持。
个人的类更实用。
如果我能让一个人不再痛苦,不再受折磨,或让一只迷途的知更鸟能再回巢,那麼就不枉我走人生一遭。
帖子6318&积分1079&技术分63 &在线时间3650 小时&注册时间&
个人的类更实用。
帖子4&积分1&技术分0 &在线时间4 小时&注册时间&
很不错&&!!
帖子18&积分5&技术分2 &来自China&在线时间6 小时&注册时间&
CS3也是刚入门,CS4接触比较少,可以试一试。光晕、材质等方面还在陆续学习中。}

我要回帖

更多关于 flash引导层 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信