`

[转]自制flash3D变换类

阅读更多
http://hi.baidu.com/boycy/blog/item/576131b3aa1e07b1d9335ae5.html
大家好,我又写东西了!写这个东西花费了我两天的时间,其中遇到的困难五花八门,什么数据搞错的,公式推错的,结构设计失误的。。吃一蛰长一智,总算也是学到了一些经验,有些在代码中已经体现,有些尚未实现。

由于代码量有点多,不能像以往那样把代码全贴上去(700多行,放博客上要好几篇),这里就把一些重要公式,数据结构以及一些初步优化策略和大家简述下。如果对其感兴趣的朋友,可以留言和我讨论,也可以留下邮箱索要源文件。



1.点绕单位向量旋转变换公式

做这个变换,首先需要一个空间单位向量q(q1,q2,q3)作为点要绕的轴。

其次需要点p的初值p(x,y,z)。

再次,需要p绕q旋转的角度theta。

然后 我们可以先计算出一些量

s=sin(theta)

c=cos(theta)

t=1-c

然后 我们构造一个3*3矩阵A

|t*q1*q1+c,  t*q1*q2+s*q3,  t*q1*q3-s*q2|
|t*q1*q2-s*q3,  t*q2*q2+c,  t*q2*q3+s*q1|
|t*q1*q3+s*q2,  t*q2*q3-s*q1,  t*q3*q3+c|

这样我们就能通过一下矩阵计算公式算出p顺时针绕q轴theta弧度之后的坐标

|x'|    |t*q1*q1+c,  t*q1*q2+s*q3,  t*q1*q3-s*q2|   |x'|


|y'| = |t*q1*q2-s*q3,  t*q2*q2+c,  t*q2*q3+s*q1| * |y'|


|z'|    |t*q1*q3+s*q2,  t*q2*q3-s*q1,  t*q3*q3+c|   |z'|

这个公式被用在计算显示容器围绕自身坐标系的一个轴(x轴,y轴,z轴)旋转时,其他两个轴的数值变化



2.坐标系叠加公式

因为这个3D变换系统中,有显示容器的概念,实际上是构造一个3D显示列表,显示容器就是显示列表中的一个节点,父级的一切变换将影响到子级,子级变换不影响父级。这样,所有要显示的叶子节点,他的各个点具体的坐标就需要通过各个祖先节点的变换属性迭代计算得出。

我们在设计的时候,每个显示容器都拥有一个独立的坐标系,这个坐标系是通过四个三维点来描述的,一个坐标原点以及三个分别在其三个坐标轴上的向量(模长为缩放值)。显示容器的坐标系位置是相对于其父级坐标系的。也就说,如果要求出显示容器坐标系相对于世界坐标系的值,必须将显示容器的坐标系和其父级坐标以及所有祖先坐标系叠加。

现在给出子坐标系和父坐标系叠加的计算方法

构造父坐标矩阵P

|vx_x,  vy_x,  vz_x,  x|

|vx_y,  vy_y,  vz_y,  y|

|vx_z,  vy_z,  vz_z,  z|

vx前缀代表x轴方向上的向量,vy前缀代表y轴方向上的向量,vz前缀代表z轴方向上的向量

构造子坐标系矩阵C

|vx_x,  vy_x,  vz_x,  x|

|vx_y,  vy_y,  vz_y,  y|

|vx_z,  vy_z,  vz_z,  z|

|1,       1,       1,       1|

那么两个坐标系叠加之后的结果为

|vx_x,  vy_x,  vz_x,  x|

|vx_y,  vy_y,  vz_y,  y| = P * C

|vx_z,  vy_z,  vz_z,  z|

在做渲染的时候,就要从显示列表的根节点开始,不断把自身坐标系和子坐标系叠加,直到叶子节点。



有的朋友可能看到这么多矩阵头就晕了。其实,看到矩阵完全不必害怕,矩阵只是一种算式的表示方式,在实际计算中,还是要化为乘法和加法进行计算的。

矩阵乘法的法则是:

乘号左边矩阵的第M行乘上乘号右边矩阵的第N列,然后把计算结果储存到结果矩阵的第M行第N列的位置。

行和列相乘的时候,将行的元素和列里面对应的元素相乘,然后将所有相乘的结果相加(如果还是不懂,求教百度吧)。



由于本人贪图方便,没有去写矩阵计算类,结果在程序中数组乘数组,尼玛眼睛都花了。。。教训呀!写程序千万不能偷懒,不然得不偿失。



3.用栈进行深度优先遍历

前面讲过,在渲染的时候,需要对显示列表进行遍历叠加坐标系。程序采用深度优先的顺序进行遍历。

为了提高程序程序速度,我们应该坚决抛弃函数递归方法。虽然递归的写法确实是很容易理解,也不容易出错,可是递归的效率低下也是显而易见的。其低效的原因是每调用一次函数,都需要在系统的栈中压入函数体内的局部变量,每执行完一个函数,都需要在系统栈中弹出局部变量。这样进进出出又费时又费力。

这里我们讲一下用栈进行深度优先遍历的基本思想。

首先在栈中压入根节点。然后进入一个循环。

循环直到栈中没有数据后停止。

在每次循环内,从栈中弹出一个节点,先对这个节点该干嘛干嘛。处理好了之后,如果有子节点的,就将子节点逆序压入栈中,然后进入下一轮循环。

这个方法的好处是它非常节省,甚至连用于确定节点具体位置的index都不需要。



4.在渲染中忽略没有必要更新的数据

这个优化的思想可以用以下几个问题来回答

如果舞台上没有任何一个物体变化过,那么渲染的时候,物体的坐标需要重新计算么?

答:明显不用,我们可以复用最近一次更新数据计算的结果。

如果舞台上有两个物体,一个变化了,一个没有变化,那么没有变化的物体需要重新计算么?

答:不用,没有变化的物体,有最近一次更新数据计算的结果可以复用。

如果舞台上物体没有变化,而他的父级变化了,需要重新计算么?

答:需要重新计算,父级变化影响子级,导致子级坐标系发生变化。

这些问题总结起来,就是说,只要一个节点的父级或者祖先变化了,这个节点就需要更新数据,否则不用。



5.其他优化策略

等待留言啊。。。要源文件的留言啊。。。
分享到:
评论

相关推荐

    pcb3d库 自制版

    《PCB3D库自制版详解》 在电子设计领域,PCB(Printed Circuit Board)设计是一项至关重要的任务,而3D视角的PCB设计则为工程师们提供了更为直观和立体的视图,帮助他们更好地理解电路板的布局、空间占用以及与周围...

    [转]自制Flash表情聊天

    【标题】:“自制Flash表情聊天”是一篇关于利用ActionScript技术创建自定义聊天表情的应用教程。ActionScript是Adobe Flash中的编程语言,它主要用于交互式内容的开发,如网页游戏、动画以及应用程序,其中包括聊天...

    自制flash checkbox多选组件

    在本文中,我们将深入探讨如何制作一个自定义的Flash AS3多选组件,特别是基于给定的文件"自制flash checkbox多选组件"。这个组件允许用户在交互式应用程序中进行多选项选择,提供了灵活和可定制的功能。我们将讨论...

    自制3D打印机设计模型_零件图_机械工程图_机械三维3D设计图打包下载.rar

    标题中的“自制3D打印机设计模型_零件图_机械工程图_机械三维3D设计图打包下载.rar”表明这是一个关于3D打印机设计的资源包,其中包含了制作3D打印机所需的各个部分的设计图纸和3D模型。这个压缩包可能是由机械...

    自制3d图片工具

    标题中的“自制3D图片工具”指的是一个程序或软件,允许用户创建个人的3D图像。3D图像是一种视觉艺术形式,它通过模拟深度和空间感来呈现立体效果,这通常需要专门的软件和一定的技术知识。这个工具显然是为了简化这...

    buck变换器设计_自制buck变换器

    本文将指导大家如何自制buck变换器,包括控制回路设计和主回路设计,以及主回路参数的计算。 首先,控制回路的设计至关重要,它保证了buck变换器能够稳定且有效地工作。在控制回路设计中,需要参考控制回路的原理图...

    自制flash 播放器

    本文将深入探讨如何自制一个基于Flash的播放器,以及它如何播放FLV(Flash Video)格式的文件。 首先,我们要理解Flash Player的工作原理。Adobe Flash Player是一款允许用户在网页上运行SWF(ShockWave Flash)...

    自制激光3D扫描仪

    这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可 以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像 是由很多小点组成的云团,因此常被称之为:...

    自制USB转串口线

    ### 自制USB转串口线的关键知识点 #### 1. 背景与需求 - **背景**: 随着技术的发展,现代笔记本电脑多配备了USB接口,而传统的串行接口(COM口)逐渐被淘汰。然而,对于某些硬件设备如开发板来说,仍然需要通过串行...

    自制3D打印机-全文件

    【标题】"自制3D打印机-全文件"所涉及的知识点涵盖了3D打印技术、DIY项目、硬件设计以及开源软件等多个方面。3D打印是一种快速成型技术,它基于逐层堆积的方式制造三维物体,而自制3D打印机则进一步涉及到机械工程、...

    自制Flash FLV视频播放器.pdf

    标题中的“自制Flash FLV视频播放器”是指利用Adobe Flash软件创建一个能够播放FLV格式视频的自定义播放器。这个教程主要针对的是使用ActionScript(Flash的编程语言)进行控制,而不是使用预构建的FLVPlayback组件...

    自制红酒架3D模型

    【标题】"自制红酒架3D模型"是一个与三维建模和室内设计相关的主题,主要聚焦于创建一个可用于装饰或实际使用的红酒架的数字化模型。这个3D模型是专为制作室内效果图而设计的,特别是在家庭装修场景中,如吧台上方的...

    PIC 单片机 驱动FLASH 三星 自制 U盘 资料

    PIC 单片机 驱动FLASH 三星 自制 U盘 资料PIC 单片机 驱动FLASH 三星 自制 U盘 资料

    flash 自制的一个小游戏

    这是自制的 小游戏里面有包涵碰撞检测,还有一点运动的 程序。

    自制flash动画mv的课程设计(proud of you)

    此文件为大学课程设计作业所做,要求为一首歌曲加上flash动画和字幕。 歌曲为proud of you,就是英文版的隐形翅膀,具体情况自己搜索 包含应用素材,.fla可编译flash文件,.swf影片文件,音乐,歌词。mv取前一部分约...

    自制简单FLASH音乐播放器源文件

    自制简单FLASH音乐播放器源文件,可以自己更换歌曲,简单的播放器,就不带播放列表了!

    NAND Flash烧录器,NAND Flash编程器,NAND Flash烧写器,NAND Flash拷贝机

    例如在GPS导航仪、车载电脑主机、高清播放机、高清机顶盒、蓝光DVD、网络摄像头、手持智能设备、学习机、数码相框、游戏机、电子书、点读机、语音玩具、监控门禁类等产品中都需要使用NAND Flash烧录器来烧录和编程...

    自制USB转串口模块

    标题中的“自制USB转串口模块”是指利用特定的芯片或电路板,如PL2303,自行设计和制作一个设备,该设备能够将通用串行总线(USB)接口转换为传统的串行通信接口,如RS-232。这种转换器在DIY爱好者和电子工程师中很...

    Scrach自制3D跑酷游戏~

    Scrach自制3D跑酷游戏~ 不用联网,名字叫CF,实际就是一个跑酷的小游戏,游戏规则里面都有,请自行查找。 和同学一起做的,并非完全原创,禁止转载。 虽然很简单,但是它真的是一个大——————游——————戏...

Global site tag (gtag.js) - Google Analytics