zoukankan      html  css  js  c++  java
  • 三维变换矩阵推导笔记

      还记得两年前校招面试被问到了这个并不复杂的问题,那时候我居然傻傻地没有推倒出来,现在想想真是菜的扣脚!!

      这么基础的知识还是要完全搞清楚,于是我决定找个时间专门把常用的三维变换矩阵的推导总结一番

      1.二维的旋转

      假设平面上存在一点(用极坐标表示)(ρ,θ),那么他在直角坐标中可以表示为x = ρ * cosθ, y = ρ * sinθ。

      现在把这个点逆时针旋转α度,其极坐标为(ρ, θ + α),直角坐标为x’ = ρ * cos(θ + α), y’ = ρ * sinθ (θ + α) 

      展开可推得x’ = x * (cosα - sinα) , y’ = y * (sinα + cosα)

      

      2.有了二维的基础,我们就可以表示三维里绕坐标轴的旋转了

      比如绕Z轴的旋转:

      

      3.然而表示了旋转并没有大功告成,我们还需要平移、缩放

      两个向量相加等于每个元素相加:(x1, y1, z1) + (x2, y2, z2) = (x1 + x2, y1+ y2, z1+z2)

      显然3 * 3的矩阵式无法表示的,于是我们再增加一维,表示如下:

      

      游戏引擎层的矩阵大部分都是采用4 * 4矩阵,于是我们统一把旋转也用4维表示

      绕X轴旋转:

      

      绕Y轴旋转:

      

      绕Z轴旋转:

      

      有了这几个基本的元素,我们已经可以表示任何旋转啦,比如先向X轴转一下,再向Y轴转一下,两个矩阵相乘就得到了一个不是绕坐标轴的旋转矩阵

      4.缩放

      这个就更简单啦,假设x轴的缩放因子为sx, y轴的缩放因子为sy,z轴的缩放因子为sz,那么缩放矩阵可表示为:

      

      至此,最基本的变换矩阵都推倒完毕了,剩下的只要把他们相互组合,就可以使用矩阵表示一个点的变换了。  

  • 相关阅读:
    一次蜿蜒曲折的RFID破解之路
    无线安全渗透测试套件WiFi-Pumpkin新版本发布
    交易系统 1代
    angular-ui分页组件
    付款
    [译]AngularJS Services 获取后端数据
    [译]AngularJS中DOM操作
    [译]AngularJS $apply, $digest, 和$evalAsync的比较
    Angular $watch
    AngularJS中的表单验证
  • 原文地址:https://www.cnblogs.com/SolarWings/p/6243577.html
Copyright © 2011-2022 走看看