O p e n G L OpenGL OpenGL 中,可以通过变换矩阵来实现视图的变化,想要获取变换矩阵,可以使用 g l G e t F l o a t v glGetFloatv glGetFloatv 或者 g l G e t D o u b l e v glGetDoublev glGetDoublev,参数是两个,前者是想要获取的矩阵,后者是一个指针,将获得的数据存放到指针指向的位置。

glGetFloatv(GL_PROJECTION_MATRIX, mat);	//	获取投影矩阵
glGetDoublev(GL_MODELVIEW_MATRIX, mat);	//	获取视图模型矩阵

如果想要给变换矩阵传数据,则需要使用 g l L o a d M a t r i x f glLoadMatrixf glLoadMatrixf 或者 g l L o a d M a t r i x d glLoadMatrixd glLoadMatrixd 来传,参数只有一个,就是要传输的数据,不过需要实现切换到所要传数据的矩阵。

glMatrixMode(GL_MODELVIEW);	//	切换到视图模型矩阵
glLoadMatrixf(mat);			//	给该矩阵传值
glMatrixMode(GL_PROJECTION);//	切换到投影矩阵
glLoadMatrixd(mat);			//	……

这里需要注意的是,这些矩阵并不是常规的按照行主序,而是列主序,并且 m a t mat mat 并不是 4 ∗ 4 4*4 44 的二维数组,而是空间为 16 16 16 个单位的数组,这里需要格外注意。

说了这么多,那么问题的关键来了,问题很容易描述,在某些时候,总是会出现可以获取变换矩阵,却无法加载变换矩阵(给矩阵赋值),运行也没有任何报错信息,视图也没有任何的变化,查看矩阵后发现 g l L o a d M a t r i x glLoadMatrix glLoadMatrix 函数并没有实现功能。

解决方案:经过再三查找,发现我的 g l L o a d M a t r i x glLoadMatrix glLoadMatrix 前使用了……

glBegin(GL_POINTS);

后边使用了……

glEnd();

也就是卡在这两个函数之间,这部分主要是进行渲染,无法修改变换矩阵,所以只需要将 g l L o a d M a t r i x glLoadMatrix glLoadMatrix 放到这两个函数之外就可以了。

这就很坑了,按道理遇见这种情况应该报错才行,可是编译运行的时候,一点点报错信息都没有,甚至没有一点点警告,太坑了。