1. 云栖社区>
  2. 技术文集>
  3. 列表>
  4. 正文

3D中的方位与角位移

作者:用户 来源:互联网 时间:2018-05-28 11:08:19

c存储api游戏图形

3D中的方位与角位移 - 摘要: 本文讲的是3D中的方位与角位移, 方位: 方向           角位移           旋转 位移:我们知道不能用绝对坐标系来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给

方位: 方向

          角位移

          旋转

位移:我们知道不能用绝对坐标系来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给定参考点(通常是坐标原点的)位移。

    同样,描述物体方位时,也不能使用绝对量。与位置只是相对已知点的位移一样,方位时通过相对已知方位的旋转来描述的。旋转的量称作角位移。具体来说,我们用矩阵和四元素来表示“角位移”,用欧拉来表示“方位”。

矩阵的形式:3D中,描述坐标系中方位的一种方法就是列出这个坐标系的基向量,这些基向量是用其他的坐标系来描述的。用这些基向量构成一个3*3矩阵,然后就能用矩阵形式来描述方位。换句话说,能用一个旋转矩阵来描述这两个坐标系之间的相对方位,这个旋转矩阵用于把一个坐标系中的向量转换到另一个坐标系中。

矩阵形式的有点:

    可以立即进行向量的旋转。矩阵形式最重要的性质就是利用矩阵能再物体和惯性坐标系间旋转向量,这是其他描述方法所做不到的。为了旋转向量,必须方位转换成矩阵形式。

     矩阵的形式被图形API所使用。受到了前一节所述原因的影响,图形API使用矩阵来描述方位。(API是应用程序接口,基本上,它们是实现您和显卡交流的代码)当你和图形API交流时,则必须在渲染管道的某处将其转换成矩阵。

     多个角位移连接。矩阵形式的第二个优点就是可以“打破”嵌套坐标系间的关系。例如,如果知道A关于B的方位,有知道B关于C的方位,使用矩阵可以求得A关于C的方位。

      矩阵的逆。用矩阵形式表达角位移时,逆矩阵就是“反”角位移。因为旋转矩阵是正交的,所以这个计算只是简单的矩阵转置运算。

矩阵形式的缺点:矩阵占用了更多的内存。如果需要保存大量方位,如动画序列中的关键帧,9个数会导致数目可观的额外空间损失。

    难于使用。矩阵对人类来说并不直观。有太多的数,并且它们都在-1到1之间。人类考虑方位的直观方法是角度,而矩阵使用的是向量。通过实践,我们能从一个给定的矩阵中得到它所表示的方位。但这仍比欧拉角困难得多,其他方面也不尽如人意。用手算来构造描述任意方位的矩阵几乎是不可能的。总之,矩阵不是人类思考的直观方位如的直观方法。

    矩阵可能是病态的。矩阵使用9个数,其实只有3个数是必须的。也就是说,矩阵带有6阶冗余。描述方位的矩阵必须满足6个限制条件。行必须是单位向量,而且它们必须互相垂直。

如果随机取9个数并组成一个3*3阶矩阵,这个矩阵条件不大可能全部满足6个限制条件。因此,这9个数不能组成一个有效的旋转矩阵。从另一方面,至少对于表达旋转这个目的而言,这个矩阵的结构很不合理,这样的矩阵会出问题,因为它可能导致数值异常或其它非预期行为。

    病态矩阵时怎样出现的呢。有很多原因。

    矩阵还可能包含缩放、切变或镜像的操作,这些操作会对物体的“方位”产生什么影响呢。确实,对此没有一个清晰的定义。任何非正交的矩阵都不是一个定义良好的旋转矩阵。虽然镜像矩阵也是正交的,但它不是有效的旋转矩阵。

    可能从外部数据源获得“坏”数据。例如,使用物理数据获取设备(如动作捕捉器)时,捕获过程中可能产生错误。许多建模包就是因为会产生病态矩阵而变得声明狼藉。

     可能因为浮点数的舍入错误产生“换数据”,例如,对一个方位动作大量的加运算,这在允许人们手动控制物体方位的游戏中是很常见的。由于浮点精度的限制,大量的矩阵乘法最终可能导致病态矩阵。这种现象称作“矩阵蠕变”。矩阵正交化能解决矩阵蠕变的问题。

小结:

    矩阵是一种表达方位的“强力”方法,我们可以在当前坐标系中明确列出另一个坐标系的基向量。

    用矩阵形式表达方位非常有用,这主要是因为它允许在不同坐标系间旋转向量。

     当前图形API使用矩阵描述方位。

    能使用矩阵乘法把嵌套矩阵连接起来,从而得到单一的矩阵。

    矩阵的逆提供了一种得到“相反”角位移的机制。

    矩阵占用了大量的内存。当有大量方位需要存储时(如动画数据)这样的的资源浪费将是一个大问题。

    并非所有矩阵都能描述方位。一些矩阵还包括镜像或切变等情况。从外部数据源得到坏数据或矩阵蠕变都可能导致病态矩阵。

    矩阵中的数对人类来说并不直观。




以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有 的相关内容,欢迎继续使用右上角搜索按钮进行搜索c , 存储 , api , 游戏 图形 ,以便于您获取更多的相关知识。

有关使用cult3d制作一个机械虚拟拆装系统的问题!求助大神 望不吝赐教。。。

...了需要拆离的零件,然后被点击的零件会按照我所设定的位移距离,旋转角度和时间离开整体。现在我想问的是能不能将鼠标左键点击触发的形式改为鼠标左键点住零件并拖动离开整体?因为软件里不具备这个功能,要用java写...

JavaScript实现的图片3D展示空间(3DRoom)_javascript技巧

...s可以设置如下属性:属性:    默认值//说明x:  0,//水平位移y:  0,//垂直位移z:  0,//深度width: 0,//宽度height: 0,//高度scaleW: 1,//宽度缩放比例scaleH: 1//高度缩放比例其中x、y分别是水平和垂直坐标的位移参数,坐标原点在容器底...

翻译:GLSL的顶点位移贴图

...` 允许实现, 例如,极其逼真的水呈现模拟(见更多资源部分中的链接)或甚至互动顶点位移, 如下示例所示: 顶点位移是由一个 `AVI` 视频控制 (视频来源于 [K-Meleon](http://kmeleon.sourceforge.net/) `web` 浏览器目录)截图:![](http://images2015.cnblo...

C++ 3D动作游戏《炼狱online》(服务端+客户端)全套源码下载

...鉴了经典3D动作游戏《暗黑破坏神》的精髓,并进行了全方位的深化。精致华丽的2.5D游戏画面、简洁明晰的操作设定,磅礴大气的背景音乐,壁垒分明的两大阵营,极富技巧的玩家PK,以上种种,正是海之童公司为广大玩家倾情...

WebGL ThreeJS学习总结四

...Vect4等向量类多种意义,比如Vect3即可以表示一个3D坐标系中的点,也可以表示一个3D坐标系中向量等;这是一种有争议的设计方法,好处在于可以简化某些功能函数的设计,比如旋转函数,点可以旋转,向量也可以旋转,如果点...

前三篇
后三篇