无法加载和保存矩阵Opengl
Posted
技术标签:
【中文标题】无法加载和保存矩阵Opengl【英文标题】:Cant load and save matrix Opengl 【发布时间】:2012-11-24 23:18:38 【问题描述】:我有以下代码:
void setupCamera()
// Clear the screen buffer
glClear(GL_COLOR_BUFFER_BIT);
// reset the projection matrix //
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// and set the perspective with the current field of view,
// and the current height and width
gluPerspective(fov, ratio, objDepth - objRadius * 2,
objDepth + objRadius * 2);
glViewport(0, 0, WINDOW_SIZE, WINDOW_SIZE);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(first)
glMultMatrixf(rotMatrix);
first = true;
//translate everything to be in objDepth//
glTranslatef(initX * 0.01, initY * 0.01, (-1) * objDepth);
glRotatef(200 * angle, rotationVector[0], rotationVector[1],
rotationVector[2]);
glutWireTeapot(1.5);
glGetFloatv (GL_MODELVIEW_MATRIX, rotMatrix);
旋转向量持有旋转轴,
translate 用于将所有内容移动到正确的位置。
问题是,我使用glMultMatrixf
是为了使用最后保存的矩阵,
先旋转再平移,然后用glGetFloatv
再次保存矩阵。
这个函数经常被定时器调用,但是出于某种原因
我想不通,矩阵不会保存任何东西,总是一遍又一遍地初始化,
意思是旋转总是用小角度(因为矩阵没有保存)。
保存的矩阵没有在代码中的其他任何地方使用。
有什么想法吗?
【问题讨论】:
你不想使用 glLoadMatrix 而不是 multmatrix 吗?另外,展示如何构造 GLfloat 数组。另外你为什么要做getFloat之类的?你为什么不使用数学库来处理矩阵乘法?像这样从 OpenGL 推送和获取东西会导致速度变慢。甚至使用 GLpush/pop。 使用glGetFloatv后第一次初始化,之后first
布尔变量为true
,可以加载并乘以矩阵
【参考方案1】:
您是否在每次滴答时都调用 setupCamera() ?如果你是,你可能想停下来。您不需要每帧都重置投影矩阵,除非需要,否则您也不需要重置模型视图矩阵。考虑自行增加角度和平移,而不是存储整个矩阵。
您可能要采取的步骤是:
1) 初始化矩阵。将投影初始化为身份并使用 gluPerspective。然后切换到模型视图并将其初始化为身份。这实际上应该只执行一次。
2) 在您的更新循环中,根据它们的代表变量增加您的角度和平移。
3) 在您的绘图循环中,使用 glPushMatrix() 来推送模型视图矩阵。使用 gltranslate 和 glrotate 应用您的矩阵更改,然后绘制您正在绘制的任何内容。之后,glPopMatrix() 以返回身份。
我仍然不太明白您是否正在尝试绘制某些东西并认为您需要每帧读取、存储和恢复当前 glMatrix,或者您是否真的在尝试评估 OpenGL 对矩阵的作用并真正做到需要读出来。
【讨论】:
感谢 zero298 的回答,我同意您的 cmets,但我仍然不想一直对角度求和,因为它可能会变成不同的角度。我正在尝试绘制一些东西(在代码中编辑),但我不明白如何保存我正在处理的模型视图矩阵,然后进行所有需要的转换以上是关于无法加载和保存矩阵Opengl的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题
我的OpenGL学习进阶之旅关于OpenGL ES 绘制纹理,因为加载纹理坐标设置错误,导致纹理无法渲染的问题