Flash3D 全景开发一

我们首先熟悉一个函数的使用drawTriangles,drawTriangles字面理解,就是画三角形,当然adobe不会因为你需要画三角形才给你提供这个方法吧,其真正的作用是通过快速批量的画三角形来实现位图的扭曲。我们所有的图形都可以用三角片来表示,不管是平面和三维图形,通过三角片,可以模拟出任何图形,如下图:

drawTriangles是我们开发全景浏览器的基础,drawTriangles的定义如下:

public function drawTriangles(vertices:Vector.<Number>, indices:Vector.<int> = null, uvtData:Vector.<Number> = null, culling:String = "none"):void

  • vertices:Vector.<Number>

由数字构成的矢量,其中的每一对数字将被视为一个坐标位置(一个 x, y 对)。vertices 参数是必需的。

  • indices:Vector.<int> (default = null)

一个由整数或索引构成的矢量,其中每三个索引定义一个三角形。如果 indexes 参数为 null,则每三个顶点(vertices 矢量中的 6 对 x,y)定义一个三角形。否则,每个索引将引用一个顶点,即 vertices 矢量中的一对数字。例如,indexes[1] 引用 (vertices[2], vertices[3])。indexes 参数是可选的,但 indexes 通常会减少提交的数据量和计算的数据量。

由用于应用纹理映射的标准坐标构成的矢量。每个坐标引用用于填充的位图上的一个点。每个顶点必须具有一个 UV 或一个 UVT 坐标。对于 UV 坐标,(0,0) 是位图的左上角,(1,1) 是位图的右下角。

如果此矢量的长度是 vertices 矢量长度的两倍,则使用标准坐标而不进行透视校正。

如果此矢量的长度是 vertices 矢量长度的三倍,则将第三个坐标解释为“t”(即在视角空间中从视点到纹理的距离)。这有助于呈现引擎在三维中映射纹理时正确应用透视。

如果 uvtData 参数为 null,则将应用普通填充规则(和任何填充类型)。

  • culling:String (default = "none")

指定是否呈现面向指定方向的三角形。此参数可防止呈现在当前视图中看不见的三角形。此参数可设置为由 TriangleCulling 类定义的任何值。

1. vertices的使用

我们看看drawTriangles如何使用,看以下代码:

public function MiPanoTest()

{
     var ver:Vector.<Number>=new Vector.<Number>(); 
     ver.push(200,0); 
     ver.push(0,200);//记录坐标x,y坐标点 
     ver.push(400,200); 
     #效果1 this.graphics.beginFill(0x00ccff);

#效果2 this.graphics.beginBitmapFill((new texture() as Bitmap).bitmapData)
     this.graphics.drawTriangles(ver); 
     this.graphics.endFill();

}

其显示效果如下:

以上只是drawTriangles的小试牛刀,我们看看如何将图片放入三角片中,上面的案例,我们只指定了三个顶点,所以图形会以默认方式呈现,下面我们将顶点的数量增加到9个,切每个点的距离是50,且平均排列,代码如下:

public class MiPanoTest extends Sprite

{
     [Embed(source="assets/img.jpg")]
     public var texture:Class; 
    
     public function MiPanoTest()
     {
         var row:int=3;
         var cell:int=3;
         var step:int=50;
        
         var vertexs:Vector.<Number>=new Vector.<Number>();
        
         //定义了一个50区间的9格方格
         for(var i:int=0;i<row;i++){
             for(var j:int=0;j<cell;j++){
                
                 vertexs.push(i*step,j*step);
             }
         }
        
         //下一步,我们计算三角片的组成
         this.graphics.beginBitmapFill((new texture() as Bitmap).bitmapData)
         this.graphics.drawTriangles(vertexs); 
         this.graphics.endFill();
        
        
     }

}

我们看到的结果是一片空白,什么都没有绘制,是什么原因呢?

2. indices的使用

原因是在前面的案例,我们只有三个顶点,所以drawTriangles通过三个顶点就可以构件一个面,而本案例有9个顶点,系统根本不知道那些点能组合成三角片,所以会出现一个三角片都没有,无法绘制出图形,那么这个就是第二个参数indices的,告诉系统如何组织三角片,我们上面添加了9个顶点,系统会按照两个一组,进行编号,然后把这些顶点划分三角片,如下图所示:

我们可以知道indices是记录顶点的索引位置那么,组合的三角形可以定义如下:

(0,1,3)

(1,3,4)

(1,2,4)

(2,4,5)

(3,4,6)

(4,6,7)

(4,5,7)

(5,7,8)

注意其排列循序,组成一个正方形网格的三角片0,1,3和1,3,4,结果上面的划分,我们定义代码如下:

public class MiPanoTest extends Sprite

{
     [Embed(source="assets/img.jpg")]
     public var texture:Class; 
    
     public function MiPanoTest()
     {
         var row:int=3;
         var cell:int=3;
         var step:int=100;
        
         var vertexs:Vector.<Number>=new Vector.<Number>();
         var indices:Vector.<int>=new Vector.<int>();
         //定义了一个50区间的9格方格
         for(var i:int=0;i<row;i++){
             for(var j:int=0;j<cell;j++){
                
                 vertexs.push(i*step,j*step);
             }
         }
         indices.push(0,1,3)
         indices.push(1,3,4)
         indices.push(1,2,4)
         indices.push(2,4,5)
         indices.push(3,4,6)
         indices.push(4,6,7)
         indices.push(4,5,7)
         indices.push(5,7,8)
         //下一步,我们计算三角片的组成
         this.graphics.lineStyle(1,0x000000,1);
         this.graphics.beginBitmapFill((new texture() as Bitmap).bitmapData)
         this.graphics.drawTriangles(vertexs,indices); 
         this.graphics.endFill();
        
        
     }

}

其显示效果如下:

我们赋值三角片的划分规则以后,图形终于显示出来了,图形是出来了,但是这个和正常的图片绘制有什么区别,区别就是我们改变一下坐标顶点的位置试试,我们将上面的图形编程一个梯形样式,代码如下:

public class MiPanoTest extends Sprite
     {
         [Embed(source="assets/img.jpg")]
         public var texture:Class; 
        
         public function MiPanoTest()
         {
             var row:int=3;
             var cell:int=3;
             var step:int=100;
            
             var vertexs:Vector.<Number>=new Vector.<Number>();
             var indices:Vector.<int>=new Vector.<int>();
             //定义了一个50区间的9格方格
             for(var i:int=0;i<row;i++){
                 for(var j:int=0;j<cell;j++){
                    
                     var offset:Number=0;
                     if(j==0){
                         offset=20*(row-i);
                     }else if(j==1){
                         offset=0
                     }else{
                         offset=-20*(row-i);
                     }
                    
                     vertexs.push(j*step+offset,i*step);
                 }
             }
             indices.push(0,1,3)
             indices.push(1,3,4)
             indices.push(1,2,4)
             indices.push(2,4,5)
             indices.push(3,4,6)
             indices.push(4,6,7)
             indices.push(4,5,7)
             indices.push(5,7,8)
             //下一步,我们计算三角片的组成
             this.graphics.lineStyle(1,0x000000,1);
             this.graphics.beginBitmapFill((new texture() as Bitmap).bitmapData)
             this.graphics.drawTriangles(vertexs,indices); 
             this.graphics.endFill();
            
            
         }
     }

我们看一下显示效果如下:

我们看到,虽然三角形的位置发生了变化,但是图形还是原来的图形,只是没有在三角形内部的部分,没有显示,这里,我们就要说明第三个参数uvtData的含义,他记录的是每个顶点所占的贴图的比例,从0~1,如图:

我们要把一个完整的图形显示在当前的这个梯形内部,则我们要设置每个点的UV比例,由于每个顶点都有UV两个方向(T暂时放着)uvtData数组的长度应该是vertices的两倍,所以,对以上的案例代码稍作修改如下:

public class MiPanoTest extends Sprite

{
     [Embed(source="assets/img.jpg")]
     public var texture:Class; 
    
     public function MiPanoTest()
     {
         var row:int=3;
         var cell:int=3;
         var step:int=100;
        
         var vertexs:Vector.<Number>=new Vector.<Number>();
         var indices:Vector.<int>=new Vector.<int>();
         var uvtData:Vector.<Number>=new Vector.<Number>();
         //定义了一个50区间的9格方格
         for(var i:int=0;i<row;i++){
             for(var j:int=0;j<cell;j++){
                
                 var offset:Number=0;
                 if(j==0){
                     offset=20*(row-i);
                 }else if(j==1){
                     offset=0
                 }else{
                     offset=-20*(row-i);
                 }
                
                 vertexs.push(j*step+offset,i*step);
             }
         }
         indices.push(0,1,3)
         indices.push(1,3,4)
         indices.push(1,2,4)
         indices.push(2,4,5)
         indices.push(3,4,6)
         indices.push(4,6,7)
         indices.push(4,5,7)
         indices.push(5,7,8)
         uvtData.push(0,0,0.5,0,1,0,0,0.5,0.5,0.5,1,0.5,0,1,0.5,1,1,1);
         //下一步,我们计算三角片的组成
         this.graphics.lineStyle(1,0x000000,1);
         this.graphics.beginBitmapFill((new texture() as Bitmap).bitmapData)
         this.graphics.drawTriangles(vertexs,indices,uvtData); 
         this.graphics.endFill();
        
        
     }

}

显示效果如下:

我们把一个完整的图形在多个三角网格中显示出来了。

时间: 2024-10-14 10:46:23

Flash3D 全景开发一的相关文章

【Photo Sphere Viewer】基于threeJs的全景插件

[参考网址] vue全景图photo-sphere-viewer的使用以及改变图片 360全景图three.js与Photo-Sphere-Viewer全景开发 原文地址:https://www.cnblogs.com/wannananana/p/12427383.html

【krpano】淘宝buy+案例

这是一个类似淘宝buy+的案例,是基于krpano全景开发工具二次开发的全景视频.WebVR.360°环物.全景视频热点添加于一身的综合性案例.现在将案例上传网站供krpano技术人员和爱好者大家共同研究学习. 淘宝buy+案例链接地址链接:http://pan.baidu.com/s/1qYGt2Eg 密码:vj6z 案例截图: 本博文发表于:http://www.krpano.tech/archives/210 发布者:Mr.huh123 转载请注明出处,谢谢!

WP8.1学习系列(第十二章)——全景控件Panorama开发指南

2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1 全景体验是本机 Windows Phone 外观的一部分.与旨在适合手机屏幕边界的标准应用不同,全景应用通过使用超出屏幕边界的长水平画布提供了一个查看控件.数据和服务的独特方式.这些固有的动态视图使用分层动画和内容,以便各层以不同的速度流畅地平移,类似于视差效果. 本主题包括以下部分. 全景控件概述 导航支持 全景应用功能 相关

【Android开发VR实战】二.播放360&amp;#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种能够创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,怎样在Android中去开发VR功能的APP

【Android开发VR实战】二.播放360&#176;全景视频

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发VR实战]二.播放360°全景视频 VR即Virtual Reality虚拟现实.虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中. 那么,如何在Android中去开发VR功能的APP

&lt;WP8开发学习笔记&gt;修改panorama全景控件的标题的大小

panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phone:Panorama Title="我的应用程序" FontSize="30"> <phone:Panorama.Background> <ImageBrush ImageSource="/PanoramaApp3;component/

《Nodejs开发加密货币》之十二:静态网站开发全景扫描

前言 在前面的入门部分,介绍了Nodejs在前端开发中的应用,并通过具体项目说明了Nodejs在比特币客户端领域被广泛应用.当时为了介绍Nodejs入门技术,一切都是从头创建,没有引入前端框架.但在具体的项目实践中,前端是有框架可以选择的,效率和体验会有明显提升. 具体到前端框架,我的选择是Ember.js.Ember给开发带来一种飞一般的感觉,如果问前端框架哪家强,我会毫不犹豫的说Ember.(具体为什么,网上仍然争论不休,本文不做讨论) 本文重点介绍静态网站的类型,亿书官网的技术选型,以及在

360全景,专业的全景公司都需要这样去做

随着微信用户的不断增长,微信的普及率已越来越高,微信用户的爆炸性增长同时带动了微信营销的兴起,微营销成为了继网络营销以后另一大产品服务的销售渠道.微信商家号-微信公众平台的拓展功能也是越来越强大!做为微信平台的一大亮点:360全景展示也横空出世,那到底什么是微信360全景呢,专业360全景制作公司酷雷曼今天就和大家分享一些这方面的知识! 简单的说就是360全景依托微信平台,借助手机移动终端全方位展示企业单位或者房产.景区.酒店.家具馆.厂区等,给人以身临其境的感觉!不用到现场,就要以通过移动终端

最大的幻术-游戏开发-到底是先学游戏引擎还是先学游戏编程

学习游戏的目的 我们学习游戏制作,游戏开发,游戏编程,游戏XX,我们的目的只有一个,打造一个非常牛逼,非常屌,非常让人开心的虚拟体验.我们用自己的学识让玩家在虚拟世界征战,生活,一步一步的让玩家幸福!那么我们的目的只有一个,让玩家知道自己的幸福在哪里,并且学会追求自己的幸福.当然,每个人对幸福的定义不一样.那么,我们只好让玩家来体验我们所来表达的最通俗的,最普遍的幸福体验,然后慢慢引导玩家去寻找自己的幸福体验.可能,在最后玩家都会离开游戏,离开虚拟世界,(对,这是真的,玩家需要一步一步达到定点,