今天用OpenGL画图的时候,显示的画面老是不对,原来是reshape函数出了问题。在进行投影相关的操作前,必须将glMatrixMode设为GL_PROJECTION;之后必须将glMatrixMode设回为GL_MODELVIEW。否则之后针对物体的变换都不起作用。
void reshape(int width,int height)
{
glViewport (0, 0, (GLsizei) width, (GLsizei) height);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho (-l, l, -w, w ,-10*h ,10*h);//或glFrustum(),gluPerspective()等投影相关的操作。
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity() ;
}
看到了一篇文章介绍这两者的区别:http://home.kaoyan.com/home.php?mod=space&uid=2820987&do=blog&id=45163
这两个都是glMatrixMode()函数的参数,那就先说说glMatrixMode吧~,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有,GL_PROJECTION,GL_MODELVIEW和GL_TEXTURE;
如果参数是GL_PROJECTION,这个是投影的意思,就是要对投影相关进行操作,也就是把物体投影到一个平面上,就像我们照相一样,把3维物体投到2维的平面上。这样,接下来的语句可以是跟透视相关的函数,比如glOrtho(),glFrustum()或gluPerspective()等。如果参数是GL_MODELVIEW,这个是对模型视景的操作,接下来的语句描绘一个以模型为基础的适应,这样来设置参数,接下来用到的就是像gluLookAt()这样的函数;若是GL_TEXTURE,就是对纹理相关进行操作;顺便说下,OpenGL里面的操作,很多是基于对矩阵的操作的,比如位移,旋转,缩放,所以,这里其实说的规范一点就是glMatrixMode是用来指定哪一个矩阵是当前矩阵,而它的参数代表要操作的目标,GL_PROJECTION是对投影矩阵操作,GL_MODELVIEW是对模型视景矩阵操作,GL_TEXTURE是对纹理矩阵进行随后的操作。
分享到:
相关推荐
基于粒子系统的火焰模拟的源代码 void CGLSetup::InitGL(GLsizei ... glMatrixMode(GL_MODELVIEW); // Set The Blending Function For Translucency glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_BLEND);
法线向量也需要从物体空间变换到观察空间,这与坐标变换不同,法线变换需要使用GL_MODELVIEW矩阵的逆变换的转置来完成。 裁剪坐标(ClipCoordinates)通过GL_PROJECTION矩阵进行变换,它定义了视锥体(frustum)和...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void idle() { roangles += 0.1f; glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc;, argv); glutInitDisplayMode(GLUT_SINGLE ...
glMatrixMode(GL_MODELVIEW); // 设置当前矩阵为模型视图矩阵 glPushMatrix(); // 保存当前模型视图矩阵栈顶的矩阵 glLoadIdentity(); // 重置当前矩阵为单位矩阵 } ``` ##### 2.2 平行投影视图 平行投影视图则...
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, projection); ``` #### 2. 屏幕坐标到窗口坐标转换 屏幕坐标需要先转换为窗口坐标。窗口坐标中的Y轴方向与屏幕坐标相反,因此...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } ``` 此段代码首先根据窗口的宽高比调整投影范围。如果窗口宽度小于等于高度,则垂直方向的投影范围会相应地进行调整;反之亦然。这种做法确保了无论窗口大小如何...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 5.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置太阳光源 GLfloat sun_light_position[] = {0.0f, 0.5f, 0.5f, 0.0f}; GLfloat sun_...
gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // 添加旋转 gl.glRotatef(angle, x轴旋转轴, y轴旋转轴, z轴旋转轴); // 绘制多面体 drawMultiCube(gl); // 自定义方法,实现多面体的绘制 } ``...
glMatrixMode(GL_MODELVIEW); } int main(void) { auxInitDisplayMode(AUX_SINGLE | AUX_RGBA); auxInitPosition(0, 0, 500, 500); // ... } ``` 在这个示例中,我们设置了源因子为 `GL_SRC_ALPHA`,目的因子...
`: 设置当前操作的矩阵类型,例如`GL_MODELVIEW`表示模型视图矩阵,`GL_PROJECTION`表示投影矩阵。 - `glPushMatrix();`: 将当前矩阵压入堆栈。 - `glPopMatrix();`: 从堆栈中弹出最近的一个矩阵,使其成为当前...
If the matrix mode is either GL_MODELVIEW or GL_PROJECTION, all objects drawn after glScale is called are scaled. Use glPushMatrix and glPopMatrix to save and restore the unscaled coordinate system. ...
glMatrixMode(GL_MODELVIEW); ``` 现在我们可以开始实现三维旋转。OpenGL提供了`glRotatef()`函数来实现三维旋转。在`OnDraw()`函数中,我们可以根据用户输入或时间更新旋转角度: ```cpp float angleX = ...; // ...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } 基本的绘制框架: * glBegin(图元) ; glVertex3f(x,y,z); …… glEnd(); 其中,图元可以是点、线、三角形、四边形等。 常用的图元有: * GL_POINTS:绘制点 ...
GL.glMatrixMode(GL.GL_MODELVIEW); GL.glLoadIdentity(); } public override void glDraw() { GL.glClearColor(0.1f, 0.1f, 0.2f, 1.0f); GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); ...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 启用光源 glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } ``` 4. **键盘响应函数** - 创建`SpecialKeys(int key, int x, int y)`函数处理键盘输入。 ...
gl.glMatrixMode(GL10.GL_MODELVIEW); ``` 关键在于`onDrawFrame()`方法,我们将在这里绘制三棱锥。首先,我们需要定义三棱锥的顶点坐标和纹理坐标,然后创建顶点数组和纹理坐标数组。接着,使用`glDrawArrays()`...
- `glMatrixMode(GL_MODELVIEW)` 和 `glLoadIdentity()`:设置当前矩阵模式为模型视图矩阵,并重置该矩阵。 - `glTranslatef(x1, y1, -250.0f)`:将球平移到`(x1, y1, -250.0f)`的位置。 - `glColor3f(1.0f, 0.0f, ...
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINE_STRIP); // 首先以30...
这是您的关键部分:设置模型 glMatrixMode(/* GL_PROJECTION, GL_MODELVIEW */); // This sets up either the Projection or ModelView matrix to be editedglPushMatrix();glPopMatrix();glLoadIdentity(); // Set...
//这个函数其实就是对接下来要做什么进行一下声明 GL_MODELVIEW 模型视图 glLoadIdentity(); glPushMatrix();// 提供了相应的接口 { glRotatef(AngleX, 1.0f, 0.0f, 0.0f); glRotatef(AngleY, 0.0f, 1.0f, ...