精华内容
下载资源
问答
  • opengl三维场景

    2013-12-12 17:46:45
    opengl的一个CS三维场景,很逼真,适合opengl游戏开发和opengl初学者学习的一个很好地代码
  • OPENGL三维场景搭建、漫游、交互。包括凹凸地形,键盘交互、鼠标交互、树木,火焰等
  • Opengl三维源码,VC++飞行地图演示,模拟飞机飞行、三维场景编辑器源程序代码
  • VC++ OpenGL天空盒的实现,类似CS中的打枪场景三维的图像生成,跟随鼠标可变换场景,游戏初步数据。
  • OPENGL三维场景

    2013-03-08 22:36:00
    Opengl的案例代码,生成三维的山体,而且包含数据和库,不需要安装glut库都可以正常运行,
  • 华中科技大学 硕士学位论文 OpenGL三维场景模型的建立与实现 姓名张锐 申请学位级别硕士 专业软件工程 指导教师万琳 2010-01-16 华中 科 技 大 学硕士 学 位论文 摘 要 由于分布视算虚拟现实仿真技术和三维电子游戏...
  • Terrain3DTest_OpenGL飞行_OpenGl三维场景_OpenGL飞机飞行_openGL三维地图_palea2t.
  • OPENGL三维场景搭建、漫游、交互

    万次阅读 2017-06-04 19:36:47
    OPENGL三维场景搭建、漫游、交互标签(空格分隔): OPENGL这是博主的一次实验,实验截止日期还没有到。等deadline过后,博主附上源码。 源码地址:更新:OPENGL三维场景搭建、漫游、交互程序在读取OBJ模型基础上...

    OPENGL三维场景搭建、漫游、交互

    标签(空格分隔): OPENGL


    这是博主的一次实验,实验截止日期还没有到。等deadline过后,博主附上源码。
    源码地址:更新:OPENGL三维场景搭建、漫游、交互


    程序在读取OBJ模型基础上完成,传送门:OPENGL读取OBJ模型

    天空盒

    读取bmp图像像素信息(这里以24位BMP图像为例)

      这里大家需要自行复习一下BMP图像的组成。在这里我就不详述了。给大家一个传送门:
    BMP图像组成
      BMP图像的组成:BITMAPFILEHEADER、BITMAPINFOHEADER、RGBTRIPLE(16位和256色特有)、位图数据(即像素信息)。
      读取BMP跳过BITMAPFILEHEADER与BITMAPINFOHEADER结构,得到图像大小数据,然后分配数据空间读取像素信息,将该空间的数据作为纹理数据。
      注意:读24位BMP时需要注意,24位BMP像素信息储存顺序位BGR,而不是RGB,读完数据后,需要把数据信息“处理”一下,否则最终贴图颜色不正确。
      下图中,图一为错误颜色,图二为正确颜色。
    1.png-3181.2kB
    2.png-3211.4kB
    天空盒结果:
    3.png-6777.5kB

    天空盒随着视点移动

    视点移动

      借助glLookAt函数和一些数学知识实现。
      我们都知道glLookAt()函数前三个参数是视点的坐标x,y,z,中间三个参数是视点看向的坐标xd、yd、zd。可以根据圆的极坐标方程来求得视点看向的方向(坐标),从而知道视点移动的方向。
      image_1bhpb63sfbo8sdj8281bhod7h9.png-175.1kB
      如上图,只要设定一个旋转角,通过改变旋转角,可以改变视点看向的坐标,确定视点移动方向。从而视点可以向360度全方向移动。

    天空盒移动

      根据视点移动求出的增量,直接赋给天空盒,通过glTransf()可以让天空盒随视点移动。

    凹凸地形纹理

    普通地形

    即一张贴图:
    4.png-4923.9kB

    凹凸地形

    需要额外的记录地形高度的BMP图片。同时借助顶点数组来实现。
    程序中记录地形高度的BMP图片大小是32*32,在XOZ平面上放大, 顶点数组中记录(放大后的X、根据高度BMP获取的高度Y、放大后的Z)。纹理数组中记录(放大前X,放大前Z)。这样在三维空间中,点(X放大,Y, Z放大)点的纹理坐标为普通地形纹理的(X,Z)点。
    根据顶点数组和纹理数组绘制地形。运用了glDrawElements()。
    5.png-7755.8kB
    6.png-759.9kB
    在视点移动时,需要实时获取当前视点所在点(X,Z)所对应的地形高度Y,然后把Y加到glLookAt()函数上。

    树木与火焰

    读取tag

    BMP图片没有ALPHA通道,关于树木和火焰的贴图,都是读取的tga格式图片。

    树木绕着总是垂直于视点向量

    这里我有两个想法,一个是旋转,另一个是把承载树木纹理的长方形就绘制在垂直于视点看向方向向量上。
    i. 旋转
    7.png-105.7kB
    ii. 本身垂直
    8.png-61.3kB
    这里我采用的第二种方法,两种方法应该是一样的,虽然两种方法中的变量在视点变换中已经求出来了,不用二次计算。第一种方法只需要传一个参数,但是要调用一次旋转函数。第二中方法传两个参数,但是参数只要进行少数次乘法就可以得到想要的效果。
    同理,树木也要根据凹凸地形来确定自身在Y轴的高度。
    3.gif-11302.6kB

    透明纹理的遮挡顺序

    透明纹理之间会相互遮挡,这里精力有限,没有解决,只是把树木放到display最后绘制。


    更新:想起来老师介绍过一种比较简单的方法,来正确绘制透明物体。主要是根据绘制顺序来实现。
    绘制顺序就是:首先绘制所有不透明的物体。如果两个物体都是不透明的,则谁先谁后都没有关系。然后,将深度缓冲区设置为只读。接下来,绘制所有半透明的物体。如果两个物体都是半透明的,则谁先谁后只需要根据自己的意愿(注意了,先绘制的将成为“目标颜色”,后绘制的将成为“源颜色”,所以绘制的顺序将会对结果造成一些影响)。最后,将深度缓冲区设置为可读可写形式。
    如下图是十字树木面片的效果:
    这里写图片描述

    这里写图片描述

    火焰序列(opengl闲时调用)

    i.现成的火焰tga纹理真的难找,我是通过一段火焰视频,通过AE导出成tga序列,然后选取部分序列,对每个火焰添加alpha通道。

    ii. 火焰纹理实现
    读取火焰纹理序列,设定时间阈值,每隔这一段时间阈值,更换火焰纹理。从而实现火焰效果。
    注意:
    火焰纹理更换,不能放在display()函数中,因为display(),只有在窗口需要重绘时才会调用。举个例子,当视点站在火焰前不动时,火焰纹理不会更换。
    需要使用glutIdleFunc()函数,但是又不能往里传display,因为display中有很多其他的物体绘制,闲时不停调用display()会让程序运行时不流畅。
    我在glutIdleFunc()函数中传入一个f()函数,里面每隔特定时间更改火焰纹理序列索引,并通过glutPostRedisplay(),让display重绘。这样一来,既可以让火焰纹理不停更换,又能让程序运行流畅。
    3.gif-3688.6kB

    鼠标操控

    根据鼠标位置旋转视角

    视点可以根据鼠标的位置进行旋转。主要根据glutPassiveMotionFunc()实现。这里没有什么技术含量。

    鼠标拾取与选择

    这里查了很多资料,OPENGL中选择机制不是发出一条射线,而是通过裁剪框来实现的,设定一个裁剪框,在该区域内的物体全部被选中。这里给出我找到比较好的博文分享给大家:
    OpenGL学习笔记:拾取与选择
    OpenGL-选择与拾取
    同时为了便于大家理解,我编写了一个小小的拾取与选择程序,供大家参考。传送门:鼠标拾取与选择
    为了避免这种多重选中,我在程序中只读入三个OBJ模型,想按住鼠标左键移动可以移动选定的OBJ模型。
    i. 步骤:
    1. 按住鼠标左键选定OBJ模型:
    主要需要以下几步进入选择模式、分配名字栈、得到命中记录。
    2. 分析名字栈中数据信息,得到命中物体的名字。
    由于物体可以有多个名字,甚至可以木有名字,因此元素的结构不是固定大小的,以下为例:
    10.png-55.6kB
    11.png-36.9kB
    3. 得到名字,知道鼠标选择的具体OBJ模型,也就知道要操作的对象。
    第三步只要在glutMotionFunc(motion); motion方法中实现对OBJ模型的操作即可。我在程序中实现的是obj模型随着鼠标移动可绕着视点旋转。
    12.gif-19107.7kB

    展开全文
  • Terrain3DTest_OpenGL飞行_OpenGl三维场景_OpenGL飞机飞行_openGL三维地图_palea2t_源码.rar.rar
  • OpenGL 天空盒的实现_openGL游戏_三维游戏_OpenGl三维场景_Vc.zip
  • OpenGL 天空盒的实现_openGL游戏_三维游戏_OpenGl三维场景_Vc_源码.rar.rar
  • 纯手工自己做的,别的地方绝对找不到,会都你有很大的帮助哦!!
  • 1、构建一个三维场景 可利用glut提供的各种简单形体来搭建,或者读入别的模型,并加入光照效果 2、用键盘操作一个物体(如一艘飞船,或一个机器人),在三维场景中漫游 视点可以放在物体上,或跟随物体,利用...
  • opengl实现的简单三维场景漫游

    热门讨论 2011-05-30 16:43:23
    在vc环境下用opengl实现的一个三维漫游,场景中包括地面,一个立方体,一个四面体,键盘控制漫游,以及立方体和四面体各自在每个方向上的旋转。
  • 计算机图形学关于opengl方面的课程设计
  • OpenGL三维场景漫游的实现

    千次阅读 2020-05-12 20:13:07
    构建一个三维场景 可利用glut提供的各种简单形体来搭建,或者读入别的模型,并加入光照效果 用键盘操作一个物体(如一艘飞船,或一个机器人),在三维场景中漫游 视点可以放在物体上,或跟随物体,利用gluLookAt()...

    功能

    • 构建一个三维场景
      可利用glut提供的各种简单形体来搭建,或者读入别的模型,并加入光照效果
    • 用键盘操作一个物体(如一艘飞船,或一个机器人),在三维场景中漫游
      视点可以放在物体上,或跟随物体,利用gluLookAt()函数来实现对视点的控制

    思路

    1、开始想直接利用OpenGL的glulookAt函数,但发现并不好用
    2、之后参考他人资料寻思构造一个摄像机类,通过摄像机类达到控制视点,这部分通过参考LearnOpenGL上的摄像机类进行实现

    实验结果

    实验效果图

    在这里插入图片描述

    程序控制键说明

    • w,s,a,d分别控制视点的前进,后推,左移,右移
    • q,e控制视点进行左旋转,右旋转
    • 方向键LEFT、RIGHT、UP、DOWN,视线方向转向左,视线方向转向右,视线方向转向上,视线方向转向下
    • Page_UP、Page_Down,视点位置升高,降低

    实验思考

    glulookAt()

    一般gluLookAt()用于从世界坐标系到眼坐标系的转换,但是由于OpenGL里面模型视图矩阵直接将本地坐标系转换为眼坐标系,所以gluLookAt()应该被用来设置模型视图矩阵,但是有一点得注意了:
    gluLookAt()的调用应该在场景绘制初glLoadIdentity()函数调用之后,在所有的glTranslate*()、glRotate*()、glScale*()函数调用之前调用,且只调用一次
    参考自以下资料
    https://bbs.csdn.net/topics/390124968
    https://blog.csdn.net/fyyyr/article/details/79298636

    参考资料

    首先是是场景漫游:实现场景漫游有两种方式,一种是固定照相机的位置,对整个场景进行变换,例如当人物前进时,其实是通过将整个场景向后平移实现的,转向时,是通过反向旋转整个场景实现的;另一种方式是使照相机在场景中移动,通过gluLookAt()函数设定照相机的位置,可以任意指定照相机的位置和朝向。

    源代码

    展开全文
  • OpenGl三维建模源代码

    热门讨论 2012-03-05 19:41:32
    opengl中实现三维建模纹理光照和旋转还有选择,
  • 自己编写的基于OpenGL进行三维场景的开发程序,适用于OpenGL初学者
  • 第一章 OpenGL三维图形世界 第二章 OpenGL概念建立 第三章 Windows NT环境下的OpenGL 第二部分 基础篇 第一章 OpenGL基本程序结构 第二章 OpenGL数据类型和函数名 第三章 OpenGL辅助库的基本使用 第四章 ...
  • (1)构建一个三维场景: 可利用glut提供的各种简单形体来搭建;或者读入别的模型来构成场景。 加入光照效果。 (2)用键盘操纵一个物体(如一艘飞船,或一个机器人)在三维场景中漫游。 视点可以放在物体上,或跟随...

    这是慕课上的计算机图形学的作业,作业要求是:

    具体要求:
    (1)构建一个三维场景:
    可利用glut提供的各种简单形体来搭建;或者读入别的模型来构成场景。
    加入光照效果。
    (2)用键盘操纵一个物体(如一艘飞船,或一个机器人)在三维场景中漫游。
    视点可以放在物体上,或跟随物体;可利用gluLookAt( )函数来实现对视点的控制。
    撰写的作业文档中包括:
    (1)程序功能的描述,效果请附图;
    (2)论述实现漫游的程序思路;
    (3)漫游操作顺畅,效果良好。

    因为刚开始学,真的体会到了绘图的奥妙,光照纹理这些神奇的计算,也体会到了数学对于计算机的重要性,这里画的机器人其实在做许多重复的事情,其中的重点就是坐标的计算和glPushMatrix、glPopMatrix的使用。下面是效果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下面是实现的代码:
    注释都在代码中

    #include <GL\freeglut.h>
    #include <iostream>
    #include <math.h>
    using namespace std;
    const GLfloat Pi = 3.1415926536f;
    //摄像机离物体的距离
    float G_fDistance = 3.6f;
    //机器人的旋转角度 
    float G_fAngle_horizon = 0.0;
    float G_fAngle_vertical = 0.0f;
    
    float G_left_upper_arm1 = 0.0;//左上臂运动角度(左右运动)
    float G_left_upper_arm2 = 0.0;//左上臂运动角度(前后运动)
    float G_left_lower_arm1 = 0.0f;//左下臂运动角度(左右运动)
    float G_left_lower_arm2 = 0.0f;//左下臂运动角度(前后运动)
    float G_right_upper_arm1 = 0.0;//右上臂运动角度(左右运动)
    float G_right_upper_arm2 = 0.0;//右上臂运动角度(前后运动)
    float G_right_lower_arm1 = 0.0f;//右下臂运动角度(左右运动)
    float G_right_lower_arm2 = 0.0f;//右下臂运动角度(前后运动)
    
    float G_left_upper_leg = 0.0;//左大腿运动角度(前后运动)
    float G_left_lower_leg = 0.0f;//左小腿运动角度(前后运动)
    float G_right_upper_leg = 0.0;//右大腿运动角度(前后运动)
    float G_right_lower_leg = 0.0f;//右小腿运动角度(前后运动)
    
    void myinit(void);
    void myReshape(GLsizei w, GLsizei h);
    void display(void);
    void processSpecialKeys(int key, int x, int y);
    void processNormalKeys(unsigned char key,int x,int y);
    void timer(int value);
    
    //主函数
    int main(int argc, char* argv[])
    {
    	glutInit(&argc, argv);
    
    	//初始化OPENGL显示方式
    	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
    
    	//设定OPENGL窗口位置和大小
    	glutInitWindowSize (500, 800); 
    	glutInitWindowPosition (100, 100);
    
    	//打开窗口
    	glutCreateWindow ("简单机器人");
    	cout<<"w,s,a,d控制机器人右上臂前后左右"<<"\n";
    	cout<<"5、2、1、3控制机器人左臂上臂前后左右"<<"\n";
    	cout<<"t、g、f、h控制机器人右下臂前后左右"<<"\n";
    	cout<<"i、k、j、l控制机器人左臂下臂前后左右"<<"\n";
    	cout<<"6、7控制机器人右大腿前后"<<"\n";
    	cout<<"8、9控制机器人左大腿前后"<<"\n";
    	cout<<"z、x控制机器人右小腿前后"<<"\n";
    	cout<<"c、v控制机器人左小腿前后"<<"\n";
    	cout<<"‘[’、‘]’用来控制机器人离屏幕远近"<<"\n";
    	cout<<"键盘上的上下左右键可以旋转机器人"<<"\n";
    	//调用初始化函数
        myinit();
    
    	//设定窗口大小变化的回调函数
    	glutReshapeFunc(myReshape);
    
    	//设定键盘控制的回调函数
    	glutSpecialFunc(processSpecialKeys);
    	glutKeyboardFunc(processNormalKeys);
    
    	//开始OPENGL的循环
    	glutDisplayFunc(display); 
    	glutMainLoop();
    
    	return 0;
    }
    
    void myinit(void)//初始化
    {
    	glEnable(GL_DEPTH);
    }  
    void myReshape(GLsizei w, GLsizei h)//设定窗口大小变化的回调函数
    {
    	glViewport(0,0,w,h);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(60,(GLfloat)w/(GLfloat)h,1,30);
    }
    void drawstar(GLfloat a,GLfloat x,GLfloat y)//画星星的函数
    {//a为星星的半径,x,y为平移的量
    	GLfloat bx = a * cos(18 * Pi/180);
    	GLfloat by = a * sin(18 * Pi/180);
    	GLfloat cy = -a * cos(36 * Pi/180);
    	GLfloat cx = a * sin(36 * Pi/180);
    	GLfloat
    		PointA[2] = { 0, a },
    		PointB[2] = { bx, by },
    		PointC[2] = { cx, cy },
    		PointD[2] = { -cx, cy },
    		PointE[2] = { -bx, by };
    	// 按照A->C->E->B->D->A的顺序,可以一笔将五角星画出
    	glTranslatef(x,y,0.0);
    	glColor3f(1.0,1.0,0.0);
    	glBegin(GL_LINE_LOOP);
    		glVertex2fv(PointA);
    		glVertex2fv(PointC);
    		glVertex2fv(PointE);
    		glVertex2fv(PointB);
    		glVertex2fv(PointD);
    	glEnd();
    }
    void drawfinger(GLfloat x,GLfloat y,GLfloat z)//画手指
    {
    	glPushMatrix();
    		glColor3f(0.0,0.0,1.0);
    		glTranslatef(x,y,z);
    		glPushMatrix();
    			glScalef(0.025,0.05,0.025);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    	glPopMatrix();
    }
    void drawfoot(GLfloat x,GLfloat y,GLfloat z)//画脚
    {
    	glPushMatrix();
    		glColor3f(0.0,0.0,1.0);
    		glTranslatef(x,y,z);
    		glPushMatrix();
    			glScalef(0.25,0.05,0.25);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    	glPopMatrix();
    }
    void display(void)
    {
    	//清除颜色和深度缓存
    	glClearColor(0.0,0.0,0.0,0.0);
    	glClearDepth(1.0f);
    	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
    	//视角的变化
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    	glTranslatef(0.0,0.0,-G_fDistance);
    	glRotatef(G_fAngle_horizon, 0.0f, 1.0f, 0.0f);
    	glRotatef(G_fAngle_vertical, 1.0f, 0.0f, 0.0f);
    	//身体
    	glColor3f(1.0,0.0,0.0);
    	glPushMatrix();
    		glScalef(1.0,0.75,0.5);
    		glutSolidCube(1.0);
    	glPopMatrix();
    	//画五星红旗
    	glPushMatrix();
    		GLfloat distance=0.15;//大的五角星到小的五角星的距离
    		GLfloat x1=distance*cos(54*Pi/180);
    		GLfloat y1=distance*sin(54*Pi/180);
    		GLfloat x2=distance*cos(18*Pi/180);
    		GLfloat y2=distance*sin(18*Pi/180);
    		drawstar(0.1,-0.4,0.225);
    		glPushMatrix();
    		drawstar(0.05,x1,y1);
    		glPopMatrix();
    		glPushMatrix();
    		drawstar(0.05,x2,y2);
    		glPopMatrix();
    		glPushMatrix();
    		drawstar(0.05,x1,-y1);
    		glPopMatrix();
    		glPushMatrix();
    		drawstar(0.05,x2,-y2);
    		glPopMatrix();
    	glPopMatrix();
    	//头和眼
    	glPushMatrix();
    		//头
    		glTranslatef(0.0,0.625,0.0);
    		glColor3f(0.8,0.5,0.2);
    		glutSolidSphere(0.25,20,20);
    		//绿帽子
    		glPushMatrix();
    			glColor3f(0.0,1.0,0.0);
    			glTranslatef(0.0,0.25,0.0);
    			glRotatef(90,1.0,0.0,0.0);
    			glutSolidTorus(0.1,0.15,20,20);
    		glPopMatrix();
    		//左眼
    		glPushMatrix();
    			glColor3f(1.0,0.0,0.0);
    			glTranslatef(-0.12,0.0,0.0);
    			glScalef(1.0,0.75,0.5);
    			glutSolidSphere(0.1,20,20);
    		glPopMatrix();
    		//右眼
    		glPushMatrix();
    			glColor3f(1.0,0.0,0.0);
    			glTranslatef(0.12,0.0,0.0);
    			glScalef(1.0,0.75,0.5);
    			glutSolidSphere(0.1,20,20);
    		glPopMatrix();
    	glPopMatrix();
    	//左臂
    	glPushMatrix();
    		//左上臂
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(-0.575,0.375,0.0);
    		glRotatef(G_left_upper_arm1,0.0,0.0,1.0);
    		glRotatef(G_left_upper_arm2,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//左肘
    		glColor3f(0.0,1.0,1.0);
    		glTranslatef(0.0,-0.25625,0.0);
    		glutSolidSphere(0.0625,20,20);	
    		//左下臂
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.0,-0.03125,0.0);
    		glRotatef(G_left_lower_arm1,0.0,0.0,1.0);
    		glRotatef(G_left_lower_arm2,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.15);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//画手指
    		drawfinger(-0.0675,-0.25,0.075);
    		drawfinger(0.0675,-0.25,0.075);
    		drawfinger(0,-0.25,-0.075);
    	glPopMatrix();
    	//右臂
    	glPushMatrix();
    		//右上臂
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.575,0.375,0.0);
    		glRotatef(G_right_upper_arm1,0.0,0.0,1.0);
    		glRotatef(G_right_upper_arm2,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//右肘
    		glColor3f(0.0,1.0,1.0);
    		glTranslatef(0.0,-0.25625,0.0);
    		glutSolidSphere(0.0625,20,20);	
    		//右下臂
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.0,-0.03125,0.0);
    		glRotatef(G_right_lower_arm1,0.0,0.0,1.0);
    		glRotatef(G_right_lower_arm2,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.15);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//画手指
    		drawfinger(-0.0675,-0.25,0.075);
    		drawfinger(0.0675,-0.25,0.075);
    		drawfinger(0,-0.25,-0.075);
    	glPopMatrix();
    	//左腿
    	glPushMatrix();
    		//左大腿
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.15,-0.375,0.0);
    		glRotatef(G_left_upper_leg,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.25,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//左膝盖
    		glColor3f(0.0,1.0,1.0);
    		glTranslatef(0.0,-0.25625,0.0);
    		glutSolidSphere(0.0625,20,20);	
    		//左小腿
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.0,-0.0625,0.0);
    		glRotatef(G_left_lower_leg,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		drawfoot(0.0,-0.25,0.0);
    	glPopMatrix();
    	//右腿
    	glPushMatrix();
    		//右大腿
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(-0.15,-0.375,0.0);
    		glRotatef(G_right_upper_leg,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.25,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		//右膝盖
    		glColor3f(0.0,1.0,1.0);
    		glTranslatef(0.0,-0.25625,0.0);
    		glutSolidSphere(0.0625,20,20);	
    		//右小腿
    		glColor3f(1.0,0.0,1.0);
    		glTranslatef(0.0,-0.0625,0.0);
    		glRotatef(G_right_lower_leg,1.0,0.0,0.0);
    		glTranslatef(0.0,-0.225,0.0);
    		glPushMatrix();
    			glScalef(0.125,0.45,0.3);
    			glutSolidCube(1.0);	
    		glPopMatrix();
    		drawfoot(0.0,-0.25,0.0);
    	glPopMatrix();
    	//交换前后缓冲区
    	glutSwapBuffers();
    }
    
    //响应键盘输入, 从而设定物体移近移远以及旋转的回调函数
    void processSpecialKeys(int key, int x, int y)
    {
    	switch(key) {
    		case GLUT_KEY_LEFT:
    			G_fAngle_horizon -= 5.0f;
    			break;
    		case GLUT_KEY_RIGHT:
    			G_fAngle_horizon += 5.0f;
    			break;
    		case GLUT_KEY_UP:
    			G_fAngle_vertical -= 5.0f;
    			break;
    		case GLUT_KEY_DOWN:
    			G_fAngle_vertical += 5.0f;
    			break;
    	}
    	glutPostRedisplay();
    }
    void processNormalKeys(unsigned char key,int x,int y)
    {
    	switch(key) {
    		case 91:	//"["
    			G_fDistance -= 0.3f;
    			break;
    		case 93:		//"]"
    			G_fDistance += 0.3f;
    			break;
    		case 49:	//1
    			G_left_upper_arm1-=15.0;
    			break;
    		case 51:	//3
    			G_left_upper_arm1+=15.0;
    			break;
    		case 50:	//2
    			G_left_upper_arm2-=15.0;
    			break;
    		case 53:	//5
    			G_left_upper_arm2+=15.0;
    			break;
    		//i、k、j、l控制机器人左臂下臂前后左右
    		case 106:	//j
    			G_left_lower_arm1-=15.0;
    			break;
    		case 108:	//l
    			G_left_lower_arm1+=15.0;
    			break;
    		case 105:	//i
    			G_left_lower_arm2-=15.0;
    			break;
    		case 107:	//k
    			G_left_lower_arm2+=15.0;
    			break;
    		case  97:	//a
    			G_right_upper_arm1-=15.0;
    			break;
    		case  100:	//d
    			G_right_upper_arm1+=15.0;
    			break;
    		case  119:	//w
    			G_right_upper_arm2-=15.0;
    			break;
    		case  115:	//s
    			G_right_upper_arm2+=15.0;
    			break;
    		case  102:	//f
    			G_right_lower_arm1-=15.0;
    			break;
    		case  104:	//h
    			G_right_lower_arm1+=15.0;
    			break;
    		case  116:	//t
    			G_right_lower_arm2-=15.0;
    			break;
    		case  103:	//g
    			G_right_lower_arm2+=15.0;
    			break;
    		case 56://8
    			G_left_upper_leg-=15.0;
    			break;
    		case 57://9
    			G_left_upper_leg+=15.0;
    			break;
    		case 99://c
    			G_left_lower_leg-=15.0;
    			break;
    		case 118://v
    			G_left_lower_leg+=15.0;
    			break;
    		case 54://6
    			G_right_upper_leg-=15.0;
    			break;
    		case 55://7
    			G_right_upper_leg+=15.0;
    			break;
    		case 122://z
    			G_right_lower_leg-=15.0;
    			break;
    		case 120://x
    			G_right_lower_leg+=15.0;
    			break;
    		case 27:	//"esc"
    			exit(0);
    	}
    	glutPostRedisplay();
    }
    
    
    
    展开全文
  • OpenGL场景中实现三维点的拾取,压缩文件包含头文件和源文件,添加到工程中即可。
  • Opengl 三维模型 源代码 三维素材,Mesh的概念,Obj模型数据格式,Obj模型简单,的加载类和加载实验。 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解。...
  • 杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告
  • 基于OpenGL三维室内场景漫游模拟,效果良好,且漫游速度能达到100帧以上。 基于OpenGL三维室内场景漫游模拟,效果良好,且漫游速度能达到100帧以上。
  • OpenGL三维地形模拟

    2020-11-14 18:05:30
    基于Win32+OpenGL的一个三维地形模拟小demo,一个课程作业,可以用三维坐标点生成三角网,设置光照并纹理贴图,包内有exe版本可直接运行,在VS2017下可编译通过,利于学习的好资源。
  • 使用OpenGL绘制三维场景

    万次阅读 2013-11-11 10:47:40
    三维变换:在三维场景中如何把物体变换到所需的位置和朝向。(OpenGL 提供所需矩阵) 对一个物体设置变换,然后再恢复到之前的变换,以便为下一次变换做准备。 摄像机视景体: 一个平行六面体,上下左右四...

    计算机图形学(OpenGL版) (第3版)

    COMPUTER GRAPHICS USING OpenGL

    清华大学出版社


    三维变换:在三维场景中如何把物体变换到所需的位置和朝向。(OpenGL 提供所需矩阵)


    对一个物体设置变换,然后再恢复到之前的变换,以便为下一次变换做准备。


    摄像机视景体: 一个平行六面体,上下左右四个侧面由窗口边界决定,前后两个面是近平面和远平面,沿着z轴投影到窗口,外面的则被裁剪。

    操作模型视点矩阵:glMatrixMode(GL-MODELVIEW);

    投影矩阵:glMatrixMode(GL_PROJECTION);



    摄像机的定位和瞄准:

    gluLookAt(eye.x , eye.y, eye.z,   look.x, look.y,look.z,   up.x, up.y,up.z);

    //创建视点矩阵,然后后乘当前矩阵。

    u、v、n三个归一向量(单位向量)。 ==》 左,上,垂直向内。


    glMatrixMode(GL_PROJECTION);    //设置观察体

    glLoadIdentity();

    glOrtho(-3.2,3.2,-2.4,2.4,1,50);     //观察体 6.4 × 4.8 near=1,far=50


    glMatrixMode(GL_MODELVIEW);    //设置安防摄像机

    glLoadIdentity();

    gluLookAt(4,4,4, 0,1,0, 0,1,0);    //摄像机视点(4,4,4), 朝向远点方向盯着(0,1,0)点,UPguess方向初设为(0,1,0)向量;




    //初试三维


    #include <windows.h>
    #include <gl/glut.h>
    #include <math.h>
    #include<iostream>

    using namespace std;

    const GLint xPosition = 100;
    const GLint yPosition = 100;

    const GLint screenWidth = 640;
    const GLint screenHeight = 480;

    const GLdouble aspect = screenWidth/(screenHeight*1.0);

    void myDisplay();
    void myInit();
    void setWindow(GLdouble left, GLdouble right , GLdouble botton, GLdouble top);
    void setViewport(GLdouble left, GLdouble right , GLdouble botton, GLdouble top);

    int main(int argc, char **argv){
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowPosition(xPosition,yPosition);
        glutInitWindowSize(screenWidth,screenHeight);

        glutCreateWindow("Basic Shapes");

        glutDisplayFunc(myDisplay);
        myInit();
        glutMainLoop();

        return 0;
    }


    void myDisplay(){
        glClear(GL_COLOR_BUFFER_BIT);
        GLUquadricObj *qobj = gluNewQuadric();
        gluQuadricDrawStyle(qobj,GLU_LINE);        //结果显示的是线条
        gluCylinder(qobj,0.2,0.2,0.4,8,8);//圆柱,上下圆半径0.2,高度0.4,绕着z轴切8块(切蛋糕),每块有8个线。
        //glPopMatrix();
        glFlush();

    }

    void myInit(){
        glClearColor(1.0,1.0,1.0,1.0);
        glColor3f(0.0f,0.0f,0.0f);
        glPointSize(2.0);
        glLineWidth(2.0);

        glMatrixMode(GL_PROJECTION);
        //glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glOrtho(-2.0*aspect,2.0*aspect,-2.0,2.0,0.1,100);
        gluLookAt(2.0,2.0,2.0,0.0,0.0,0.0,0.0,1.0,0.0);
    }



    展开全文
  • OpenGL三维室内场景漫游

    热门讨论 2009-07-23 17:27:51
    基于OpenGL三维室内场景漫游模拟,效果良好,且漫游速度能达到100帧以上。
  • 废话闲叙述,直接上代码: ... //设置为2D投影场景 glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); ////裁剪范围(左, 右, 下, 上)如果不希望变形,裁剪范围要和窗口成比例 ...
  • 系统包括大规模三维地形可视化系统、三维线路设计系统、三维场景漫游系统、第三方模型(3DS、DXF)管理和应用系统、纹理管理和应用系统、多媒体输出系统(三维动画录制、图像序列录制、打印输出、导出到AutoCAD等...
  • VC实现OpenGL三维绘图

    2012-06-28 08:46:42
    VC实现OpenGL三维绘图

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,526
精华内容 4,210
关键字:

opengl三维场景