我们知道,在opengl中,如果模型中点不在原点,先平移后旋转会导致模型的位移发生变化。但在项目中遇到这么一个问题,如果不知道模型中点,或者知道模型中点一定不在原点,但我们也只需要模型方向,那么我们直接将模型旋转会得到我们想要的方向吗?即如果先平移后旋转能不能得到想要的方向?

这个地方我疑惑了很久,因为轴只有方向没有位置,默认的旋转会朝着原点计算,当时的想法是不能,想着可能整个模型会绕着原点旋转,相当于位移了,而本身形状不会变化,但结果显然是错的。

首先做了一个demo,一个中心在原点的正方形(灰色)先绕z轴旋转30度,再沿x轴平移0.5个单位(红色),另一个正方形则相反(蓝色):

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//原图glMatrixMode(GL_MODELVIEW);glLoadIdentity();glBegin(GL_QUADS);glColor3f(0.5,0.0,0.0);glVertex3f(-0.1,0.1,0.0);glVertex3f(0.1,0.1,0.0);glVertex3f(0.1,-0.1,0);glVertex3f(-0.1,-0.1,0);glEnd();//先旋转再平移glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.5,0.0,0.0);glRotatef(30.0,0.0,0.0,1.0);glBegin(GL_QUADS);glColor3f(0.5,0.0,0.0);glVertex3f(-0.1,0.1,0.0);glVertex3f(0.1,0.1,0.0);glVertex3f(0.1,-0.1,0);glVertex3f(-0.1,-0.1,0);glEnd();//先平移再旋转glMatrixMode(GL_MODELVIEW);glLoadIdentity();glRotatef(30.0,0.0,0.0,1.0);glTranslatef(0.5,0.0,0.0);glBegin(GL_QUADS);glColor3f(0.0,0.0,0.5);glVertex3f(-0.1,0.1,0.0);glVertex3f(0.1,0.1,0.0);glVertex3f(0.1,-0.1,0);glVertex3f(-0.1,-0.1,0);glEnd();//坐标轴glMatrixMode(GL_MODELVIEW);glLoadIdentity();glBegin(GL_LINES);glColor3f(1.0,1.0,1.0);glVertex3f(0.0,1.0,0.0);glVertex3f(0.0,-1.0,0.0);glVertex3f(1.0,0.0,0.0);glVertex3f(-1.0,0.0,0.0);glEnd();

demo结果:

我们可以看到,两种行为的正方形都成功绕着z轴旋转了30度,仅是位移不同。

我们来看看为什么?

在https://jingyan.baidu.com/article/414eccf617a9c66b421f0a5e.html文章中讲解了一个原因,看着很有道理,但是他这个原理起点有点歧义,他是以矩阵乘法的先后顺序来标定模型动作的先后,也就是说,在上面例子中,他认为是红色图形先做了平移,再做了旋转。我查了一些资料,这种看法也有,但主流还是本文这么认为,因为最先与顶点接触的是右边的矩阵: ,所以先后顺序应该从右向左读这个乘法。

好了,那如果先旋转再平移,从数学上怎么解释这个现象呢?

我们设旋转矩阵为R,位移为T,原位置为P,那么先旋转再平移,就可以表示为:res=R*P+T; 同理,先平移再旋转结果表达式为:res=R*(P+T)=R*P+R*T;

从表达式可以看出:最终两种结果模型本身都一样地旋转了R,但是先平移的结果位移也绕原点旋转了R。也就是说,如果只考虑模型方向,两种结果并没有差别。

最后再做一个笔记,也是以前理解的一个错误(以前我认为四元数旋转就直接以模型中点旋转了),以此为鉴。旋转有三种表达形式:旋转矩阵,欧拉角和四元数,但这三种仅是在数学上表达不一样,也有各自的优劣,但本质上还是一样的,归根到底,最终都转换到了旋转矩阵和顶点的乘法运算。

opengl 先旋转后平移和先平移后旋转解惑相关推荐

  1. 计算机图形与OpenGL学习五(二维几何变换1.平移、旋转、缩放)

    二维几何变换(平移.旋转.缩放) 本章涉及数学变换比较多,代码是次要的,数学理论可自己推导一下. [二维平移] 通过将二维量加到一个点的坐标上来生成一个新的坐标位置,可以实现一次平移.将平移距离加到原 ...

  2. 【Threejs 微信小程序】小程序加载外部模型后对模型进行平移旋转操作

    一.效果展示 需要实现的功能,对已经加载进小程序里的模型进行沿着xyz轴方向去旋转和平移. 如下图的效果: 点击底部的按钮,对模型进行平移和旋转操作. 二.方法描述 关于平移和旋转的方法 比如沿着 Y ...

  3. python函数图像平移_[Python图像处理]六.图像缩放,图像旋转,图像翻转与图像平移...

    图像缩放 图像缩放主要是调用resize()函数实现,result = cv2.resize(src, dsize[, result[.fx, fy[,interpolation]]])  其中src ...

  4. python-opencv 图像平移旋转变换、以及图像旋转前后坐标值映射关系

    图像的平移,旋转变换以及仿射与投影都需要先定义转换矩阵,然后使用cv2.warpAffine()根据变换矩阵完成转换 imgRotation = cv2.warpAffine(img, mat,(wi ...

  5. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球实现 阅读目录(Content) 2016-07-08 2016-02-10 1. 轨迹球原理 2. 轨迹球实现1) 计算投影点2) 计 ...

  6. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  7. Flutter·变换·先旋转再平移与先平移再旋转

    0 前言 最近在学习<Flutter实战>,在变换章节遇到作者提出的一个思考题: 使用Transform对其子组件先进行平移然后再旋转和先旋转再平移,两者最终的效果一样吗?为什么? 动手实 ...

  8. 自定义QGraphicsItem实现平移、改变尺寸和旋转

    文章目录 1. 平移 2. 改变尺寸 3. 旋转 我们在使用QGraphicsView框架的时候,经常需要自定义QGraphicsItem,并且需要实现Item的平移.改变大小和旋转的效果.接下来介绍 ...

  9. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转

    Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...

最新文章

  1. Python pip工具初步学习
  2. 设计灵感|排版死板?可能是你的角度不对!
  3. SpringBoot整合Jersey2.x实现文件上传API
  4. 移动设备响应式网站之CSS媒体查询
  5. 基础网络函数介绍及其Cpp实例(C++)
  6. 【心路历程】(NOIP 206)(HNOI 358)
  7. 菜鸟到高手:SQL开发进阶常用精妙语句
  8. matlab 入门 mobi,MATLAB基础教程 pdf epub mobi txt 下载
  9. laravel whereDoesntHave 查询不等于条件的数据
  10. [我参加NVIDIA Sky Hackathon](模型训练ssd系列)
  11. 英语写计算机作文600字,介绍电脑 computer 英语作文
  12. MYSQL笔试题(考试题)附带答案
  13. 蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛
  14. Android开发 实现跑马灯效果滚动字幕
  15. seo关键字优化条例
  16. 【iPhone4s降级】2021年初自制固件降级IOS6.1.3
  17. 不可抗力与不可抗拒的因素的区别
  18. MySQL | SELECT
  19. 浅谈一下光学合成孔径技术的原理(一)
  20. echarts柱状图的X轴Y轴加单位的写法

热门文章

  1. 云计算演义(11)为什么阿里云不及格?
  2. cad画不规则实体_cad画不规则曲线的方法步骤图
  3. 武汉交通职业学院计算机协会,2018年中国计算机学会(CCF)职业教育大会在苏州顺利落幕...
  4. php 查询功能,php实现查询功能(数据访问)
  5. 证券数据接口 查询证券编码及基本上市信息
  6. Bit Vector算法
  7. 锐角三角函数怎么用计算机算,锐角三角函数:运用计算器
  8. DJ1 计算机系统概述
  9. 计算机红外,红外光谱
  10. conceptdraw office(专业办公套件) v6.0.0附安装教程