概述


OpenGL旋转矩阵

旋转角度直接影响OpenGL GL_MODELVIEW矩阵的前三列,准确地说是向左、向上与向前三轴元素。例如,如果一沿X轴的单位向量(1,0,0)与任一3×3旋转矩阵相乘,旋转后的向量结果为:

也就是说,旋转矩阵的第一列(m0,m1,m2)表示旋转后的做轴。同样,第二列为上轴,第三列为前轴。

本文描述用旋转角度构造GL_MODELVIEW矩阵。

旋转轴

首先,我们看一看绕每个轴旋转:+X、+Y与+Z。我们以三种不同方式将三个轴投影到到一个平面,将要旋转的轴朝向你。正旋转方向为逆时针(右手规则)。

绕左(X)轴旋转(Pitch)


绕左轴(X)旋转

上轴(Y)与前轴(Z)的初始值为(0,1,0)与(0,0,1)。如果左轴(X)旋转A°,因此新的上轴从(1,0,0)变换为X‘为(0,cosA,sinA),新的前轴(Z')变为(0,-sinA,cosA)。新轴作为3×3旋转矩阵的列分量插入近来。旋转矩阵变为:

绕上(Y)轴旋转(Yaw,Heading)


绕上轴(Y)旋转

现在,我们旋转朝向你的向上向量B°。左(X)轴从(1,0,0)变为X’(cosB,0,-SinB)。前轴(Z)从(0,0,1)变换为Z‘(sinB,0,cosB)。

绕前轴(Z)旋转(Roll)


绕前轴(Z)旋转

如果我们旋转前轴(Z)C°,初始左轴(1,0,0)变为X’(cosC,sinC,0),上轴(0,1,0)变为Y‘(-sinC,cosC,0)。

角轴

我们可以通过上面3个矩阵相乘的方式将这些分开的轴旋转结合成一个矩阵。注意矩阵乘法是不可呼唤的,因此,矩阵乘法的不同顺序产生不同的结果。共有6中不同的结合方式:RxRyRz、RxRzRy、 RyRxRz、RyRzRx、RzRxRy与RzRyRx

组合旋转矩阵的左列为旋转后的左轴,中间列为上轴,右列为前轴。







下面是RxRyRz结合的C++实例代码。它以Rz(roll)、Ry(yaw)、Rx(pitch)顺序执行3个旋转操作。左轴、上轴与前轴的结果可以用于构造GL_MODELVIEW矩阵。

struct Vector3
{
float x;
float y;
float z;
Vector3() : x(0), y(0), z(0) {}; // 创建时初始化
}; ///////////////////////////////////////////////////////////////////////////////
//将欧拉(x,y,z)转换到(左, 上, 前)
// 旋转矩阵的列代表左轴、上轴与前轴。
// 旋转顺序为:Roll->Yaw->Pitch (Rx*Ry*Rz)
// Rx: 绕X轴旋转, pitch
// Ry: 绕Y轴旋转, yaw(heading)
// Rz: 绕Z轴旋转, roll
// Rx Ry Rz
// |1 0 0| | Cy 0 Sy| |Cz -Sz 0| | CyCz -CySz Sy |
// |0 Cx -Sx|*| 0 1 0|*|Sz Cz 0| = | SxSyCz+CxSz -SxSySz+CxCz -SxCy|
// |0 Sx Cx| |-Sy 0 Cy| | 0 0 1| |-CxSyCz+SxSz CxSySz+SxCz CxCy|
///////////////////////////////////////////////////////////////////////////////
void anglesToAxes(const Vector3 angles, Vector3& left, Vector3& up, Vector3& forward)
{
const float DEG2RAD = 3.141593f / 180;
float sx, sy, sz, cx, cy, cz, theta; // 绕X轴旋转 (pitch)
theta = angles.x * DEG2RAD;
sx = sinf(theta);
cx = cosf(theta); // 绕Y轴旋转 (yaw)
theta = angles.y * DEG2RAD;
sy = sinf(theta);
cy = cosf(theta); // 绕Z轴旋转 (roll)
theta = angles.z * DEG2RAD;
sz = sinf(theta);
cz = cosf(theta); // 确定左轴
left.x = cy*cz;
left.y = sx*sy*cz + cx*sz;
left.z = -cx*sy*cz + sx*sz; // 确定上轴
up.x = -cy*sz;
up.y = -sx*sy*sz + cx*cz;
up.z = cx*sy*sz + sx*cz; // 确定前轴
forward.x = sy;
forward.y = -sx*cy;
forward.z = cx*cy;
}

英文原文:http://www.songho.ca/opengl/gl_anglestoaxes.html

OpenGL角轴的更多相关文章

  1. OpenGL观察轴

    旋转矩阵可以通过观察向量构造,观察向量可以是3D空间的两个或三个点.如果一个处于P1点的对象面向P2点,则观察向量就是P2-P1,如下图: 首先,前轴向量通过归一化的观察向量简单计算而来. 其次,左轴 ...

  2. OpenGL变换

    概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操 ...

  3. OpenGL变换【转】

    http://www.cnblogs.com/hefee/p/3811099.html OpenGL变换 概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTIO ...

  4. 《Real Time Rendering》第四章 图形变换

    图形变换是一个将例如点.向量或者颜色等实体进行某种转换的操作.对于计算机图形学的先驱者,掌握图形变换是极为重要的.有了他们,你就可以对象.光源以及摄像机进行定位,变形以及动画添加.你也可以确认所有的计 ...

  5. 关于Unity四元数相乘先后顺序的问题

    在unity中四元数和向量相乘在unity中可以变换旋转.四元数和四元数相乘类似矩阵与矩阵相乘的效果. 矩阵相乘的顺序不可互换,只有特殊条件矩阵才可互换.四元数相乘类似,今天就因为这个问题掉进坑里了, ...

  6. Unity3D-数学相关

    1. Transform.rotation:对象在世界坐标系下的旋转:Transform.localRotation:对象在父对象的局部坐标系下的旋转.两个变量的类型均为四元素. (1)得到游戏对象当 ...

  7. cocos2d-x CCNode类

    文章引用自http://blog.csdn.net/qiurisuixiang/article/details/8763260 1 CCNode是cocos2d-x中一个非常重要的类.CCNode是场 ...

  8. [cocos2d-x] --- CCNode类详解

    Email : awodefeng@163.com 1 CCNode是cocos2d-x中一个很重要的类,CCNode是场景.层.菜单.精灵等的父类.而我们在使用cocos2d-x时,接触最多的就是场 ...

  9. Unity脚本-Rotate旋转相关知识点

    1,Transform旋转   transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0);   tr ...

随机推荐

  1. It will affect staff as well.

    Premier Foods has reduced its number of suppliers dramatically in the last 12 months. In 2013 it mad ...

  2. Linux下使用NMON监控、分析系统性能

    一.下载nmon. 根据CPU的类型选择下载相应的版本:http://nmon.sourceforge.net/pmwiki.php?n=Site.Downloadwget http://source ...

  3. iOS仿直播带有气泡动画的UIButton

    现在直播软件确实很火,因为需要就写了一个带有动画气泡的按钮,代码中的部分动画有参考到其他童鞋,在这里万分感谢! .h文件 @interface YYBubbleButton : UIButton @p ...

  4. Direct3D 10学习笔记(三)——文本输出

    本篇将简单整理Direct3D 10的文本输出的实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅 ...

  5. Destoon B2B 调优SQL后 生成首页仍然慢或不成功的原因

    修改php.ini文件,查找 ;date.timezone = ,把前面的分号去掉在 “=”后面加上时区. 比如:Asia/Shanghai (上海) 自动task有上面的问题 但后台生成时这样修改后 ...

  6. 使用Cargo实现自动化部署

    Cargo是一组帮助用户操作Web容器的工具,它能帮助用户实现自动化部署,而且它几乎支持所有的Web容器,如Tomcat.JBoss.Jetty和Glassfish.Cargo通过cargo-mave ...

  7. Linux内核分析——分析system_call中断处理过程

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我选择的是get ...

  8. HTML核心元素

    一 HTML核心元素 1.文本标题 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> ... ...

  9. 0909 a newbeginning

    操作系统无意是所有计算机系各专业的基础,如果不懂这门课程的知识,大学四年计算机可以说是白读了. 这学期很荣幸能上MISSDU的操作系统,我也希望能学到关于操作系统的知识,以至于丰富自己的专业知识. 下 ...

  10. Ansible-Tower快速入门-8.创建组织【翻译】

    创建组织 首行,点击组织标签,组织中将包括有:用户,团队,项目,和清单等项,在tower的对象层级中,组织是最高级对象. 然后,点击增加按钮,如: 为所创建的组织键入一个简单的名称和描述,这些信息你在 ...