glpushmatrix函数(写出双二次张量积Bezier曲面的矩阵表达式,并给出几何解释)

本文目录
写出双二次张量积Bezier曲面的矩阵表达式,并给出几何解释
void
display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(-80.0, 1.0, 1.0, 0.0);
for( int i = 0; i 《 32; ++i )
{
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,
0, 1, 12, 4, &ctrlpoints);
glEvalMesh3(GL_FILL, 0, 20, 0, 20);
}
glPopMatrix();
glFlush();
}
为什么调用glPushMatrix和glPopMatrix
glPushMatrix()将当前矩阵压入栈中,当前矩阵不清零,其下的操作及显示在当前的矩阵下继续进行,在使用glPopMatrix()后,当前的矩阵恢复到调用glPushMatrix()之前,在两者之间的各种变换不在起作用。
glPushMatrix、glPopMatrix操作其实就相当于栈里的入栈和出栈。
例如你当前的坐标系原点在你电脑屏幕的左上方。现在你调用glPushMatrix,然后再调用一堆平移、旋转代码等等,然后再画图。那些平移和旋转都是基于坐上角为原点进行变化的。而且都会改变坐标的位置,经过了这些变化后,你的坐标肯定不再左上角了。
那如果想恢复怎么办呢?这时就调用glPopMatrix从栈里取出一个“状态”了,这个状态就是你调用glPushMatrix之前的那个状态。就如很多opengl的书上所讲:调用glPushMatrix其实就是把当前状态做一个副本放入堆栈之中。
用OpenGL绘制小球,按给定的坐标点沿直线运动实现问题
#include 《GL/glut.h》
#include 《stdlib.h》
void myinit(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glDepthRange(0.0, 1.0); /* The default z mapping */
}
GLfloat tx = 0.0f, ty = 0.0f, tz = 0.0f;
void drawsphere(GLenum mode)
{
glPushMatrix();
glTranslatef( tx, ty, tz-90.0f);
glutWireSphere(1.0,10,10);
glPopMatrix();
}
void idle(void)
{
if( tx 《 20.0f )
tx += 0.2f;
else if( ty 《 20.0f )
ty += 0.2f;
else if ( tx 《 40.0f && ty 《 40.0f )
{
tx += 0.2f;
ty += 0.2f;
}
else
{
tx = ty = 0.0f;
}
glutPostRedisplay();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f,1.0f,1.0f);
glPushMatrix();
glBegin(GL_LINES);
glVertex3f( -50.0f,0.0f,-80.0f);
glVertex3f( 50.0f, 0.0f, -80.0f);
glVertex3f(0.0f, -50.0f,-80.0f);
glVertex3f(0.0f,50.0f, -80.0f);
glEnd();
glPopMatrix();
drawsphere(GL_RENDER);
glutSwapBuffers();
}
void myReshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat) 1.0, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef (-3.0, -3.0, -8.0);
}
static void
key(unsigned char k, int x, int y)
{
switch (k) {
case 27: /* Escape */
exit(0);
break;
default:
return;
}
glutPostRedisplay();
}
int
main(int argc, char **argv)
{
glutInitWindowSize(200, 200);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInit(&argc, argv);
glutCreateWindow(argv);
myinit();
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutKeyboardFunc(key);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}

更多文章:
vmware支持arm吗(Qemu vmware 是都是虚拟机吗有什么不同)
2026年5月7日 05:45
云数据库开审计(sqlserver如何设置数据库层面日志审计)
2025年12月13日 14:45
zxing-cpp不支持中文吗?请问谷歌开源项目“zxing”,“zxing“这个词怎么念吗
2026年5月12日 07:15
css 设置背景的颜色及形状?请问一下CSS3样式中如何让背景渐变与背景图片共存啊!
2025年6月13日 20:00
to close和closeing(closeto后面为什么可以直接接名词)
2025年10月28日 17:30
hbuilder浏览器不显示(最新版hbuilder换谷歌浏览器打不开)
2026年8月4日 09:00
量化中的feature和weight(同位素在量化计算中如何处理,有什么区别)
2026年8月8日 07:30
expect和exclude(expect和besides有什么区别)
2026年9月19日 02:30

















