实验七
三维图形的几何变换
一、实验目的
1、掌握三维图形的几何变换;
2、掌握投影变换算法。
二、实验要求
1、利用三维图形的平移、缩放、旋转等几何变换,任意画出一个三维综合图形。
2、任意画出一个二维半图形, 分别画出该图形的正视图、俯视图、侧视图;(提
高题,在第四象限画出这个二维半图形的轴测图)。
三、实验代码
1、
#include
GLfloat yRot = 0;
GLfloat xRot = 0;
GLfloat zRot = 0;
void Init()
{
}
glClearColor(1.0, 1.0, 1.0, 1.0); //背景
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);//对投影矩阵应用随后的矩阵操作.
glLoadIdentity();//复位
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0); //透视投影
glMatrixMode(GL_MODELVIEW); //设置当前矩阵模式(对模型视景矩阵堆栈应用随后的矩阵操
作.)
glLoadIdentity(); //将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作
gluLookAt(1.3, 1.6, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//gluLookAt()共有九个参数,分别是眼睛的位置,眼睛朝向的位置,以及相机朝向的方向。
}
void Mydisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0, 2.0, -2.0, 2.0, -100, 100);
glPointSize(1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.3, 1.6, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//保存当前位置,并旋转
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glRotatef(zRot, 0.0f, 0.0f, 1.0f);
//开始绘图
glPushMatrix();
glColor3f(0.0f, 1.0f, 1.0f);
glTranslated(1.125, 0.125, 0.125);
glutWireTeapot(0.5);
//茶壶
glPopMatrix();
glPushMatrix();
glColor3f(0.0f, 1.0f, 1.0f);
glTranslated(0.125, 0.125, 1.125);
glutWireSphere(0.25, 8, 8);//球体
glPopMatrix();
glPushMatrix(); //保存当前位置
glTranslated(0.0, 1.0, 1.0);
GLUquadricObj * quadricObj = gluNewQuadric();
gluQuadricDrawStyle(quadricObj, GLU_LINE);
gluCylinder(quadricObj, 0.2, 0.2, 0.3, 6, 6);
glRotated(-90, 0.0, 0.0, 0.0);
glPopMatrix();
glPopMatrix();//回到原来位置
glutSwapBuffers();//双缓冲技术
}
void SpecialKeys(int key, int x, int y)
{
}
if (key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if (key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if (key == GLUT_KEY_UP)
xRot -= 5.0f;
if (key == GLUT_KEY_DOWN)
xRot += 5.0f;
if (key> 356.0f)
yRot = 0.0f;
if (key< -1.0f)
yRot = 355.0f;
if (key> 356.0f)
xRot = 0.0f;
if (key< -1.0f)
xRot = 355.0f;
if (key == GLUT_KEY_F1) //绕着 z 轴旋转
zRot += 5.0f;
glutPostRedisplay(); // 使用新的坐标重新绘制场景
int main(int argv, char *argc[])
{
glutInit(&argv, argc);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(800, 800);
glutInitWindowPosition(400, -400);
glutCreateWindow("三维图形");
Init();
glutDisplayFunc(Mydisplay);
glutReshapeFunc(Reshape);
glutSpecialFunc(SpecialKeys);
glutMainLoop();
}
实验二:
#include
#include
#include
int x[10] = { 0,100,100,0,0,100,100,0,50 };
int y[10] = { 0,0,100,100,0,0,100,100,50 };
int z[10] = { 0,0,0,0,0,100,100,100,100,150 };
int Id[30] = { 0,1,2,3,0,4,5,6,7,4,8,7,3,4,6,2,5,1,6,8,5 };
int flog[30] = { 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
void Init() {
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
}
void Reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void XY(void){
//坐标
glLineWidth(1);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex2i(-320, 0);
glVertex2i(320, 0);
glVertex2i(0, -240);
glVertex2i(0, 240);
glEnd();
glFlush();
}
void TopView(int tx, int ty) {
int i, j, k;
glBegin(GL_LINES);
for (i = 0;i <= 30;i++) {
j = Id[i];
k = Id[i + 1];
if (flog[i + 1] == 1) {
glVertex3i(-x[j] - tx, -y[j] - ty, 0);
glVertex3i(-x[k] - tx, -y[k] - ty, 0);
}
glEnd();
glFlush();
}
}
void FrontView(int tx, int ty) {
int i, j, k;
glBegin(GL_LINES);
for (i = 0;i < 30;i++) {
j = Id[i];
k = Id[i + 1];
if (flog[i + 1] == 1) {
glVertex3i(-x[j] - tx, z[j] + ty, 0);
glVertex3i(-x[k] - tx, z[k] + ty, 0);
}
}
glEnd();
glFlush();
}
void LeftView(int tx, int ty) {
int i, j, k;
glBegin(GL_LINES);
for (i = 0;i < 30;i++) {
j = Id[i];
k = Id[i + 1];
if (flog[i + 1] == 1) {
glVertex3i(y[j] + tx, z[j] + ty, 0);
glVertex3i(y[k] + tx, z[k] + ty, 0);
}
}
glEnd();
glFlush();
}
void mydisplay(void) {
int tx = 80, ty = 50;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
XY();
glLineWidth(3);
glColor3f(0.0, 1.0, 0.0);
FrontView(tx, ty);
glColor3f(0.0, 0.0, 1.0);
TopView(tx, ty);
glColor3f(1.0, 0.0, 0.0);
LeftView(tx, ty);
}
int main(int argv, char *argc[])
glutInit(&argv, argc);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(640, 480);
glutInitWindowPosition(100, 100);
glutCreateWindow("Demo");
Init();
glutDisplayFunc(mydisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
{
}
四、实验结果截图