`

[转]使用CS4的新增类实现全景图效果

阅读更多
http://uh.9ria.com/space-12147-do-blog-id-5759.html

全景图原理其实很简单,就是将做好的球面贴图贴在一个圆的内部,然后将摄像机放在圆的中间观看,由于视差而产生的现象。因此,只要使用3D引擎的话,制作一个全景系统是很简单的(创建球体,贴上贴图,然后放置摄像机到原点就可以)

但是仅仅是一个全景显示就去搬pv3D这样一个大家伙过来有些小题大做。FLASH3D其实都是将位图打碎成三角形,然后对每个三角形做矩阵变换,并通过绘制三角形到元件的方式实现的。明白这一点就可以自己做。CS4之后提供了原生的3D转换和批量绘制三角形的drawTriangles方法以及许多关于3D矢量的数学公式,大大简化了这个过程(但drawTriangles的使用方法确实难以掌握)

http://code.google.com/p/ghostcat/source/browse/trunk/ghostcatfp10/src/ghostcat/display/g3d/GBitmapSphere.as

这个类实际上是一个绘制球体的类,传入位图贴图,半径,面数之后,修改其matrix3d属性并执行render方法后,就会绘制出一个3D的球体。我们要制作全景效果,只要将它的culling属性设为显示内部TriangleCulling.NEGATIVE,然后将圆的半径设置得足够大,看起来就像是在球体内部了。

值得一提的是,这样制作的全景系统将只有1.8K。而且因为省掉了排序等等多余的操作,效率会有一定提高。

之后会再说说全景中热点的实现方法。







package ghostcat.display.g3d
{
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.display.TriangleCulling;
        import flash.geom.Matrix3D;
        import flash.geom.Point;
        import flash.geom.Vector3D;

        /**
         * 位图贴图球体
         *  
         * @author flashyiyi
         * 
         */
        public class GBitmapSphere extends Sprite
        {
                /**
                 * 贴图
                 */
                public var material:BitmapData;
                
                private var vertsVec:Vector.<Vector.<Vector3D>>;
                
                /**
                 * 转换矩阵 
                 */
                public var matrix3D:Matrix3D;
                /**
                 * 半径
                 */
                public var radius:Number;
                
                /**
                 * 显示内部/外部
                 */
                public var culling:String;
                
                /**
                 * 贴图平滑
                 */
                public var smooth:Boolean;
                
                private var nMesh:Number;
                private var vertices:Vector.<Number>;
                private var indices:Vector.<int>;
                private var uvtData:Vector.<Number>;
                
                public function GBitmapSphere(material:BitmapData,radius:Number = 100, nMesh:int = 30)
                {
                        this.material = material;
                        this.radius = radius;
                        this.nMesh = nMesh;
                        this.matrix3D = new Matrix3D();
                        this.culling = TriangleCulling.POSITIVE;
                        
                        setVertsVec();
                        render();
                }
                
                /**
                 * 创建多边形
                 * 
                 */
                protected function setVertsVec():void
                {
                        var i:int;
                        var j:int;
                        var istep:Number;
                        var jstep:Number;
                        
                        istep=2*Math.PI/nMesh;
                        jstep=Math.PI/nMesh;
                        
                        this.vertsVec=new Vector.<Vector.<Vector3D>>();
                        
                        for(i=0;i<=nMesh;i++)
                        {
                                var vector:Vector.<Vector3D> = new Vector.<Vector3D>();
                                for(j=0;j<=nMesh;j++)
                                {
                                        vector[j]=new Vector3D(radius*Math.sin(istep*i)*Math.sin(jstep*j),-radius*Math.cos(jstep*j),-radius*Math.cos(istep*i)*Math.sin(jstep*j));
                                }
                        
                                vertsVec[i] = vector;
                        }
                        
                        indices = new Vector.<int>();
                        uvtData = new Vector.<Number>();
                        
                        var curVertsNum:int=0;
                        for(i=0;i<nMesh;i++)
                        {
                                for(j=0;j<nMesh;j++)
                                {
                                        indices.push(curVertsNum,curVertsNum+1,curVertsNum+3,curVertsNum+1,curVertsNum+2,curVertsNum+3);
                                        uvtData.push(i/nMesh,j/nMesh,(i+1)/nMesh,j/nMesh,(i+1)/nMesh,(j+1)/nMesh,i/nMesh,(j+1)/nMesh);
                                        curVertsNum += 4;
                                }
                        }
                }
                
                /**
                 * 旋转矩阵并渲染 
                 * @param rotx
                 * @param roty
                 * @param rotz
                 * 
                 */
                public function rotate(rotx:Number,roty:Number,rotz:Number):void
                {
                        matrix3D.appendRotation(rotx,Vector3D.X_AXIS);
                        matrix3D.appendRotation(roty,Vector3D.Y_AXIS);
                        matrix3D.appendRotation(rotz,Vector3D.Z_AXIS);
                }
                
                /**
                 * 重置旋转
                 * 
                 */
                public function reset():void
                {
                        matrix3D = new Matrix3D();
                }
                
                /**
                 * 根据矩阵渲染图像 
                 * 
                 */
                public function render():void
                {
                        vertices = new Vector.<Number>();
                        for(var i:int = 0;i<nMesh;i++)
                        {
                                for(var j:int = 0;j<nMesh;j++)
                                {
                                        var curv0:Vector3D = matrix3D.deltaTransformVector(vertsVec[i][j]);
                                        var curv1:Vector3D = matrix3D.deltaTransformVector(vertsVec[i+1][j]);
                                        var curv2:Vector3D = matrix3D.deltaTransformVector(vertsVec[i+1][j+1]);
                                        var curv3:Vector3D = matrix3D.deltaTransformVector(vertsVec[i][j+1]);
                                        
                                        vertices.push(curv0.x,curv0.y,curv1.x,curv1.y,curv2.x,curv2.y,curv3.x,curv3.y);
                                }
                        }
                        
                        graphics.clear();
                        
                        if (material)
                                graphics.beginBitmapFill(material,null,false,smooth);
                        
                        graphics.drawTriangles(vertices,indices,uvtData,culling);
                        graphics.endFill();
                }
        }
}
分享到:
评论

相关推荐

    PHOTOSHOP CS4语言包

    4. **自动校正**:新增了更精确的自动校正功能,如“光照效果”和“镜头校正”,可以快速修复照片的曝光、对比度和失真问题。 5. **画布旋转**:用户可以自由旋转画布,适应各种角度的编辑需求,特别是处理全景图片...

    PS_CS4新增功能.pdf

    Adobe Photoshop CS4 Extended 是一款强大的图像处理软件,它在原有的Photoshop CS4基础上增加了许多创新功能,尤其在3D图像处理、动态内容编辑以及高级图像分析方面。以下是一些主要的新特性: 1. **3D上色和构图...

    PhotoshopCS4课件

    - **拼合全景图像**:支持多张照片拼合成一张全景图,适用于风景摄影等场景。 - **景深混合**:通过混合不同焦距的照片来创建深度效果。 - **智能对象**:支持非破坏性编辑,可以在保留原始图像的同时进行调整。 - *...

    Photoshop.CS3功能介绍

    - **自动对齐图层**:对于拼接照片或创建全景图非常有用,可以自动调整和对齐多个图像。 - **黑白转换**:新增了黑白转换功能,可以精确控制图像的灰度效果。 - **改进的曲线调整**:提供更精细的色彩和亮度调整选项...

    Photoshop.CS5入门到高级.iso

    2. **全景合并功能**:允许用户将多张照片合并成一张高质量的全景图,非常适合风景拍摄。 3. **高动态范围(HDR)成像**:通过合并不同曝光级别的照片来创建具有更宽广亮度范围的图像。 4. **智能对象**:这是一种特殊...

    Photoshop CS3

    - **图层管理**:Photoshop CS3支持多图层编辑,允许用户在不破坏原始图像的情况下进行各种操作,如调整、添加效果或隐藏/显示特定部分。 - **滤镜和效果**:内含丰富的滤镜库,可以为图像添加各种艺术效果,如...

    Photoshop CS3图像处理200例

    3. **自动混合图层:** 该功能可以将多个图像自动合并成一个无缝的全景图,非常适合制作宽广视角的照片。 4. **改进的用户界面:** Photoshop CS3对用户界面进行了优化,提供了更直观的操作流程,便于用户快速找到所...

    photoshop帮助文档

    - **使用Photomerge创建全景图像**:指导用户如何将多张照片拼接成一张宽广的全景图。 #### 第8章:选区和蒙版 - **选择和遮罩技术**:本章重点在于如何精确地选择目标区域以及如何使用蒙版隐藏不需要的部分。 - *...

    ps图像处理案件教程分解PPT学习教案.pptx

    - **快速选择工具**:提升选择精度,特别是在处理复杂边界如发丝和羽毛时,新增优化边缘功能,可微调选区并实时预览。 4. **其他重要概念** - **矢量图形与位图图像的区别**:矢量图基于数学公式,无限放大不失真...

    变电站智能管家—变电运维班辅助设备监控系统.pdf

    实现对变电站重要设备的环境量、物理量、状态量、电气量、行为量进行实时采集,并全面融合运检专业多源系统数据,实现设备本体及运行环境的深度感知、风险预警和全景展示;实现对视频监控、动环监测、安全防范、门禁...

    某大学云数据中心建设方案 (2).docx

    (2) 智慧校园全景图,则以可视化方式描绘了校园各系统间的相互关系,以及与外部环境的交互。 第二章深入探讨了云数据中心的详细设计。总体架构设计包括逻辑架构和物理架构两部分。逻辑架构关注服务层面的划分,如...

    变电站智能管家—变电运维班辅助设备监控系统.docx

    2. 实现对变电站重要设备的环境量、物理量、状态量、电气量、行为量进行实时采集,并全面融合运检专业多源系统数据,实现设备本体及运行环境的深度感知、风险预警和全景展示,主动触发多参量和多设备间的联合分析并...

Global site tag (gtag.js) - Google Analytics