(2011-12-11 旧博文搬运)away3d太阳系DEMO

away3d制作的简易太阳系演示,不要吐槽数据不太符合实际,那些靠边的行星公转周期都是以世纪为单位的,我不加快一点就根本看不出它们是在运动还是罢工了。。。LOL。边上那个哈雷彗星就当没看见吧,实在太丑了,只是为了尝试一下ay3d的flint粒子才用的,不用的话估计帧频还能再高一点: )

直接上swf:(鼠标点击某个行星可以以它为中心、滚轮可以调节摄像机距离,如果滚轮和网页的滚动条冲突了可以把鼠标移到你的任务栏或者网页的标题栏再滚动就OK了)

可能由于安全沙箱问题读不出swf的话,直接走传送门:






(2011-12-11 旧博文搬运)away3d太阳系DEMO_第1张图片

(2011-12-11 旧博文搬运)away3d太阳系DEMO_第2张图片

一些总结:

1、想给行星画上轨道,在API文档找了半天没找到画圆的类,不过找到了cuver类,好吧,虽然有点麻烦不过用功cuver写了一个3d圆类,椭圆的话就对这个对象进行scaleX、Y就可以了,因为这个自定义类画的圆是处在XY面上的,z轴缩放就用不到了。

下面是这个画圆类:

package base
{
    import away3d.containers.ObjectContainer3D;
    import away3d.core.base.Vertex;
    import away3d.materials.ColorMaterial;
    import away3d.materials.WireframeMaterial;
    import away3d.primitives.CurveLineSegment;
    
    public class Circle3D extends ObjectContainer3D
    {
        private var points:Vector.<Vertex> = new Vector.<Vertex>();
        private var ctrls:Vector.<Vertex> = new Vector.<Vertex>();
        private var curves:Vector.<CurveLineSegment> = new Vector.<CurveLineSegment>();
        
        
        public function Circle3D(xpos:Number,ypos:Number,zpos:Number,r:Number,color:uint=0xCCCCCC,thickness:int = 1)
        {
            super();
            var x:int,y:int,z:int;
            
            var material:WireframeMaterial = new WireframeMaterial();
            material.wireColor = color;
            material.thickness = thickness;
            
            points.push(new Vertex(r+x,y));
            ctrls.push( new Vertex(r+x, Math.tan(Math.PI/8)*r+y));
            points.push( new Vertex(Math.cos(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y));
            ctrls.push( new Vertex(Math.tan(Math.PI/8)*r+x, r+y));
            points.push( new Vertex(x, r+y));
            ctrls.push( new Vertex(-Math.tan(Math.PI/8)*r+x, r+y));
            points.push( new Vertex(-Math.cos(Math.PI/4)*r+x, Math.sin(Math.PI/4)*r+y));
            ctrls.push( new Vertex(-r+x, Math.tan(Math.PI/8)*r+y));
            points.push( new Vertex(-r+x, y));
            ctrls.push(new Vertex(-r+x, -Math.tan(Math.PI/8)*r+y));
            points.push( new Vertex(-Math.cos(Math.PI/4)*r+x, -Math.sin(Math.PI/4)*r+y));
            ctrls.push( new Vertex(-Math.tan(Math.PI/8)*r+x, -r+y));
            points.push( new Vertex( x, -r+y));
            ctrls.push( new Vertex(Math.tan(Math.PI/8)*r+x, -r+y));
            points.push( new Vertex(Math.cos(Math.PI/4)*r+x,-Math.sin(Math.PI/4)*r+y));
            ctrls.push( new Vertex(r+x, -Math.tan(Math.PI/8)*r+y));
            
            var i:int = 0;
            var j:int;
            while(i<=7){
                if(i==7){
                    j=0;
                }else{
                    j=i+1;
                }
                curves.push(new CurveLineSegment(points[i],ctrls[i],points[j],material));
                this.addChild(curves[i]);
                i++;
                
            }
            
            this.x = xpos;
            this.y = ypos;
            this.z = zpos
            
    
        }
        
        public function set ZOffset(z:Number):void{
            var i:int = 0;
            for(;i<=7;i++){
                curves[i].screenZOffset = z;
            }
        }
        


    }
}

 

简单来说就是画8条曲线连成一个圆。

我给这个类加了一个额外的set方法:Zoffset。它是用来设置这个圆的z轴渲染位移的,其实就是给screenZoffset外面套了一层。比如当你设置

Zoffset = 1000;

也就是在渲染的时候把曲线的Z坐标假设增加了1000再渲染,我是用它来保证我的那些轨道线永远不会挡着球体。这个圆类是拓展ObjectContainer3D的,如果你直接设置它本身的screenZoffset是没有用的,这个值只影响自己,不影响他的子对象。

2、away3d导入外部模型的问题。 在3dsMax里面做个土星光环之类的圆环,如果给材质球设置成“面贴图”,那么我使用的位图就会贴在每一个面上而不是拉伸并铺在整个模型上。可是导出3DS之后再由away3d加载到swf里面来,就又变成拉伸的情况了。in为这个原因导致我没加上小行星带。我不知道有没有什么办法可以把材质球里面的那些设置导出成a3d可以识别的格式。。求解啊

3、内存占用高…2M多的swf文件,独立运行就占了200M的内存,而且还在慢慢增加。查了一下,内置的摄像机裁切类Clipping,虽然可以把视口以外的多余图形裁切掉,但是一用就掉帧,而且很容易把那些近处的但是还不应该消失的物体给裁切掉。效率问题也是其他flash3d类库的通病,不知道fp11的stage3d特性会带来怎样的提升,等年底away3d4.0正式版发布。


你可能感兴趣的:((2011-12-11 旧博文搬运)away3d太阳系DEMO)