三维空间中的几何变换-平移旋转缩放
前言
前段时间由于项目需要,深入学习了下图形几何变换,主要是绕任意轴旋转部分(其他的已有一定基础),现记录学习笔记。
文章内容部分引用并参考了下面的博客:
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由任意一点A(xa,ya,za)及其方向数(a,b,c)定义,
可以通过下列步骤来实现P点的旋转:
A. 将A点移到坐标原点。
B. 使AB分别绕X轴、Y轴旋转适当角度与Z轴重合。
D.作上述变换的逆操作,使AB回到原来位置。
是AB在YOZ平面与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
三维空间中的几何变换-平移旋转缩放相关推荐
- Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...
- Android中实现图片平移、缩放、旋转同步进行
转载请注明转自:noyet12的博客 博客原址:http://blog.csdn.net/u012975705/article/details/49797911 源码下载地址: (github)htt ...
- 三维坐标要建一个4*4的矩阵?平移 旋转 缩放
移植不知道三维物体的旋转平移缩放和矩阵的关系.找到这篇文章借鉴一下. 转自:https://blog.csdn.net/ALLENJIAO/article/details/80348362 怎么平移一 ...
- Unity矩阵平移旋转缩放Matrix4x4
Unity中的矩阵(Matrix4x4) 最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转.平移.缩放.(注意这里本文中的transform组件式基于unity ...
- OpenGL中的平移旋转缩放
1.opengl中缩放使用的函数是glScalef 其原型为void glScalef(GLfloat x, GLfloat y, GLfloat z); 该函数表示模型在各轴上进行扩大和缩 ...
- osg中使用MatrixTransform来实现模型的平移/旋转/缩放
MatrixTransform是从Transform - Group继承而来,因此可以在它的下面挂接Node对象. 通过设置其矩阵,来实现其下子节点的模型变换. -- 用局部坐标系来理解(局部坐标系又 ...
- 三维坐标 偏转_三维坐标变换原理-平移, 旋转, 缩放
给定一个二维点(x, y),那么形如(kx, ky, k)的所有三元组就都是等价的,它们就是这个点的齐次坐标(homogeneous).齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指 ...
- WebGL编程指南-24 同时使用漫反射光和环境反射光、立方体平移旋转缩放变换时漫反射光和环境反射光处理
1.demo效果 此效果是上一章绘制的立方体基础上,向Y轴方向平移一个单位,然后绕Z轴旋转30度. 如上图,归纳一下物体坐标变换法向量变化的规律如下 平移变换, 法向量不会改变 旋转变换, 大多数情况 ...
- Cesium变换3DTiles的位置(平移旋转缩放)
function add3DTilesetDataTrans(url) { //viewer1.scene.globe.depthTestAgainstTerrain = tr ...
最新文章
- linux驱动:音频驱动(四)ASoc之machine设备
- PHP中的Trait方法
- go 接口 构造器_Go 中接口值的复制
- 从“No space left on device”到删除海量文件
- js 数字格式化,只能输入正负整数,小数
- 会话(状态)管理Cookie与Session(二)
- JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
- 观《当幸福来敲门》有感
- 15 个为编程初学者准备的网站
- Angular 个人深究(二)【发布与订阅】
- 如何将Word/PDF转成高质量XML
- python对seo有什么用_pythonseo-python对于做SEO主要有什么作用
- 百度财报解析-百度云要变成老大哥
- linux中$符号有什么作用,linux中的“$”符号表示什么
- ajax提交用流的方式,ajax 请求 后台返回的文件流
- 赛效:电脑在线美化图片怎么弄?
- STM32F0项目进阶之实时时钟DS1307
- 在线多线网络测速工具
- 通信方式——8080并口
- 汽车软件设计的变化趋势