OpenGL角轴
概述

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角轴的更多相关文章
- OpenGL观察轴
旋转矩阵可以通过观察向量构造,观察向量可以是3D空间的两个或三个点.如果一个处于P1点的对象面向P2点,则观察向量就是P2-P1,如下图: 首先,前轴向量通过归一化的观察向量简单计算而来. 其次,左轴 ...
- OpenGL变换
概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操 ...
- OpenGL变换【转】
http://www.cnblogs.com/hefee/p/3811099.html OpenGL变换 概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTIO ...
- 《Real Time Rendering》第四章 图形变换
图形变换是一个将例如点.向量或者颜色等实体进行某种转换的操作.对于计算机图形学的先驱者,掌握图形变换是极为重要的.有了他们,你就可以对象.光源以及摄像机进行定位,变形以及动画添加.你也可以确认所有的计 ...
- 关于Unity四元数相乘先后顺序的问题
在unity中四元数和向量相乘在unity中可以变换旋转.四元数和四元数相乘类似矩阵与矩阵相乘的效果. 矩阵相乘的顺序不可互换,只有特殊条件矩阵才可互换.四元数相乘类似,今天就因为这个问题掉进坑里了, ...
- Unity3D-数学相关
1. Transform.rotation:对象在世界坐标系下的旋转:Transform.localRotation:对象在父对象的局部坐标系下的旋转.两个变量的类型均为四元素. (1)得到游戏对象当 ...
- cocos2d-x CCNode类
文章引用自http://blog.csdn.net/qiurisuixiang/article/details/8763260 1 CCNode是cocos2d-x中一个非常重要的类.CCNode是场 ...
- [cocos2d-x] --- CCNode类详解
Email : awodefeng@163.com 1 CCNode是cocos2d-x中一个很重要的类,CCNode是场景.层.菜单.精灵等的父类.而我们在使用cocos2d-x时,接触最多的就是场 ...
- Unity脚本-Rotate旋转相关知识点
1,Transform旋转 transform.Rotate(X, Y, Z);//分别绕X,Y,Z轴旋转,可写为绕某个轴旋转,栗子transform.Rotate(0, 90, 0); tr ...
随机推荐
- 《java异常的一些总结》
关于Java中异常的一些总结: 3 有些时候,程序在try块里打开了一些物理资源(例如数据库连接,网络连接. 4 和磁盘文件等),这些物理资源都必须显示回收. 5 6 注意:Java的垃圾回收机制不会 ...
- css3 文字轮番滚动效果2——改进版
1.优化了之前的代码: 2.修正了先前按照文字的条目的数量计算速度的问题,现在改为按照字符的个数计算动画执行一次需要的时间,更为精确: 3.增添了每一行JS代码的注释. 4.这个案例的用途一般为告警信 ...
- IOS managerTime
1. NSString ->NSdate NSString *birthday = self.btnBirthday.titleLabel.text; NSDateFormatter *dat ...
- Android深度探索--HAL与驱动开发----第五章读书笔记
第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...
- sync_with_stdio
/* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...
- Unity Ugui射线坐标转换总结
世界空间中的点坐标转换到屏幕坐标: screenPos = RectTransformUtility.WorldToScreenPoint(cam, worldPos.transform.positi ...
- OPENCV配置 C1083: 无法打开包括文件:“opencv2/opencv.hpp”
本人没实操过C/C++,理论看过不少. 目前出于提升技术的考虑想做OPENCV 配置了2天,总算是配置好了..遇到不少问题. 计算机配置WIN10,用户环境变量配置也郁闷过... JDK等配置方式,配 ...
- 闲扯游戏编程之html5篇--山寨版《flappy bird》源码
新年新气象,最近事情不多,继续闲暇学习记点随笔,欢迎拍砖.之前的〈简单游戏学编程语言python篇〉写的比较幼稚和粗糙,且告一段落.开启新的一篇关于javascript+html5的从零开始的学习.仍 ...
- mysql数据库引擎 MyISAM和 InnoDB区别
1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...
- strlen 字符型数组和字符数组 sizeof和strlen的区别 cin.get(input,Arsize)
strlenstrlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值 ...