`

[转] AS3 制作3D位图方法

阅读更多
http://bbs.9ria.com/viewthread.php?tid=82221&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000


当一张位图在空间中移动或旋转时,它在屏幕上的投影可能是任意的不规则的四边形。我们利用透视计算计算出投影到屏幕上的四边形的四个顶点的在屏幕上的坐标,用Graphics.beginBitmapFill(sourceBitmapData)、Graphics.moveTo和Graphics.lineTo,不能在不规则四边形内填充到完整的位图,这时我们会试着设置Graphics.beginBitmapFill()方法的第二个Matrix类参数,但是还是不能够填充得到完整的位图。虽然这样,但是不难发现,我们不能得到完整的位图填充,但是通过调整Graphics.beginBitmapFill()的Matrix参数,我们可以准确获得一半的位图。两个一半就是一了,而位图的一半就是一个三角形。任意的四边形都可以分成两个三角形,那么我们先画一个三角形填充一半的位图,再画另一个三角形填充另一半的位图,我们就能填充到完整的位图。向下面这样:

var triangle_a:Sprite=new Sprite

var triangle_b:Sprite=new Sprite

addChild(triangle_a)

addChild(triangle_b)



//drawTriangle 函数是用来为Sprite对象画三角形的

drawTriangle(triangle_a,sourceBitmapData, A,B,C)

drawTriangle(triangle_b,sourceBitmapData,D,E,F)



function drawTriangle(_target:Sprite,_sourceBitmapData:BitmapData,Aopint,Boint,Coint):void

{

  var _matrix:Matrix=new Matrix

  //……………………

  //Matrix的计算后面再说

  _target.graphics.clear()

  //为了看得清楚,可以加上下面这句

  //_target.graphics.lineStyle(1)

  _target.graphics.beginBitmapFill(_sourceBitmapData,_matrix)

  _target.graphics.moveTo(A.x,A.y)

  _target.graphics.lineTo(B.x,B.y)

  _target.graphics.lineTo(C.x,C.y)

  _target.graphics.lineTo(A.x,A.y)

}

Graphics.beginBitmapFill()方法中的Matrix类参数,是位图填充方式的关键。而Matrix类参数有a,b,c,d,tx,ty六个属性,我们要做的就是要把这六个属性的值计算出来。我们并不需要知道这六个参数各自的作用,我们只需要知道这六个属性组成了这样一个矩阵:

[ a,b,tx,

c,d,ty,

0,0,1]

Matrix类有这样的一个方法Matrix.transformPoint(_point:Point):Point{//….},先说说它是怎么工作的。根据我的理解,它函数代码大体上是这样的:



public function transformPoint(_point:Point):Point

{

var _x:Number=a * _point.x + c * _point.y + tx

var _y:Number=b * _point.x + d * _point.y + ty



return new Point(_x,_y)

}

我为什么要把这个方法写出来呢?细想一下,屏幕平面上的直角三角形形通过空间旋转和移动后,它在屏幕上的投影变成了非直角三角形,那么是否存在这样一个矩阵,使得屏幕平面上的直角三角形的三个顶点分别乘以该矩阵后,则使用矩阵的上述方法赋值后(则 _point=_matrix.transformPoint(_point)),与此直角三角形经过空间旋转和移动后在屏幕上的投影(非直角三角形)的三个顶点分别对应相等?由此问题我们可以列出两组三元一次方程。如下:

设屏幕平面上的直角三角形的三个顶点分别为:A(x1,y1),B(x2,y2),C(x3,y3), 此直角三角形经过空间旋转和移动后在屏幕上的投影(非直角三角形)的三个顶点分别为:_A(_x1,_y1),_B(_x2,_y2),_C(_x3,_y3)



综上所述有:



a * x1 + c * y1 + tx = _x1

b * x1 + d * y1 + ty = _y1



a * x2 + c * y2 + tx = _x2

b * x2 + d * y2 + ty = _y2



a * x3 + c * y3 + tx = _x3

b * x3 + d * y3 + ty = _y3



不难看出这是两组三元一次方程组:① a * x1 + c * y1 + tx = _x1  ②  b * x1 + d * y1 + ty = _y1

                                                 a * x2 + c * y2 + tx = _x2      b * x2 + d * y2 + ty = _y2

                                                 a * x3 + c * y3 + tx = _x3      b * x3 + d * y3 + ty = _y3



通过这两个方程出我们可以计算出这一矩阵的a、c、tx和b、d、ty。跑题太远了吧!这个矩阵与我们上面说到的位图填充有什么关系么?!Graphics.beginBitmapFill()方法的第二个参数是矩阵Matrix类型吧~。Graphics.beginBitmapFill()方法的第二个Matrix类的参数与我们上面计算出来的矩阵有什么联系么?当然有联系,上面计算出来的矩阵就是我们所要的矩阵,它就是我们能够完整填充三角形的关键!还是不太明白,为什么通过上面方程组计算出来的矩阵就可以做到完整的位图填充?

那我就依我理解简要说说吧。当你使用Graphics.beginBitmapFill(sourceBitmapData,matrix)进行位图填充时,位图上每一个像素的坐标都作出了相应的改变,而这种改变与使用matrix.transformPoint()方法后的效果一样。假定Point类p是为图上一个像素的坐标,改变Graphics.beginBitmapFill()的Matrix类参数为matrix,p的坐标变为q,而q就是使用matrix.transformPoint(p)方法赋值后的坐标,则q=matrix.transformPoint(p)。那么我们只要令改变后的坐标等于三角形的顶点就可以了。这就是两个方程组提出的依据,也是为什么我要提到Matrix.transformPoint()方法的原因。
分享到:
评论

相关推荐

    用AS3制作的3D菜单

    在本文中,我们将深入探讨如何使用...总的来说,用AS3制作3D菜单是一项挑战,需要对AS3语法、3D概念以及交互设计有深入的理解。这个项目为我们提供了一个实践和学习的机会,去探索如何将这些技术应用于实际项目中。

    flash as3.0 3D动态饼状图调用XML

    总的来说,Flash AS3.0制作3D动态饼状图调用XML数据是一项综合性的任务,涉及了ActionScript编程、图形绘制、3D转换、XML解析和交互设计等多个方面。通过熟练掌握这些技术,你可以创建出富有表现力的数据可视化工具...

    flash 3D照片墙

    本篇将深入探讨如何利用Flash ActionScript 3(AS3)实现一个3D照片墙的制作过程,以“小鸟3D照片墙X版”为例,揭示其背后的编程原理和技术要点。 首先,我们了解3D照片墙的基本概念。3D照片墙是指在二维平面上模拟...

    3D旋转地球flash源文件

    3. 图形优化:学习如何减少3D渲染对性能的影响,例如通过简化地球纹理或使用位图缓存等技巧。 4. 用户交互:如果源文件包含交互功能,可以研究如何添加鼠标或键盘事件来控制地球的旋转。 5. ActionScript编程:深入...

    flash+xml的3D效果焦点图代码

    6. 测试和优化:在Flash的测试环境下进行测试,确保所有功能正常工作,然后根据需要进行性能优化,比如减少不必要的计算或使用位图缓存。 7. 发布和嵌入:最后,将Flash项目导出为SWF文件,将其嵌入到网页中,并...

    发个ActionScript 3D 中文例子

    在AS3D中,开发者可以利用强大的3D渲染引擎来制作复杂的交互式内容,如游戏、模拟、可视化应用等。这篇博客文章"ActionScript 3D 中文例子"可能提供了关于如何在Flash环境中使用AS3D的实例和教程。 在学习AS3D时,...

    as3.0+翻书效果

    1. **图形渲染**:AS3.0引入了Stage3D API,允许开发者利用硬件加速进行高性能的2D和3D图形渲染。翻书效果可能基于这个API来创建复杂的3D页面翻转动画,使得翻页看起来更加逼真。 2. **事件处理**:用户与虚拟书籍...

    flash 3.0小游戏3D地球

    【Flash 3.0 小游戏 3D 地球】是一个基于ActionScript 3.0(AS 3.0)编程语言开发的互动小游戏,它利用了Flash平台的3D渲染能力,为用户提供了独特的视觉体验。在这个项目中,开发者通过ActionScript实现了对3D模型...

    Flash2D+3D游戏引擎

    除了上述的2D游戏引擎外,还有一些专门针对3D游戏开发的Flash引擎,如As3isolibj、Away3D、Alternativa3D、Flare3D、CopperCube、Sophie3D等。这些引擎支持更加复杂的3D渲染和物理效果,为开发者提供了更为广阔的...

    AS3-DisplayEffect组件

    AS3-DisplayEffect组件是基于ActionScript 3.0(AS3)开发的一款显示效果工具。这个组件主要用于在Flash环境中创建动态的视觉效果,比如淡入淡出、旋转、缩放等,为用户界面和交互设计增添活力。通过使用...

    as3.0相册源代码

    此外,还可以深入研究AS3.0的高级特性,如面向对象编程、动画制作和性能优化,从而提升自己的编程技能。对于想要在互动媒体领域发展的初学者来说,这是一个很好的实践项目,能够为他们打下坚实的基础。

    AS3游戏引擎Starling中文手册 Starling入门

    它具有直观的API命名和丰富的AS3类库,开发者可以利用熟悉的概念如显示列表、事件模型和标准的AS3 API来构建应用。Starling的轻量级设计意味着其核心功能只包含大约80K的代码量,并且对Flash Player或AIR的特定版本...

    羽化遮罩水波 纯代码水波(AS3.0 2.0).rar

    在AS3中,可以使用Graphics类的beginFill()、drawRect()、endFill()方法绘制矩形,再通过mask属性为显示对象设置遮罩,结合BlurFilter类实现羽化效果。羽化遮罩可能被用作水波效果的一部分,使得水边看起来更自然。 ...

    Flash AS 3.0 里面有15个小游戏

    - **flash 3.0小游戏3D地球**:三维图形渲染,可能使用ActionScript 3.0的3D库。 - **flash 3.0扫雷**:数字逻辑,随机布雷,游戏界面交互。 5. **学习资源与实践**: - **教程**:网上有许多免费的AS 3.0教程...

    3D立方体线条动画,鼠标可拖动

    开发者可以使用Flash CS4或更高级别的版本打开和编辑这个源码,进一步理解和学习3D动画的制作方法。"视觉创意"则暗示了这个3D立方体动画不仅仅是一个技术展示,还包含了艺术性的设计元素,可能涉及到线条的艺术处理...

    actionScript3开发人员最全指南

    ActionScript 3.0(AS3)是Adobe公司发布的一种强大的编程语言,主要用于开发Flash应用程序、游戏和复杂的交云界面。本指南详细介绍了ActionScript 3.0的基础知识以及进阶技巧,适合开发人员深入学习和实践。 首先...

    Starling框架入门

    由于Flash Player 11和Adobe AIR 3引入了Stage3D,开发者能够通过Starling框架开发出高性能的2D游戏。Starling框架的出现,极大地降低了Flash游戏开发者的门槛,让他们不必深入了解底层的Stage3D API,就能利用GPU的...

    flash cs5 帮助文档

    3. **集成3D效果**:Flash CS5支持直接在舞台上创建和编辑3D对象,结合AS3.0可以实现丰富的3D交互。 4. **视频处理**:增强了视频播放和处理能力,支持高清视频和流媒体技术,使得Flash成为多媒体应用的首选平台。 ...

    BMFont 1.13

    BMFont 1.13是一款高效且广泛应用的位图文本制作工具,专为游戏开发者设计,以提升在各种游戏引擎中的文本渲染效率。它支持多种跨平台的游戏开发框架,如Starling、Cocos2dX以及Unity3d,使得开发者能够轻松地在他们...

    GameCommon

    3. **图形渲染**:在AS3中,GameCommon可能封装了DisplayObject的管理,包括精灵(Sprite)、位图(Bitmap)、图形(Graphics)等,提供了图形绘制、动画制作的便利接口。 4. **物理引擎**:为了模拟真实世界的物理...

Global site tag (gtag.js) - Google Analytics