计算机图形学 学习笔记 OpenGL图形用户界面和交互输入

目录 

OpenGL支持交互式输入设备的函数

GLU鼠标函数

GLUT键盘函数

OpenGL的菜单功能

创建GLUT菜单

创建和管理多个GLUT菜单

创建GLUT子菜单

修改GLUT菜单


OpenGL支持交互式输入设备的函数

在OpenGL程序中,交互设备输入由OpenGL Utility Toolkit(GLUT)中的子程序处理,ui那位这些子程序需要与一个窗口系统连接。对每一种设备指定一个程序(回调函数)来处理从该设备发生的输入。这些GLUT命令与其他的GLUT语句一起放置在main程序中。此外,来自基本库和GLU库的函数的组合也可以与GLUT的鼠标函数一起处理拾取输入。

GLU鼠标函数

用以下函数来指定一个鼠标指针在窗口之内并且一个鼠标按钮被按下或松开时调用的函数:

glutMouseFunc(mouseFcn);

这个名为mouseFcn的鼠标回调函数有四个参数:

void mouseFcn(GLint button,GLint action,GLint xMouse,GLint yMouse)

参数button的允许值为GLUT_LEFT_BUTTON、GLUT_MIDDLE_BUTTON和GLUT_RIGHR_BUTTON。

参数action指出哪种按钮行为来触发鼠标激活事件。允许值为GLUT_DOWN、GLUT_UP。取决于需要通过按下还是松开鼠标键来启动一个行为。

调用mouseFcn将返回鼠标在窗口中的位置坐标(xMouse,yMouse)。这是相对于窗口左上角的位置。xMouse是光标到窗口左边界的像素距离,yMouse是光标到窗口上边界的像素距离。

下面给出glutMouseFunc子程序的一个简单例子。在窗口中每次按下鼠标左键时,就在鼠标光标所在位置画一个尺寸为3的红点。

#include <GL/glut.h>
GLsizei winWidth = 400, winHeight = 300;

void Init()
{
	glClearColor(0, 0, 1, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 200, 0, 150);
}

void DisplayFcn()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3f(1, 0, 0);
	glPointSize(3);
}

void WinReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	winWidth = newWidth;
	winHeight = newHeight;
}

void PlotPoint(GLint x, GLint y)
{
	glBegin(GL_POINTS);

	glVertex2f(x, y);

	glEnd();
}

void MousePtPlot(GLint button, GLint action,
	GLint xMouse, GLint yMouse)
{
	if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
	{
		PlotPoint(xMouse, winHeight - yMouse);
	}

	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("MousePlotPoints");

	Init();
	glutDisplayFunc(DisplayFcn);
	glutReshapeFunc(WinReshapFcn);
	glutMouseFunc(MousePtPlot);

	glutMainLoop();
	return 0;
}

下一个例子用鼠标输入来选择直线段的端点位置。选中的直线段首尾相连,展示了交互构造一条折线的过程。

#include <GL/glut.h>
#include <stdlib.h>

GLsizei winWidth = 400, winHeight = 300;
GLint endPtCtr = 0;

class scrPt
{
  public:
	  GLint x, y;
};

void Init()
{
	glClearColor(0, 0, 1, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 200, 0, 150);
}

void DisplayFcn()
{
	glClear(GL_COLOR_BUFFER_BIT);
}

void WinReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	winWidth = newWidth;
	winHeight = newHeight;
}

void DrawLineSegement(scrPt endPt1, scrPt endPt2)
{
	glBegin(GL_LINES);

	glVertex2f(endPt1.x, endPt1.y);
	glVertex2f(endPt2.x, endPt2.y);

	glEnd();
}

void PolyLine(GLint button, GLint action,
	GLint xMouse, GLint yMouse)
{
	static scrPt endPt1, endPt2;

	if (endPtCtr == 0)
	{
		if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
		{
			endPt1.x = xMouse;
			endPt1.y = winHeight - yMouse;
			endPtCtr = 1;
		}
		else
		{
			if (button == GLUT_RIGHT_BUTTON)
			{
				exit (0);
			}
		}
	}
	else
	{
		if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
		{
			endPt2.x = xMouse;
			endPt2.y = winHeight - yMouse;
			DrawLineSegement(endPt1, endPt2);

			endPt1 = endPt2;
		}
		else
		{
			if (button == GLUT_RIGHT_BUTTON)
			{
				exit(0);
			}
		}
	}

	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("Draw Interactive Polylines");

	Init();
	glutDisplayFunc(DisplayFcn);
	glutReshapeFunc(WinReshapFcn);
	glutMouseFunc(PolyLine);

	glutMainLoop();
	return 0;
}

可以使用的另一个GLUT鼠标子程序是glutMotionFuc(fcnDoSomething);

fcnDoSomething函数有两个参数:

void fcnDoSomething(GLint xMouse, GLint yMouse)

其中(xMouse,yMouse)是当鼠标被移动并且按钮被按下时,鼠标光标相对于窗口左上角的位置。

类似地,当鼠标在窗口内移动而鼠标键并未按下时,也可以执行一些动作:

glutPassiveMotionFunc(fcnDoSomething);

GLUT键盘函数

对于键盘输入,用以下函数指定一个当键盘上的一个键被按下时调用的函数:

glutKeyboardFunc(keyFcn);

被指定的函数有三个参数:

void keyFcn(GLubyte key, GLint xMouse, GLint yMouse)

参数key的取值是一个字符值或者对应的ASCII编码。返回的鼠标光标在窗口内的位置坐标(xMouse,yMouse)是相对于窗口左上角的。当一个指定的按钮被按下时,就可以用鼠标位置来启动某些行为。

下面的代码给出一个简单的用键盘输入的曲线绘制程序。

#include <GL/glut.h>
GLsizei winWidth = 400, winHeight = 300;

void Init()
{
	glClearColor(0, 0, 1, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 200, 0, 150);
}

void DisplayFcn()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3f(1, 0, 0);
	glPointSize(3);
}

void WinReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	winWidth = newWidth;
	winHeight = newHeight;
}

void PlotPoint(GLint x, GLint y)
{
	glBegin(GL_POINTS);

	glVertex2f(x, y);

	glEnd();
}

void CurveDrawing(GLubyte curvePlotKey, GLint xMouse, GLint yMouse)
{
	GLint x = xMouse;
	GLint y = winHeight - yMouse;

	switch (curvePlotKey)
	{
	case 'c':
		PlotPoint(x, y);
		break;
	default:
		break;
	}

	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("MousePlotPoints");

	Init();
	glutDisplayFunc(DisplayFcn);
	glutReshapeFunc(WinReshapFcn);
	glutKeyboardFunc(CurveDrawing);

	glutMainLoop();
	return 0;
}

可以使用以下命令指定对于功能键、方向键及其他特殊键的处理函数:

glutSpecialFunc(specialKeyFcn);

被指定的函数也有三个参数:

void specialKeyFcn(GLint specialKey,GLint xMouse,GLint yMouse)

specialKey从GLUT_KEY_F1到GLUT_KEY_F12。方向键的符号常量类似GLUT_KEY_UP和、GLUT_KEY_RIGHT。其他特殊键(如翻页、首尾和插入键)用GLUT_KEY_PAGE_DOWN、GLUT_KEY_HOME等指定。"backspace"、“delete”和“escape”键通过glutKeyboardFunc用它们的ASII编码指定分别未8、127和27.

以下代码展示一个同时支持鼠标、键盘和功能键的交互程序。

#include <GL/glut.h>
#include <stdlib.h>

GLsizei winWidth = 400, winHeight = 300;
GLint edgeLength = 10;

void Init()
{
	glClearColor(0, 0, 1, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 200, 0, 150);
}

void DisplayFcn()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3f(1, 0, 0);
}

void WinReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	winWidth = newWidth;
	winHeight = newHeight;
}

void FillSquare(GLint button, GLint action,
	GLint xMouse, GLint yMouse)
{
	GLint x1, y1, x2, y2;

	if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN)
	{
		x1 = xMouse;
		y1 = winHeight - yMouse;

		x2 = x1 + edgeLength;
		y2 = y1 + edgeLength;
		glRecti(x1, y1, x2, y2);
	}
	else
	{
		if (button == GLUT_RIGHT_BUTTON)
		{
			exit(0);
		}
	}

	glFlush();
}

void EnlargeSqure(GLubyte sizeFactor, GLint xMouse, GLint yMouse)
{
	switch (sizeFactor)
	{
	case '2':
		edgeLength *= 2;
		break;
	case '3':
		edgeLength *= 3;
		break;
	case '4':
		edgeLength *= 4;
		break;
	default:
		break;
	}
}

void ReduceSqure(GLint reductionKey, GLint xMouse, GLint yMouse)
{
	switch (reductionKey)
	{
	case GLUT_KEY_F2:
		edgeLength /= 2;
		break;
	case GLUT_KEY_F3:
		edgeLength /= 4;
		break;
	default:
		break;
	}
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("MousePlotPoints");

	Init();
	glutDisplayFunc(DisplayFcn);
	glutReshapeFunc(WinReshapFcn);
	glutMouseFunc(FillSquare);
	glutKeyboardFunc(EnlargeSqure);
	glutSpecialFunc(ReduceSqure);

	glutMainLoop();
	return 0;
}

OpenGL的菜单功能

GLUT还包括多种向程序中添加简单的弹出式菜单的函数。使用这些函数可以设置和访问多种菜单和子菜单。GLUT菜单命令和其他GLUT函数一起放置在main程序中。

创建GLUT菜单

以下语句创建一个弹出式菜单:

glutCreateMenu(menuFcn);

menuFcn是当一个菜单项被选中时调用的函数的名字。这个函数有一个整型参数对应于选中项的位置。

void menuFcn(GLint menuItemNumber)

一旦指定了菜单项被选中时调用的函数,列在菜单上的菜单项也必须被指定。使用一系列的语句来设定每个菜单项的名称和位置。通用形式如下:

glutAddMenuEntry(charString, menuItemNumber);

参数charString 设定显示在菜单上的文字;参数menuItemNumber设定该菜单项在菜单中的位置。

例如,下列语句创建一个具有两个菜单项的菜单:

glutCreateMenu(menuFcn);

glutAddMenuEntry("First Menu Item",1);

glutAddMenuEntry("First Menu Item",2);

然后,必须通过以下函数指定来选择菜单项的鼠标键:

glutAttachMenu(button);

以下示例程序展示了如何创建和使用GLUT菜单。

#include <GL/glut.h>

GLsizei winWidth = 400, winHeight = 400;
GLfloat red = 1.0, green = 1.0, blue = 1.0;
GLenum fillMode = GL_SMOOTH;

void Init()
{
	glClearColor(0.6, 0.6, 0.6, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 300, 0, 300);
}

void FillOption(GLint selectedOption)
{
	switch (selectedOption)
	{
	case 1:
		fillMode = GL_FLAT;
		break;
	case 2:
		fillMode = GL_SMOOTH;
		break;
	}

	glutPostRedisplay();
}

void DisplayTriangle()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glShadeModel(fillMode);
	glColor3f(red, green, blue);
	
	glBegin(GL_TRIANGLES);
	glVertex2i(280, 20);
	glVertex2i(160, 280);
	glColor3f(red, 0, 0);
	glVertex2i(20, 100);
	glEnd();

	glFlush();
}

void ReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	DisplayTriangle();

	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(200, 200);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("Menu Example");

	Init();
	glutDisplayFunc(DisplayTriangle);
	
	glutCreateMenu(FillOption);
	glutAddMenuEntry("Solid-Color Fill", 1);
	glutAddMenuEntry("Color-Interpolation Fill", 2);
	glutAttachMenu(GLUT_RIGHT_BUTTON);

	glutReshapeFunc(ReshapFcn);

	glutMainLoop();
	return 0;
}

创建和管理多个GLUT菜单

当一个菜单被创建时,它被关联到当前的窗口。可以为一个窗口创建多个菜单,也可以为不同的窗口创建不同的菜单。每个菜单在创建时分配到一个整数标识符。菜单标识符按照菜单创建的顺序从1开始编号。glutCreateMenu子程序返回这个标识符。可以用以下语句记录新创建菜单的标识符:

menuID = glutCreateMenu(menuFcn);

最新创建的菜单成为当前窗口的当前菜单。可以用以下命令激活一个菜单成为当前窗口的当前菜单:

glutSetMenu(menuID);

menuID对应的菜单即成为当前菜单。当与此菜单关联的鼠标键在窗口内按下时,此菜单就会弹出。

以下命令用于清除一个菜单:

glutDestroyMenu(menuID);

如果menuID对应的菜单是窗口的当前菜单,那么即使存在其他的菜单,清除当前菜单后该窗口也没有当前菜单。

以下函数用于获得当前窗口的当前菜单的标识符:

currentMenuID = glutGetMenu();

如果当前窗口没有菜单,或者之前的当前菜单被glutDestroyMenu清除了,返回值为0。

创建GLUT子菜单

也可以将一个子菜单关联到一个菜单上。首先,用glutCreateMenu创建子菜单并且列出子菜单项;然后,将子菜单作为一个项添加到主菜单上。下列语句用于将一个子菜单添加到一个主菜单(或其他子菜单)的菜单项列表:

 glutAddSubMenu函数也可以用来将子菜单添加到当前菜单。

下列例子展示了创建子菜单的过程。

#include <GL/glut.h>

GLsizei winWidth = 400, winHeight = 400;
GLfloat red = 1.0, green = 1.0, blue = 1.0;
GLenum renderingMode = GL_SMOOTH;

void Init()
{
	glClearColor(0.6, 0.6, 0.6, 1);

	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0, 300, 0, 300);
}

void MainMenu(GLint renderingOption)
{
	switch (renderingOption)
	{
	case 1:
		renderingMode = GL_FLAT;
		break;
	case 2:
		renderingMode = GL_SMOOTH;
		break;
	}

	glutPostRedisplay();
}

void ColorSubMenu(GLint colorOption)
{
	switch (colorOption)
	{
	case 1:
		red = 0; green = 0; blue = 1;
		break;
	case 2:
		red = 0; green = 1; blue = 0;
		break;
	case 3:
		red = 1; green = 1; blue = 1;
		break;
	}

	glutPostRedisplay();
}

void DisplayTriangle()
{
	glClear(GL_COLOR_BUFFER_BIT);

	glShadeModel(renderingMode);
	glColor3f(red, green, blue);
	
	glBegin(GL_TRIANGLES);
	glVertex2i(280, 20);
	glVertex2i(160, 280);
	glColor3f(1, 0, 0);
	glVertex2i(20, 100);
	glEnd();

	glFlush();
}

void ReshapFcn(GLint newWidth, GLint newHeight)
{
	glViewport(0, 0, newWidth, newHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight));

	DisplayTriangle();

	glFlush();
}

int main(int argc, char* argv[])
{
	GLint subMenu;

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition(200, 200);
	glutInitWindowSize(winWidth, winHeight);
	glutCreateWindow("SubMenu Example");

	Init();
	glutDisplayFunc(DisplayTriangle);

	subMenu = glutCreateMenu(ColorSubMenu);
	glutAddMenuEntry("Blue", 1);
	glutAddMenuEntry("Green", 2);
	glutAddMenuEntry("White", 3);
	
	
	glutCreateMenu(MainMenu);
	glutAddMenuEntry("Solid-Color Fill", 1);
	glutAddMenuEntry("Color-Interpolation Fill", 2);
	glutAddSubMenu("Color", subMenu);

	glutAttachMenu(GLUT_RIGHT_BUTTON);

	glutReshapeFunc(ReshapFcn);

	glutMainLoop();
	return 0;
}

修改GLUT菜单

如果要改变用来选择菜单的鼠标键,首先要取消与当前鼠标键的关联,然后再关联一个新的键。以下函数用于取消关联:

glutDetachMenu(mouseButton);

参数mouseButton是之前关联到这个菜单的鼠标键(左中右)的GLUT符号常量。取消关联之后使用glutAttachMenu来将菜单与另一个按钮关联起来。

也可以改变一个已有菜单中的某些项。例如,可以用以下函数删除当前菜单中的一个项:

glutRemoveMenuItem(itemNumber);

其中参数itemNumber被赋值为欲删除菜单项的整数标识符。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OpenGL(Graphics Library,GL图形库)图形系统是图形硬件的一个软件接口,它允许我们创建交互性的程序,产生移动三维物体的彩色图像。使用OpenGL,我们可以对计算机图形技术进行控制,产生逼真的图像或者虚构出现实世界没有的图像。本书解释了如何使用OpenGL图形系统进行编程,实现所需要的视觉效果。   本书内容   本书共分15章。前5章描述了一些基本信息,读者需要理解这些内容,才能在场景中绘制正确着色和光照的三维物体。   ·第1章对OpenGL可以实现的功能进行简要的介绍。该章还提供了一个简单的OpenGL程序,并介绍需要了解的一些基本编程细节,有助于学习后续章节的内容。   ·第2章解释如何创建一个物体的三维几何图形描述,并最终把它绘制到屏幕上。   ·第3章描述三维模型在绘制到二维屏幕之前如何进行变换。我们可以控制这些变换,显示模型的特定视图。   ·第4章描述如何指定颜色以及用于绘制物体的着色方法。   ·第5章解释如何控制围绕一个物体的光照条件,以及这个物体如何对光照作出反应(也就是说,它是如何反射或吸收光线的)。光照是一个重要的主题,因为物体在没有光照的情况下看上去往往没有立体感。   接下来的几章说明如何对三维场景进行优化以及如何添加一些高级特性。在没有精通OpenGL之前,读者可以选择不使用这些高级特性。有些特别高级的主题在出现时会有特殊的标记。   ·第6章描述创建逼真场景所需要的一些基本技巧:alpha混合(创建透明物体)、抗锯齿(消除锯齿状边缘)、大气效果(模拟雾和烟雾)以及多边形偏移(在着重显示填充多边形的边框时消除不良视觉效果)。   ·第7章讨论如何存储一系列的OpenGL命令,用于在以后执行。我们可以使用这个特性来提高OpenGL程序的性能。   ·第8章讨论如何操作表示位图或图像的二维数据。位图的一种常见用途就是描述字体中的字符。   ·第9章解释如何把称为纹理的一维、二维和三维图像映射到三维物体表面。纹理贴图可以实现许多非常精彩的效果。   ·第10章描述OpenGL实现中可能存在的所有缓冲区,并解释如何对它们进行控制。我们可以使用这些缓冲区实现诸如隐藏表面消除、模板、屏蔽、运动模糊和景深聚焦等效果。   ·第11章显示了如何使用GLU(OpenGL Utility Library,OpenGL工具函数库)中的分格化和二次方程函数。   ·第12章介绍生成曲线和表面的高级技巧。   ·第13章说明如何使用OpenGL的选择机制来选择屏幕上的一个物体。此外,该章还解释了反馈机制,它允许我们收集OpenGL所产生的绘图信息,而不是在屏幕上绘制物体。   ·第14章描述如何用巧妙的或意想不到的方法来使用OpenGL,产生一些有趣的结果。这些技巧是通过对OpenGL及其技术前驱Silicon Graphics IRIS图形函数库的多年应用和实践总结出来的。   ·第15章讨论OpenGL 2.0所引入的变化,包括对OpenGL着色语言的介绍。OpenGL着色语言通常又称为GLSL,它允许对OpenGL的顶点和片断处理阶段进行控制。这个特性可以极大地提高图像的质量,充分体现OpenGL的计算威力。   另外,本书还包括几个非常实用的附录:
第1篇 系统开发基础   包括第1章三维图形世界、第2章OpenGL概述和第3章Oracle与 OCI技术及编程基础。   第1章 介绍了计算机三维图形技术的发展、科学计算可视化技术、三维可视化工程设计的基本概念和发展现状。   第2章 主要对OpenGL的基本概念、OpenGL编程基础和在Visual C++环境下OpenGL基本程序框架的建立进行了讲解,并给出了一个简单的旋转立方体程序示例。通过这一章,使读者对OpenGL有初步的概念和了解,对于纹理、显示列表等更深入的编程,我们将通过后续章节进行更详细的讲解和学习。   第3章 主要对Oracle数据库及其特点进行简要的介绍和说明。以Oracle 9i为例,介绍了Oracle数据库的安装步骤和Oracle支持的数据类型。在此基础上,介绍了ADO、Pro*C/C++和OCI三个主要Oracle编程接口,对它们的各自功能和特点进行了详细说明,从功能方面、性能方面、开发难度方面进行了详细分析和比较。重点介绍OCI编程基础、OCI的数据结构、OCI程序的基本结构、OCI执行的步骤,最后给出了在Visual C++6.0环境下开发OCI应用程序的示例。   第2篇 大规模地形三维可视化系统设计与实现   包括第4章地形三维可视化系统框架与OCI类模块设计、第5章地形三维可视化系统的地形渲染实现和第6章地形三维可视化系统项目管理与辅助功能设计。   第4章 在第2章的基础上,完成了基于OpenGL的地形三维可视化系统程序框架的建立,为后续的功能模块开发提供了基础平台;在第3章的基础上,设计了OCI公共类,将所有与OCI有关的数据库操作、数据读取等功能函数实现全部封装在该类中,并定义了公共类的全局变量myOci。   第5章 本章对地形三维可视化进行了基本概述,介绍了目前地形三维可视化的主要算法。主要介绍了海量地形与影像纹理数据的常用获取方法,给出了海量地形自分块与影像纹理分块原则和程序实现,以及地形与影像子块调度的程序实现,在此基础上实现了地形的三维可视化;还介绍了真三维立体的实现算法和数学模型,在此基础上给出了基于OpenGL的真三维立体的程序实现。   第6章 主要讲解了新建项目、打开项目、背景天空的绘制、绘图模式控制的实现方法和程序设计。介绍了基于OpenGL深度缓存的二维屏幕坐标向三维空间坐标的转换算法,实现了对三维空间坐标和空间距离查询,以及查询标识设置的程序设计;最后讲解了基于键盘和鼠标联合控制的三维场景照相机程序模块的实现,实现三维场景的前、后、左、右移动和任意方向的旋转。   第3篇 线路三维可视化系统设计与实现   包括第7章三维交互技术与三维线路数据结构、第8章三维线路设计实现、第9章道路整体三维建模和第10章三维漫游的实现。   第7章 主要对三维交互环境进行了介绍,详细讲解了正射投影模式的实现、正射投影模式下场景控制方法和程序设计,以及透视投影模式的实现方法;还讲解了正射投影模式和透视投影模式下三维地面坐标的获取原理、方法,在此基础上,设计了边坡数据结构、桥梁数据结构、隧道数据结构、水沟数据结构及线路数据结构,为实现三维线路设计做好了前期准备。   第8章 主要对线路方案的主要参数设计方法和程序实现、设计交点信息输入实现、线路中心线定位方法、设计方案的保存、平面方案的自动生成和程序设计、纵断面设计模块的实现、边坡模型的生成算法、线路路基三维建模方法和实现、隧道三维建模和参数控制、桥梁三维建模和参数控制的程序设计进行了详细讲解。   第9章 主要讲解了道路整体三维模型实现,对其中的线路封闭区域确定与分割算法、地形块综合数据点计算、分块TIN模型的构网实现、封闭区域内数据点的剔除、整体构网的程序实现都进行了详细说明;在纹理管理部分,详细讲解了边坡纹理、路肩纹理、桥梁护坡面纹理、隧道内墙纹理、隧道洞门纹理的程序设计和实现。   第10章 从多个方面对三维漫游的基本概念、程序实现、参数调整和控制进行了讲解,帮助读者学会在三维可视化系统中三维漫游模块的程序设计方法;对飞行路径的基本概念、设置方法、插值算法、保存和打开的程序设计,沿飞行路径实现三维漫游的程序设计,沿线路方案漫游的固定高度和相对高度两种模式的程序设计,三维漫游控制和调整的程序设计,以及三维漫游的相关计算都进行了详细的讲解,每一部分都给出了完整的程序代码。   第4篇 线路三维可视化系统辅助功能实现   包括第11章显示模式控制及实现、第12章3D模型载入与应用、第13章系统输出接口与动画录制实现和第14章系统简介与运行实例。   第11章 本章主要对双目立体方式、正射投影方式和透视投影方式的显示模型模式控制和实现、时钟指北针的程序设计和实现、缩略图的实现方法和程序设计进行了详细的讲解和说明。   第12章 本章主要对目前常用的3DS、AES、OBJ、MD2、MD3、MS3D等3D模型进行了介绍和说明,并给出了每种3D模型的示例,在此基础上,详细介绍了在OpenGL中应用3DS模型的两种主要方法:通过第三方软件对3DS模型进行转换和直接通过程序读取3DS模型;以桥墩3DS模型为例,给出了3DS模型在线路三维场景中的应用方法和程序设计实现。   第13章 介绍了DXF文件格式,详细讲解了DXF输出模块的程序设计,实现了线路三维模型输出到DXF文件,可以在AutoCAD中打开线路三维模型进行观察;设计了动画录制类,实现将OpenGL动画录制到AVI文件中;设计了屏幕图形打印类,实现了对OpenGL屏幕图形的打印,在此基础上,设计录制屏幕图像模块,实现了将OpenGL动画录制为一系列图像并保存到硬盘中。   第14章 主要对所建立的三维可视化设计系统的主要特点和功能进行了介绍,对线路可视化设计系统加以总结,并对相应的功能模块进行集中说明,使读者能够对整个三维可视化设计有更加清晰的思路和概念,最后给出系统运行实例。   附录   包括附录A:相关数学程序模块;附录B:OpenGL核心函数库和应用函数库;附录C:OpenGL常用编程技巧;附录D:OpenGL资源网站。
计算机图形学编程的PDF是一本适用于学习开发3D游戏的朋友们的资源。它包含了基本图形的生成、直线生成的不同算法(如DDA算法、中点算法和Bresenham算法)等内容。此外,它还介绍了OpenGL图像管线的组成和简单的OpenGL着色器语言(GLSL)示例。这本PDF对于对自动化图形界面操作和Python编程有兴趣的读者也是有帮助的,可以学习如何使用它们来提高工作效率、自动执行重复性任务或进行GUI应用程序的自动化测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [计算机图形学pdf(可copy内容版)](https://download.csdn.net/download/soul__river8/3182581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python自动化与脚本编程笔记3.md](https://download.csdn.net/download/weixin_52057528/88264569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [《计算机图形学编程(使用OpenGL和C++)》](https://blog.csdn.net/RayoNicks/article/details/123004844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值