Flash与3D编程探秘(四)- 摄像机旋转基础知识

关于三角函数

现在已经把最基本的移动摄像机技巧介绍完了,并且我相信上篇的几个例子也应该让读者加深了印象。可是你会发现前面我们只是把摄像机沿着x轴,y轴或者z轴移动摄像机,可是实际中可以把摄像机向左,向右,向上或者向下旋转一定的角度,这样在观看空间时就有更大的自由度。 不过介绍旋转之前,我想介绍一些关于三角法的计算(Oh,No!),如果你还对三角函数不熟悉,那么文章看起来可能会有些费解。不过不要担心,中国人有着聪明的头脑,这些对你来说很容易。提醒一下:如果下面的内容对你来说太容易了,那么可以跳过这些。不过我想我还是给已经忘记的(Just like me)各位补上一课,毕竟就是这些简单的知识驱使着我们的3D空间旋转着。

 

三角法是数学的一个分支,我们主要用它来分析三角形的边和角度的关系。为什么要三角形要和角度有关系呢?任意一条在2D空间里有旋转角度的直线,它都会在x轴和y轴有相应的映射(当然在3D空间里, 我们并不光有x轴和y轴)。假设有一条线段从原点到点B(4,0),当你把这个线段哦OB沿着原点旋转一定角度,过B(旋转后)向x轴做一条垂线 BC,那么x轴和BC,OB所组成的就是一个直角三角形。当然你可以把OC看作是线段OB在x的投影。那么对这个旋转角度使用sin和cos就可以计算得到我们这条线段在x和y的分量。

 


旋转一条直线得到的三角形

 



以原点为中心旋转小P

 

以原点为中心旋转只是个例子,这里提到的旋转点不一定是原点,可以把任意一点作为旋转的原点。你会发现在旋转中,当x线段OB旋转一定角度后,它会与旋转前的线段重合,B在旋转中所过的点的轨迹就是一个圆,那旋转的这条线段就OB就是这个圆的半径。OK,这就是在Flash里需要知道基本三角函数。下面两个是根据圆的半径得到x和y分量的公式:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> object .x  =  Math.cos(angle)  *  radius;
object .y  =  Math.sin(angle)  *  radius;

 

 

旋转后的直线在x和y轴的分量

 

当然,上面的公式在旋转点为原点的情况下成立,如果旋转点不是原点的话使用:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> object .x  =  origin.x  +  Math.cos(angle)  *  radius;
object .y  =  origin.y  +  Math.sin(angle)  *  radius;

 

 

弧度

当测量物体小P的旋转角度的时候,可以使用度数,这也是最常用的,它从0到360沿逆时针方面递增。但是Flash并不知道360是什么,它所知道的只是弧度(当然你可以自己写sin和cos函数,用0到360作为参数)。这里的弧度可以这样理解,360度数是2*PI弧度,那么就是说360度旋转是一个整圆的话,2*PI旋转也是同样效果。把度数转化成弧度的公式是:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> randians  =  degrees  *  (Math.PI  /   180 ); PI  =   3.1415926535897932384626433832795...

 

 

反三角函数

在Flash里,可以通过直角三角形的两个边的比率得到角度,用下面的代码即可:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> angle  =  Math.atan2( object .y,  object .x);
angle 
=  Math.atan(y / x);

 

还有一个要说明的那就是勾股定理:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> hypotenuse  =  Math.sqrt(x * +  y * y);

 

那么你现在已经具备2D旋转的基本知识了,再看一下3D,3D旋转中加进了z轴,hum,那么就把xy平面,yz平面,zx平面的旋转组合起来,就得到摄像机的全方位旋转。不过指得注意的是,三角法不能直接运用到摄像机旋转中,可以在横向旋转摄像机的时候保持摄像机的其他轴旋转角度不变。另外你还可以旋转x,y和z轴已到达目的,比如要旋转180度的话,可以使z旋转到x的位置然后再转到z的位置,同时保持y轴不动。



旋转x和z轴

 

横向旋转摄像机

上面讲述了一些旋转摄像机的原理,我们更关心的是如何使用这些原理来解决问题。联想一下实际,对于摄像机的横向旋转来说,摄像机的所在位置的高度y,深度z和横向x都是保持不变的,唯一改变的就是摄像机的旋转角度。也就是说当一个空间中的物体在位置不变的情况下,摄像机与它的距离是不变的,于是问题转化成在角度变化的情况下保证它们的距离不变。设旋转后的角度为a,那么物体所在的x和y(以摄像机为原点建立坐标系)就是:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> =  distance  *  Math.cos(a);
=  distance  *  Math.sin(a);

 

如果摄像机所在的坐标为(x0,y0)的话,就可以得到物体所在的坐标(还是上面讲过的公式):

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> =  x0  +  distance  *  Math.cos(a);
=  y0  +  distance  *  Math.sin(a);

 

以上所述的仅是对一个物体的操作,同样道理对所有舞台上的物体进行操作,那么所看到的就是摄像机旋转后的景象。

 


      

对比旋转物体和旋转摄像机

 

在上面的动画中,我们俯瞰整个场景,对比一下旋转摄像机和旋转舞台上所有物体的差异。当然对于其他的平面(纵向旋转摄像机)来说,可以运用相同的理论对物体进行操作。总而言之那么,你应该有种感觉你已经具备所有摄像机旋转的理论知识了,不过还有一小点,将在下一篇文章进行分析。

 

上一篇          目录          下一篇


非常抱歉,文中暂时不提供源文件下载,如果你需要源文件,请来信或者留言给我。笔者利用工作之余写这些文章,付出了很多汗水,希望读者和转载者能够尊重作者的劳动。


作者:Yang Zhou
出处:http://yangzhou1030.cnblogs.com
本文版权归作者和博客园共有,转载未经作者同意必须保留此段声明。请在文章页面明显位置给出原文连接,作者保留追究法律责任的权利。
资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 计算机体系结构是计算机科学技术领域极为关键的课程,它聚焦于硬件软件的交互以及计算系统设计优化的诸多方面。国防科技大学作为国内顶尖工科院校,其计算机体系结构课程备受瞩目。本课件汇集了该课程的核心内容,致力于助力学生深入探究计算机工作原理。 课件内容主要涵盖以下要点:其一,计算机基本组成,像处理器(CPU)、内存、输入/输出设备等,它们是计算机硬件系统基石,明晰其功能工作模式对理解计算机整体运行极为关键。其二,指令集体系结构,涵盖不同指令类型,如数据处理、控制转移指令等的执行方式,以及 RISC 和 CISC 架构的差异优劣。其三,处理器设计,深入微架构设计,如流水线、超标量、多核等技术,这些是现代处理器提升性能的核心手段。其,存储层次结构,从高速缓存到主内存再到外部存储器,探究存储层次缘由、工作原理及数据访问速度优化方法。其五,总线和 I/O 系统,学习总线协议,了解数据、地址、控制信号在组件间传输方式,以及 I/O 设备分类交互方式,如中断、DMA 等。其六,虚拟化技术,讲解如何利用虚拟化技术使多个操作系统在同硬件平台并行运行,涉及虚拟机、容器等概念。其七,计算机网络通信,虽非计算机体系结构主体,但会涉及计算机间通信方式,像 TCP/IP 协议栈、网络接口卡工作原理等。其八,计算机安全可靠性,探讨硬件层面安全问题,如物理攻击、恶意硬件等及相应防御举措。其九,计算机体系优化,分析性能评估指标,如时钟周期、吞吐量、延迟等,学习架构优化提升系统性能方法。其十,课程习题题库,通过实际题目训练巩固理论知识,加深对计算机体系结构理解。 国防科大该课程不仅理论扎实,还可能含实践环节,让学生借助实验模拟或真实硬件操作深化理解。课件习题集为学习者提供丰富练习机会,助力掌握课程内容。共享
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值