前言

前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记。

文章内容部分引用并参考了下面的博客:

http://netclass.csu.edu.cn/NCourse/hep089/Chapter6/CG_Txt_6_012.htm

http://www.cnblogs.com/graphics/archive/2012/08/10/2627458.html

原理

由于用齐次坐标表示,三维几何变换的矩阵是一个4阶方阵,其形式如下:


其中,产生按轴缩放、旋转、错切等变换。产生平移变换,产生投影变换,产生整体的缩放变换。

(1)平移

三维平移变换的计算,通常是左乘一个平移矩阵,表示方式可以如下:

(2)缩放

对于空间任意参考点的缩放变换,缩放矩阵的形成过程如下:

<1>将参考点平移到原点处;

<2>进行缩放变换;

<3>平移回原位置;

则最终变换矩阵结果如下:

其中,等号左边中间的矩阵的由缩放矢量(分别对应x轴、y轴,z轴方向的缩放)构成的缩放矩阵。

(3)绕坐标轴旋转

考虑右手坐标系下相对坐标原点绕坐标轴旋转q 角的变换:

<1>绕X轴转

<2>绕Y轴转

<3>绕Z轴转


三维空间的平移旋转及缩放的示意图可如下表示:


(4)绕任意轴旋转

设旋转轴AB由任意一点Axayaza)及其方向数(abc)定义,



可以通过下列步骤来实现P点的旋转:

A. 将A点移到坐标原点。

B. 使AB分别绕X轴、Y轴旋转适当角度与Z轴重合。

D.作上述变换的逆操作,使AB回到原来位置。

ABYOZ平面与XOZ平面的投影与Z轴的夹角。

我们可以得到如下的矩阵:

设旋转轴A(a,b,c)过原点,旋转角度为θ,

则旋转矩阵为:

设旋转轴A(u,v,w)不过原点,P(a,b,c)是旋转轴的起点,旋转角度为θ,

则旋转矩阵为:

对一个三维顶点作任意轴的旋转变换,只需左乘旋转矩阵即可。

示例代码

<1>空间点绕任意旋转轴旋转,函数输入参数是单位化后的轴方向、轴上任一点、旋转角度、要旋转的点

void RotateVecPoint(float& angle, osg::Vec3& N, osg::Vec3 center, osg::Vec3& Pt){//输入参数是旋转轴上的任意一点P(a,b,c),单位化后的旋转轴方向向量N(u,v,w),旋转角度θ,要旋转的点float mcos = cos(angle), msin = sin(angle);/*若旋转轴过原点*//*osg::Matrixf mat = osg::Matrixf(pow(N.x(), 2)*(1 - mcos) + mcos, N.x()*N.y()*(1 - mcos) + N.z()*msin, N.x()*N.z()*(1 - mcos) - N.y()*msin, 0.0,N.x()*N.y()*(1 - mcos) - N.z()*msin, pow(N.y(), 2)*(1 - mcos) + mcos, N.y()*N.z()*(1 - mcos) + N.x()*msin, 0.0,N.x()*N.z()*(1 - mcos) + N.y()*msin, N.y()*N.z()*(1 - mcos) - N.x()*msin, pow(N.z(), 2)*(1 - mcos) + mcos, 0.0,0.0, 0.0, 0.0, 1.0);*//*若旋转轴不过原点:涵盖了上面的情况*/float a = center.x(), b = center.y(), c = center.z();//轴所在直线起点float u = N.x(), v = N.y(), w = N.z();//转置osg::Matrixf mat = osg::Matrixf(u*u + (v*v + w*w)*mcos, v*u*(1 - mcos) + w*msin, w*u*(1 - mcos) - v*msin, 0.0,u*v*(1 - mcos) - w*msin, v*v + (u*u + w*w)*mcos, v*w*(1 - mcos) + u*msin, 0.0,u*w*(1 - mcos) + v*msin, v*w*(1 - mcos) - u*msin, w*w + (u*u + v*v)*mcos, 0.0,(a*(v*v + w*w) - u*(b*v + c*w))*(1 - mcos) + (b*w - c*v)*msin, (b*(u*u + w*w) - v*(a*u + c*w))*(1 - mcos) + (c*u - a*w)*msin, (c*(u*u + v*v) - w*(a*u + b*v))*(1 - mcos) + (a*v - b*u)*msin, 1.0);mat.preMult(Pt);}

效果图

<1>空间圆绕着任意轴旋转一定的角度



关于几何变换更详细的描述请参考:

http://netclass.csu.edu.cn/NCourse/hep089/Chapter6/CG_Txt_6_012.htm

http://www.cnblogs.com/graphics/archive/2012/08/10/2627458.html

三维空间中的几何变换-平移旋转缩放相关推荐

  1. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  2. Android中实现图片平移、缩放、旋转同步进行

    转载请注明转自:noyet12的博客 博客原址:http://blog.csdn.net/u012975705/article/details/49797911 源码下载地址: (github)htt ...

  3. 三维坐标要建一个4*4的矩阵?平移 旋转 缩放

    移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...

  4. Unity矩阵平移旋转缩放Matrix4x4

    Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...

  5. OpenGL中的平移旋转缩放

    1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z); 该函数表示模型在各轴上进行扩大和缩 ...

  6. osg中使用MatrixTransform来实现模型的平移/旋转/缩放

    MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象. 通过设置其矩阵,来实现其下子节点的模型变换. -- 用局部坐标系来理解(局部坐标系又 ...

  7. 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放

    给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...

  8. WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理

    1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...

  9. Cesium变换3DTiles的位置(平移旋转缩放)

    function add3DTilesetDataTrans(url) {             //viewer1.scene.globe.depthTestAgainstTerrain = tr ...

最新文章

  1. linux驱动:音频驱动(四)ASoc之machine设备
  2. PHP中的Trait方法
  3. go 接口 构造器_Go 中接口值的复制
  4. 从“No space left on device”到删除海量文件
  5. js 数字格式化,只能输入正负整数,小数
  6. 会话(状态)管理Cookie与Session(二)
  7. JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
  8. 观《当幸福来敲门》有感
  9. 15 个为编程初学者准备的网站
  10. Angular 个人深究(二)【发布与订阅】
  11. 如何将Word/PDF转成高质量XML
  12. python对seo有什么用_pythonseo-python对于做SEO主要有什么作用
  13. 百度财报解析-百度云要变成老大哥
  14. linux中$符号有什么作用,linux中的“$”符号表示什么
  15. ajax提交用流的方式,ajax 请求 后台返回的文件流
  16. 赛效:电脑在线美化图片怎么弄?
  17. STM32F0项目进阶之实时时钟DS1307
  18. 在线多线网络测速工具
  19. 通信方式——8080并口
  20. 汽车软件设计的变化趋势

热门文章

  1. CS224W 图机器学习(二)--图上的传统机器学习方法
  2. 计算机软件大全学习,[计算机软件及应用]CAD入门学习大全.ppt
  3. 学堂在线_操作系统_notes_第0-2讲_OS概述、OS实验环境准备
  4. 学习ERP从内部集成起步(1-2章)收获
  5. 180张超漂亮QQ头像打包下载
  6. 狂神说SpringCloud学习笔记(附带源码和笔记)
  7. emboss 安装使用
  8. win10搜索功能突然失效的解决办法
  9. 牛客网——牛牛的通勤
  10. 0324表格单元格合并