OpenGL矩阵类(C++)

您所在的位置:网站首页 矩阵概述 OpenGL矩阵类(C++)

OpenGL矩阵类(C++)

2023-08-27 09:17| 来源: 网络整理| 查看: 265

概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述

OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE与GL_COLOR),并且为这些矩阵提供变换函数:glLoadIdentity()、glTranslatef()、glRotatef()、glScalef()、glMultiMatrixf()、glFrustum()与glOrtho()。

这些内置矩阵与函数对于开发简单的OpenGL程序与理解矩阵变换很有帮助。不过,一旦你的应用程序变得复杂起来,更好的选择是为每一个可移动模型对象管理自己的矩阵实现。此外,在OpenGL可编程管线(GLSL)中,你不能够使用这些内置矩阵函数。如OpenGL v3.0+、OpenGL ES v2.0+与WebGL v1.0+。你必须拥有属于自己的矩阵实现,并且向OpenGL着色语言传递该矩阵数据。

该篇文章提供一个独立运行的、通用4×4矩阵类----C++写的Matrix4,并且描述如何将该矩阵类整合到OpenGL程序中。该矩阵类只依赖于相似的矩阵:定义于Vector.h的Vector3与Vector4。这些向量也包含在matrix.zip。

Matrix4创建&初始化 Matrix4使用行优先 OpenGL使用列优先

Matrix4类包含用于存放4×4方阵的16个元素的浮点数据类型数组,同时拥有3个构造函数用以实例化Matrix4类对象。

注意,Matrix4类使用行优先标记法,而不是OpenGL使用的列优先顺序。不过,行优先与列优先顺序只是将多维数组保存在线性(1D)内存中的不同方式,矩阵算法与操作并没有不同。

使用默认构造函数(不带任何参数的),Matrix4对象创建一个单位矩阵。另外3个构造函数使用16个参数或一个具有16个元素的数组。你也可以使用拷贝构造函数与赋值操作符(=)初始化Matrix4对象。

顺便说一下,Matrix4对象的拷贝构造函数与赋值构造函数将由C++编译器自动为你产生。

下面为以多种方式构造Matrix4对象的示例代码。首先,在使用Matrix4.h类的代码中包含Matrices.h文件。

#include "Matrices.h" // 为了使用 Matrix2, Matrix3, Matrix4 .. // 使用默认构造函数创建一个单位矩阵 Matrix4 m1; // 使用16个元素创建一个矩阵 Matrix4 m2(1, 1, 1, 1, // 第一行 1, 1, 1, 1, // 第二行 1, 1, 1, 1, // 第三行 1, 1, 1, 1); // 第四行 // 使用数组创建一个矩阵 float a[16] = {2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2}; Matrix4 m3(a); // 使用构造函数创建一个矩阵 Matrix4 m4(m3); Matrix4 m5 = m3; ... Matrix4存取器(赋值与取值) 赋值

Matrix4类提供set()方法赋值所有16个元素。

Matrix4 m1; // 使用16个浮点数给矩阵赋值 m1.set(1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1); // 使用数组给矩阵赋值 float a1[] = {2,2,2,2, 2,2,2,2, 2,2,2,2, 2,2,2,2}; m1.set(a1);

你也可以每次使用setRow()或setColumn()设置行或列元素。setRow()与setColumn()的第一个参数以0为基准的(0,1,2或3)。第二个参数为数组指针。

Matrix4 m2; float a2[4] = {2,2,2,2}; // 使用行索引与数组设置一行 m2.setRow(0, a2); // 第一行 // 使用列索引与数组设置一列 m2.setColumn(2, a2); // 第三列 单位矩阵

Matrix4类拥有一个特殊的赋值函数identity()以创建一个单位矩阵。

// 设置单位矩阵 Matrix4 m3; m3.identity();

 

获取

Matrix4::get()方法返回16个元素数组的指针。getTranspose()返回转置后的矩阵元素。它可用于向OpenGL传递矩阵数据。更详细信息请参考实例。

// 以数组指针方式获取矩阵元素 Matrix4 m4; const float* a = m4.get(); // 向OpenGL传递矩阵 glLoadMatrixf(m4.getTranspose()); 访问单独的元素

矩阵的独立元素也可以通过下标操作符[]访问。

Matrix4 m5; float f = m5[0]; // 获取第一个元素 m5[1] = 2.0f; // 设置第2个元素 打印Matrix4

为了调试,Matrix4也提供一个使用std::ostream操作符



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3