opengl矩阵变换与平移缩放旋转

坐标系:

1、右手坐标系

185600_UyhX_2621781.jpg

2、左手坐标系

185625_U4G3_2621781.png

    左手坐标系是X轴向右,Y轴向上,Z轴向前,右手坐标系的Z轴正好相反,是指向“自己”的,在计算机中通常使用的是左手坐标系,而数学中则通常使用右手坐标系。计算机里面其实很多也有用右手坐标系,这个只是根据实际应用不同,没有说哪个比较好

    世界坐标是OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

    物体坐标是以物体某一点为原点而建立的“世界坐标”,该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

    眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

    设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

矩阵可以和坐标相结合

1.

155758_irwD_2621781.png

155816_zYuw_2621781.png

2.

155846_E9hX_2621781.png

实际应用:

 

平移变换

若空间平移量为(tx, ty, tz),则平移变换为

image

image

则变换矩阵为

image

即:x' = 1x+0y+0z+tx,

y' = 0x+1y+0z+ty,

z' = 0x+0y+1z+tz,

1' = 0x+0y+0z+1

同样的效果也可以:

7f17b29e1e4b51ad2891b645b0ed42b5014.jpg

x' = x+tx; y'=y+ty;

向量的点乘和叉乘

点乘:

145614_IoHZ_2621781.png

145657_YiWM_2621781.png

叉乘:

150031_U9Ql_2621781.png

 a、b分别为三维向量:

                                   a=({a_1},{a_2},{a_3})

                                   b=({b_1},{b_2},{b_3})

1、向量叉乘的计算原理

 这里用i j k来表示三维坐标轴,这里只是举例,可以扩展到更多维,只是比较抽象

   a{\rm{=}}{a_1}i+{a_2}j+{a_3}k

   {\rm{b=}}{​{\rm{b}}_1}i+{b_2}j+{b_3}k

 

  i*i=0           j*j=0           k*k=0

  i*j=k          j*k=i           k*i=j

 j*i=-k       k*j=-i        i*k=-j

 

a{\times}b=({a_1}i+{a_2}j+{a_3}k)*({b_1}i+{b_2}j+{b_3}k)

 a{\times}b=({a_2}{b_3}-{a_3}{b_2})i+({a_3}{b_1}-{a_1}{b_3})j+({a_1}{b_2}-{a_2}{b_1})k

2、计算叉乘矩阵

a{\times}b=({a_2}{b_3}-{a_3}{b_2})i+({a_3}{b_1}-{a_1}{b_3})j+({a_1}{b_2}-{a_2}{b_1})k

把叉乘结果写成向量的形式:

               a{\times}b=\left[\begin{array}{l} {a_2}{b_3}-{a_3}{b_2}\\ {a_3}{b_1}-{a_1}{b_3}\\ {a_1}{b_2}-{a_2}{b_1} \end{array}\right]

              变换形式得到叉乘矩阵:

   a{\times}b={\left[a\right]_\times}b=\left[{\begin{array}{*{20}{c}} 0&{-{a_3}}&{​{a_2}}\\ {​{a_3}}&0&{-{a_1}}\\ {-{a_2}}&{​{a_1}}&0 \end{array}}\right]\left[{\begin{array}{*{20}{c}} {​{b_1}}\\ {b{}_2}\\ {​{b_3}} \end{array}}\right]

 其中{\left[a\right]_\times}称为a向量的叉乘矩阵。

 

 

转载于:https://my.oschina.net/HeroOneHY/blog/1571154

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值