您的位置:首页 > 产品设计 > UI/UE

学习quaternion的一点点笔记

2006-12-18 03:33 267 查看
     嗯嗯,继续学习数学中。。。     
 
        在3D程序中,通常用quaternion来计算3D物体的旋转角度,与Matrix相比,quaternion更加高效,占用的储存空间更小,此外也更便于插值。在数学上,quaternion表示复数w+xi+yj+zk,其中i,j,k都是虚数单位:

i*i = j*j = k*k= -1
i*j = k, j*i = -k

可以把quaternion看做一个标量和一个3D向量的组合。实部w表示标量,虚部表示向量标记为V,或三个单独的分量(x,y,z)。所以quaternion可以记为[ w, V]或[ w,(x,y,x)]。对quaternion最大的误解在于认为w表示旋转角度,V表示旋转轴。正确的理解应该是w与旋转角度有关,v与旋转轴有关。例如,要表示以向量N为轴,轴旋α度,相对的quaternion应该是:

q = [ cos(α/ 2) , sin(α/ 2) N]
  =[ cos(α/ 2) , ( sina(α/ 2) Nx, sin(α/ 2)Ny, sin(α/ 2)Nz ) ]

为了计算方便,一般要求N为单位矢量。对quaternion来说使用四个值就能记录旋转,而不是Matrix所需的十六个值。为什么用quaternion来计算旋转很方便呢?先说过quaternion是一个复数,如果你还记得一点点复数的知识,那么应该知道复数乘法(叉乘)的几何意义实际上就是对复数进行旋转。对最简单的复数p= x + yi来说,和另一个复数q = ( conα,sinα)相乘,则表示把p沿逆时针方向旋转α:

p’ = pq

当然,x+yi的形式只能表示2D变换,对3D变换来说就需要使用 quaternion了,而且计算也要复杂一点。为了对3D空间中的一个点p(x,y,z)进行旋转,需要先把它转换为quaternion形式p = [0, ( x, y, z)],接下来前面讨论的内容,定义q = cos(α/ 2) , sin(α/ 2) N为旋转quaternion,这里N为单位矢量长度的旋转轴,α为旋转角度。那么旋转之后的点p’则为:

       p’ = qpq-1
 

ps:粗体字母表示矢量
 

~~~~~~~~~~~~~~~~~~~~~~~呆滞的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   昨天玩了一下上古卷轴四-湮灭,不错的游戏,画面很精致,各种特效做的相当华丽,特别是里面的树木渲染是我目前看到最好的,可惜我的6600GT跑起来已经有些吃力>.<。不过最不习惯的还是游戏操作,视觉和移动旋转控制方式让我玩一小时就晕的不行,特别是骑上马之后的方向控制,只能用艰难来形容。相比之下wow的操作要舒服的多。另外还有一个比较不爽的地方,虽然游戏开始时可以精细的定制人物外形,可惜大多数游戏时间中,都只能看到人物背面。说实话,人物背影做的实在很丑,我选的女精灵,可是从后面看简直就像个驼背一样-_-b。再者技能栏用起来也极度不方便,只能使用一个按键释放魔法,在多个魔法间切换比较麻烦。毕竟是pc版本的,和ps或xbox版本相比,完全可以再改进一下控制方式。想起前几天有人在gameres论坛讨论要用两个鼠标把FPS游戏的视角和准心分开控制的想法,实际上良好的人机交互方式要比某些华而不实的功能重要的多。当然,也许有人说特殊控制方式也是一款游戏的吸引人的地方之一。但不觉得像无冬之夜那样,为玩家提供多种可选的视觉控制方式是更好的解决方案吗?so,结论是不要让设计不合理的UI毁了一个好游戏。

    

      csdn的blog似乎又出问题了,不能传图片了-_- 。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  游戏 matrix zk blog ui