OpenGL 房子

元旦上的图形学的外教

Opengl编程

前几个实验挺简单的  实现一些基本的点 线 面 多年变形的绘制   颜色的变化  位置的改变 等

最后一个实验 绝对的坑  到现在也没懂那是什么

大作业为house  要有房子,树,太阳等

效果如下

//#include<GL/glut.h>    //头文件  到时候需要改一下  此头文件在codeblocks环境下运行

#include<GL/glew.h>        //此头文件在vs环境下运行
#include<GL/freeglut.h>
#include<GL/gl.h>

#include<iostream>
using std::cout;
#define _USE_MATH_DEFINES // for C++
#include <math.h>
GLfloat w = 700;
GLfloat h = 700;
double rotate_x = 0.0;
double rotate_y = 0.0;
# define  white  1.0 ,  1.0  ,  1.0   // 对颜色的宏定义
# define  green  0.0 ,  0.502,  0.0
# define  red    1.0 ,  0.0  ,  0.0
# define  gray   0.502, 0.502,0.502
# define  hgray  0.117, 0.180,0.227
# define  blue   0.0  , 0.0  ,  1.0
# define  pi  3.14159265
# define  gold   1.0,215.0/255.0,0.0
# define  hgreen 0.0,100.0/255.0,0.0
# define  brown  210.0/255.0, 105.0/255.0,  30.0/255.0
# define  men   244.0/255.0 ,164.0/255.0 , 96.0/255.0
# define  menba   139.0/255.0 ,69.0/255.0,19.0/255.0
double fang[8][3];             // 定义长方体的8个顶点
                               // 定义constract函数  当给定长方体的最里面的点时,
                               // 计算其余的7个顶点 并赋值给fang
double san[8][3];              // 定义地面为梯形的长方体
void drawSphere(double r, int lats, int longs,double x,double y,double z) {
	int i, j;
	for(i = 0; i <= lats; i++) {
		double lat0 = pi * (-0.5 + (double) (i - 1) / lats);   // M_PI
		double z0  = sin(lat0);
		double zr0 =  cos(lat0);

		double lat1 = pi * (-0.5 + (double) i / lats);
		double z1 = sin(lat1);
		double zr1 = cos(lat1);

		glBegin(GL_QUAD_STRIP);
		glScaled(100,100,100);
		for(j = 0; j <= longs; j++) {
			double lng = 2 * pi * (double) (j - 1) / longs;
			double x = cos(lng);
			double y = sin(lng);
			glNormal3f(x * zr0, y * zr0, z0);
			glVertex3f(zr0, zr0, z0);
			glNormal3f(x * zr1, y * zr1, z1);
			glVertex3f(zr1, zr1, z1);
		}
		glEnd();
	}
}
void cons(double x,double y,double z,double x1,double y1,double z1){
    san[0][0] = x;
    san[0][1] = y;
    san[0][2] = z;     //  第0个点

    san[1][0] = x;
    san[1][1] = y;
    san[1][2] = z+z1;   //  第1个点

    san[4][0] = x;
    san[4][1] = y+y1;
    san[4][2] = z;     //  第4个点

    san[5][0] = x;
    san[5][1] = y+y1;
    san[5][2] = z+z1/2;      //  第5个点
    for(int i=0;i<3;i++){
        if(i==0){
        san[3][i]=san[0][i]+x1;
        san[2][i]=san[1][i]+x1;
        san[6][i]=san[4][i]+x1;
        san[7][i]=san[5][i]+x1;
        }else{
            san[3][i]=san[0][i];
            san[2][i]=san[1][i];
            san[6][i]=san[4][i];
            san[7][i]=san[5][i];
        }
    }
}
void constract(double x,double y,double z,double x1,double y1,double z1){
    fang[0][0] = x;
    fang[0][1] = y;
    fang[0][2] = z;        //  第0个点

    fang[1][0] = x;
    fang[1][1] = y;
    fang[1][2] = z+z1;     //  第一个点

    fang[2][0] = x+x1;
    fang[2][1] = y;
    fang[2][2] = z+z1;     //  第二个点

    fang[3][0] = x+x1;
    fang[3][1] = y;
    fang[3][2] = z;        //  第三个点
    for(int i=0;i<4;i++){  // for()循环来完成其余的四个点
        for(int j=0;j<3;j++){
            if(j==1)
                fang[i+4][j]=fang[i][j]+y1;
            else
                fang[i+4][j]=fang[i][j];
        }
    }
}
void build2(){
    glBegin(GL_POLYGON);
    //glColor3f(red);
    glNormal3f(0.0,-1.0,0.0);
    glVertex3f(san[0][0],san[0][1],san[0][2]);
    glVertex3f(san[1][0],san[1][1],san[1][2]);
    glVertex3f(san[2][0],san[2][1],san[2][2]);
    glVertex3f(san[3][0],san[3][1],san[3][2]);
    glEnd();   //     下底

    glBegin(GL_POLYGON);
    //glColor3f(green);
     glNormal3f(-1.0,0.0,0.0);
    glVertex3f(san[1][0],san[1][1],san[1][2]);
    glVertex3f(san[0][0],san[0][1],san[0][2]);
    glVertex3f(san[4][0],san[4][1],san[4][2]);
    glVertex3f(san[5][0],san[5][1],san[5][2]);
    glEnd();   //     左面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(1.0,0.0,0.0);
    glVertex3f(san[7][0],san[7][1],san[7][2]);
    glVertex3f(san[6][0],san[6][1],san[6][2]);
    glVertex3f(san[3][0],san[3][1],san[3][2]);
    glVertex3f(san[2][0],san[2][1],san[2][2]);
    glEnd();   //     右面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(0.0,0.0,1.0);
    glVertex3f(san[5][0],san[5][1],san[5][2]);
    glVertex3f(san[6][0],san[6][1],san[6][2]);
    glVertex3f(san[2][0],san[2][1],san[2][2]);
    glVertex3f(san[1][0],san[1][1],san[1][2]);
    glEnd();   //     前面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(0.0,0.0,-1.0);
    glVertex3f(san[0][0],san[0][1],san[0][2]);
    glVertex3f(san[3][0],san[3][1],san[3][2]);
    glVertex3f(san[7][0],san[7][1],san[7][2]);
    glVertex3f(san[4][0],san[4][1],san[4][2]);
    glEnd();   //     后面

    glBegin(GL_POLYGON);
    //glColor3f(red);
    glNormal3f(0.0,1.0,0.0);
    glVertex3f(san[4][0],san[4][1],san[4][2]);
    glVertex3f(san[7][0],san[7][1],san[7][2]);
    glVertex3f(san[6][0],san[6][1],san[6][2]);
    glVertex3f(san[5][0],san[5][1],san[5][2]);
    glEnd();   //     上面
}
void build(){
    glBegin(GL_POLYGON);
    //glColor3f(red);
    glNormal3f(0.0,-1.0,0.0);
    glVertex3f(fang[0][0],fang[0][1],fang[0][2]);
    glVertex3f(fang[1][0],fang[1][1],fang[1][2]);
    glVertex3f(fang[2][0],fang[2][1],fang[2][2]);
    glVertex3f(fang[3][0],fang[3][1],fang[3][2]);
    glEnd();   //     下底

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(-1.0,0.0,0.0);
    glVertex3f(fang[1][0],fang[1][1],fang[1][2]);
    glVertex3f(fang[0][0],fang[0][1],fang[0][2]);
    glVertex3f(fang[4][0],fang[4][1],fang[4][2]);
    glVertex3f(fang[5][0],fang[5][1],fang[5][2]);
    glEnd();   //     左面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(1.0,0.0,0.0);
    glVertex3f(fang[7][0],fang[7][1],fang[7][2]);
    glVertex3f(fang[6][0],fang[6][1],fang[6][2]);
    glVertex3f(fang[2][0],fang[2][1],fang[2][2]);
    glVertex3f(fang[3][0],fang[3][1],fang[3][2]);
    glEnd();   //     右面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(0.0,0.0,1.0);
    glVertex3f(fang[5][0],fang[5][1],fang[5][2]);
    glVertex3f(fang[6][0],fang[6][1],fang[6][2]);
    glVertex3f(fang[2][0],fang[2][1],fang[2][2]);
    glVertex3f(fang[1][0],fang[1][1],fang[1][2]);
    glEnd();   //     前面

    glBegin(GL_POLYGON);
    //glColor3f(green);
    glNormal3f(0.0,0.0,-1.0);
    glVertex3f(fang[0][0],fang[0][1],fang[0][2]);
    glVertex3f(fang[3][0],fang[3][1],fang[3][2]);
    glVertex3f(fang[7][0],fang[7][1],fang[7][2]);
    glVertex3f(fang[4][0],fang[4][1],fang[4][2]);
    glEnd();   //     后面

    glBegin(GL_POLYGON);
    //glColor3f(red);
    glNormal3f(0.0,1.0,0.0);
    glVertex3f(fang[4][0],fang[4][1],fang[4][2]);
    glVertex3f(fang[7][0],fang[7][1],fang[7][2]);
    glVertex3f(fang[6][0],fang[6][1],fang[6][2]);
    glVertex3f(fang[5][0],fang[5][1],fang[5][2]);
    glEnd();   //     上面
}
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();          //增加M矩阵
	glRotatef(rotate_x,1.0,0.0,0.0);
	glRotatef(rotate_y,0.0,1.0,0.0);

    glTranslatef(-270,0,-270);
    glScalef(1.5,1.5,1.5);

	//****************************增加地面底板(颜色为 绿色)********
	glBegin(GL_POLYGON);
    constract(0,0,0,500,10,500);
    glColor3f(green);
    build();
	//****************************增加小路(颜色  深灰色)***************************
    glBegin(GL_POLYGON);
    constract(0,0,500,500,10,100);
    glColor3f(gray);
    build();
    //****************************增加车库底板(颜色  深灰色)****************
    glBegin(GL_POLYGON);
    constract(330,20,250,140,1,250);
    glColor3f(gray);
    build();
    //****************************增加斑马线(颜色为 白色)********
    for(int i=0;i<5;i++){
        glBegin(GL_POLYGON);
        constract(i*100,10,500+45,40,1,10);
        glColor3f(white);
        build();
    }
    //****************************增加栅栏基座(颜色为 白色)********
    glBegin(GL_POLYGON);
    constract(10,10,10,20,20,480);
    glColor3f(white);
    build();       //    对应于A点
    constract(30,10,10,440,20,20);
    glColor3f(white);
    build();       //    对应于B点
    constract(470,10,10,20,20,480);
    glColor3f(white);
    build();       //    对应于C点
    constract(30,10,470,100,20,20);
    glColor3f(white);
    build();       //    对应于D点
    constract(230,10,470,100,20,20);
    glColor3f(white);
    build();       //    对应于F点
    //****************************增加栅栏柱子(颜色为 白色)********
    glBegin(GL_POLYGON);
    constract(10,10,10,20,50,20);
    glColor3f(white);
    build();       //    对应于A点
    glBegin(GL_POLYGON);
    constract(470,10,10,20,50,20);
    glColor3f(white);
    build();       //    对应于C点
    glBegin(GL_POLYGON);
    constract(230,10,470,20,50,20);
    glColor3f(white);
    build();       //    对应于F点
    glBegin(GL_POLYGON);
    constract(10,10,470,20,50,20);
    glColor3f(white);
    build();       //    对应于E点
    glBegin(GL_POLYGON);
    constract(470,10,470,20,50,20);
    glColor3f(white);
    build();       //    对应于G点
    glBegin(GL_POLYGON);
    constract(310,10,470,20,50,20);
    glColor3f(white);
    build();       //    对应于H点
    glBegin(GL_POLYGON);
    constract(110,10,470,20,50,20);
    glColor3f(white);
    build();       //    对应于I点
    //****************************增加栅栏(颜色为 深灰色)********
    glColor3f(hgray);
    for(int i=35;i<470;i+=25)
    {
        constract(15,20,i,6,30,6);
        build();         //左边竖条
    }
    for(int i=35;i<470;i+=25)
    {
        constract(475,20,i,6,30,6);
        build();          // 右边竖条
    }
    for(int i=35;i<470;i+=25)
    {
        constract(i,20,15,6,30,6);
        build();          // 上边横条
    }
    for(int i=35;i<110;i+=25)
    {
        constract(i,20,485,6,30,6);
        build();          // 下边横条1
    }
    for(int i=250;i<310;i+=25)
    {
        constract(i,20,485,6,30,6);
        build();          // 下边横条2
    }
    //****************************增加车库墙(颜色为 白色)********
    glColor3f(white);
    constract(320,10,250,10,100,220);
    build();
    constract(460,10,250,10,100,220);
    build();
    //****************************增加车库顶棚(颜色为 深灰色)********
    glColor3f(hgray);
    constract(320,110,250,150,10,220);
    build();
    //****************************增加卧室和客厅的墙壁(颜色为 白色)********
    glColor3f(white);
    constract(50,10,50,12,150,200);
    build();     //左墙壁
    glColor3f(white);
    constract(438,10,50,12,150,200);
    build();     //右墙壁
    glColor3f(white);
    constract(62,10,50,376,150,12);
    build();     //上墙壁
    glColor3f(white);
    constract(62,10,235,376,50,12);
    build();     //下墙壁1
    glColor3f(white);
    constract(62,60,235,50,50,12);
    build();     //下墙壁2
    glColor3f(white);
    constract(162,60,235,276,50,12);
    build();     //下墙壁3
    glColor3f(white);
    constract(62,110,235,376,50,12);
    build();     //下墙壁4
    //****************************增加卧室和客厅的玻璃(颜色为 白色)********
    glColor4f(blue,0.35);
    constract(62+50,60,235,50,50,12);
    build();
    //****************************增加车库玻璃(颜色为 深灰色)********
    glColor4f(blue,0.35);
    constract(330,22,450,130,90,10);
    build();
    //****************************增加房顶 (颜色 红色)************
    glColor3f(red);
    cons(50,160,140,400,27,110);
    build2();
    cons(50,187,140,400,27,90);
    build2();
    cons(50,214,140,400,27,70);
    build2();
    cons(50,241,140,400,15,50);
    build2();
    glColor3f(red);
    cons(50,160,140,400,27,-110);
    build2();
    cons(50,187,140,400,27,-90);
    build2();
    cons(50,214,140,400,27,-70);
    build2();
    cons(50,241,140,400,15,-50);
    build2();
     //************************************* 门*************
    glColor3f(men);
    constract(230,10,250,50,100,5);
    build();              //门面
    glColor3f(menba);
    constract(235,60,255,5,5,5);
    build();              //门把手
    //**************************************小路*************
    for(int i=0;i<6;i++)
    {
        glColor3f(brown);
        constract(235-i*15,10,250+i*40,40,2,20);
        build();
    }
    //**************************************太阳*************
    glColor3f(gold);
    glTranslatef(250,400,0);
    glutSolidSphere(35.0, 20, 20);
    glTranslatef(-250,-400,0);
    //**************************************树干*************
    glColor3f(brown);
    constract(60,10,390,15,70,15);
    build();
    //**************************************树叶*************
    glColor3f(hgreen);
    glTranslatef(60,70,400);
    glutSolidSphere(25.0, 20, 20);  //球1
    glTranslatef(20,0,0);
    glutSolidSphere(25.0, 20, 20);  //球2
    glTranslatef(-10,0,-10);
    glutSolidSphere(25.0, 20, 20);  //球3
    glTranslatef(0,0,20);
    glutSolidSphere(25.0, 20, 20);  //球4
    glTranslatef(0,10,-10);
    glutSolidSphere(25.0, 20, 20);  //球4

    glFlush();  // 刷新
    glutSwapBuffers();//还要加上swapbuffer函数
}
void init(void)
{
    GLfloat sun_direction[] = { 100.0, 100.0, 100.0, 0.0 };
	GLfloat sun_intensity[] = { 1.0, 1.0, 1.0, 1.0 };
	GLfloat ambient_intensity[] = { 0.5, 0.5, 0.5, 1.0 };

	glEnable(GL_LIGHTING);              // Set up ambient light.
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient_intensity);

	glEnable(GL_LIGHT0);                // Set up sunlight.
	glLightfv(GL_LIGHT0, GL_POSITION, sun_direction);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_intensity);

	glEnable(GL_COLOR_MATERIAL);        // Configure glColor().
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
	cout << "The OpenGL version is: " << glGetString(GL_VERSION) << "\n";
	cout << glGetString(GL_VENDOR) << "\n";
	glLineWidth(5);
	glClearColor( 0.0 ,0.0, 0.0, 0.0);      //定义背景颜色-->  black

	glEnable(GL_BLEND); // 打开混合
    glDisable(GL_DEPTH_TEST); // 关闭深度测试
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数

	glMatrixMode(GL_PROJECTION);     // 貌似和视角有关的定义 places the camera at (0,0,0) and faces it along(0,0,-1).
	glOrtho(-w , w , -h, h , -w, w); // specify clipping volume
}
void specialkeys(int key,int x,int y){
    if(key==GLUT_KEY_RIGHT)
        rotate_y +=5;
    else if(key==GLUT_KEY_LEFT)
        rotate_y -=5;
    else if(key==GLUT_KEY_UP)
        rotate_x +=5;
    else if(key==GLUT_KEY_DOWN)
        rotate_x -=5;
    glutPostRedisplay();
}
int main(int argc, char** argv)    //  main函数 增加鼠标和键盘事件
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(w, h);
	glutInitWindowPosition(100, 100);
	glutCreateWindow("A House");
	init();

	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	glEnable(GL_DEPTH_TEST);
	glutDisplayFunc(display);
	glutSpecialFunc(specialkeys);
	glutMainLoop();
	return 0;
}
时间: 2024-10-12 17:03:38

OpenGL 房子的相关文章

OpenGL编程 基础篇(五)世界窗口和视口

一.基本定义 世界窗口:在世界坐标系中定义一个对齐的矩形(aligned rectangle,即矩阵的边与坐标轴平行)的窗口,这个世界窗口外的部分被裁减并不被绘制.OpenGL会自动地做剪裁. 视口:在显示器的屏幕窗口上定义一个对齐的矩形的视口,OpenGL会自动建立世界窗口和视口的变换(包括缩放和平移).当世界窗口中所有对象都被绘制时,对象在世界窗 口中的部分会被自动地映射到视口中----换句话说,被映射到屏幕坐标中,即像素在显示器上的坐标. 二.相关函数介绍 1.对于二维绘图来说,世界窗口由

OpenGL边用边学------2 OpenGL状态、视口设置

OpenGL的状态管理机制 视口与视口坐标系概念 测试视口设置 1 移动视口 2 多视口 视口小结 1 OpenGL的状态管理机制 从前面的最简单例子可以看出,我们几乎没有进行任何关于颜色和坐标系的配置,OpenGL就已经能够实施渲染了.这是因为OpenGL本身管理了很多渲染时需要的状态数据,并且在初始化时自动设置了合理的默认值.例如,默认的清屏颜色就是黑色,这才是我们看到窗口客户区呈现黑色的原因. OpenGL的渲染需要很多的状态数据来供其使用,如果把所有的这些数据都作为参数传递给渲染函数的话

NeHe OpenGL教程 第九课:移动图像

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第九课:移动图像 3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL,每一课都是在

OPenGL学习

看一张图片: 图中绘制了两个大小相同的白色球体.其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉.左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体 眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛.人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏.因此对于人类而言,光线很大程度上表现了物体的立体感. 建立光照模型 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源.材质和

第09课 OpenGL 移动图像

3D空间中移动图像: 你想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画.这一课将教会你所有的一切.前面的课程涵盖了基础的OpenGL,每一课都是在前一课的基础上创建的.这一课是前面几课知识的综合,当你学习这课时,请确保你已经掌握了前面几课的知识. 欢迎进入第九课.到现在为止,您应该很好的理解OpenGL了.『CKER:如果没有的话,一定是我翻译的罪过......』.您已经学会了设置一个OpenGL窗口的每个细节.学会在旋转的物体

C#应用视频教程2.4 OPENGL虚拟仿真介绍

这一部分我们首先实现视图控制(包括了平移/旋转/缩放),前面我们已经讲过,通过lookat一个函数,或者通过translate+rotate两个函数,都能实现视图的控制(两个函数的方式比较简单,但是通用性不够,因为这个更像是画布就像去参观卖房子的模型,你可以把模型随便上下左右移动翻转看外面,但是如果要像第一人称视角到房子里面爬窗户,上房顶,钻地道,这种视角肯定是不够的.可以想象CS游戏中,整个地图场景必然是唯一的,每个游戏玩家都可以控制一组视角,视角的lookat九个参数不同导致了可以仰望,俯瞰

OpenGL边用边学------2 经典照相机模型

实际照相步骤 1 布置场景和调整照相机位置 3 选择镜头对焦Focus 4 按下快门 5 在电脑窗体中赞赏图片 OpenGL的相机模型 0 确定胶片位置 1 确立场景世界坐标系 2 在世界坐标系中确定相机位置与方向 3 在世界坐标系中建立物理世界模型 4 视图变换与模型变换的抉择 5 在照相机坐标系中确定可视范围对焦投影变换 6 调用glBegin glEnd拍照 OpenGL相机模型与实际相机的不同 1 物体和相机都能够随意移动 2 终于的照片能够是多次拍摄合成的 3 特殊的投影方式正投影 相

OpenGL教程翻译 第十六课 基本的纹理贴图

OpenGL教程翻译 第十六课 基本的纹理贴图 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 纹理贴图就是将任意一种类型的图片应用到3D模型的一个或多个面.图片(也可以称之为纹理)内容可以是任何东西,但是他们一般都是一些比如砖,叶子,地面等的图案,纹理贴图增加了场景的真实性.例如,对比下面的两幅图片. 为了进行纹理贴图,你需要进行三个步骤:将图片加载到OpenGl中,定义模型顶点的纹理坐标(以对其进行贴图),用纹理坐标对图片进行

OpenGL坐标系统

一.坐标系统概述 本文类容见LearnOpenGL CN.直接copy过来留个存档. OpenGL希望每次顶点着色后,我们的可见顶点都为标准化设备坐标(Normalized Device Coordinate,NDC).也就是说每个顶点的\(z,y,z\)都应该在\(-1\)到\(1\)之间,超出这个范围的顶点将是不可见的.通常情况下我们会自己设定一个坐标范围,之后再在顶点着色器中将这些坐标变换为表转化设备坐标.然后这些标化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标