首页 > 代码库 > OpenGL学习(三)三维编程基础

OpenGL学习(三)三维编程基础

正交投影

    viod  glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble                           near,GLdouble far)

    //设定一个正交投影矩阵,并定义了一个形状为直平行六面体的视域体。


    void glutWireCube(GLdouble size)         //生成一个线框立方体,中心位于原点,边长为size

    void glutSolidCube(GLdouble size)        //生成一个实立方体


    一个简单的画三维立方体的例子:

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

using namespace std;



void init()
{
	glClearColor(0.0,0.0,0.0,0.0);      //指定屏幕背景为黑色

	glColor3f(1.0,1.0,1.0);             //设置绘制颜色为白色

	glShadeModel(GL_FLAT);              //设置颜色插值为平面模式

}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);         //清理屏幕颜色为我们指定的颜色
	

	glutSolidCube(0.5);
	

	glFlush();                       //强制以上绘图操作执行
}

void reshape(int w,int h)
{
	glMatrixMode(GL_PROJECTION);       //设置为投影模式
	glLoadIdentity();
	glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);  
	
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
}

int main(int argc,char**argv)
{
	glutInit(&argc,argv);                           //初始化glut
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置窗口模式为单缓冲和RGB模式
	glutInitWindowSize(500,500);                    //设置窗口大小
	init();
	glutCreateWindow("test");                       //设置窗口标题
	glutDisplayFunc(display);                       //设置绘图回调函数
	glutReshapeFunc(reshape);                       //设置窗口回调函数
	glutMainLoop();                                 //开始循环,等待响应
	return 0;
}

    运行得到:

            wKioL1QAM_aSZIEiAAHTj3OmQyE308.gif

摄影机的定位 

    上面的例子存在一个问题,即摄像机只朝向该立方体的一个面,所以我们也只能看到该立方体的一个面。如果想看到其他面,必须移动摄像机或者被观察对象。而在OpenGL中,这两个操作时等价的。由视图矩阵来实现。

    为了获得所期望的视图,我们可以在对象坐标系中设置摄像机的位置和朝向。我们可以决定摄像机的位置并通过该摄像机所指向的点来指定。其次还需指定一个向上向量。为方便起见,通常将向量取为(0,1,0)或者坐标系中的y轴方向

    void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

                   GLdouble atx,GLdouble aty,GLdouble atz,

                   GLdouble upx,GLdouble upy,GLdouble upz)

    //确定了一个可用于为摄像机定位和定向的矩阵,涉及的参数包括摄像机的位置(视点eye),被观察点(点at)以及所期望的up方向。

    再更改上述代码可以得到

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

using namespace std;



void init()
{
	glClearColor(0.0,0.0,0.0,0.0);      //指定屏幕背景为黑色

	glColor3f(1.0,1.0,1.0);             //设置绘制颜色为白色

	glShadeModel(GL_FLAT);              //设置颜色插值为平面模式

}

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);         //清理屏幕颜色为我们指定的颜色
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0);

	glutWireCube(0.5);
	

	glFlush();                       //强制以上绘图操作执行
}

void reshape(int w,int h)
{
	glMatrixMode(GL_PROJECTION);       //设置为投影模式
	glLoadIdentity();
	glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0);
	
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
}

int main(int argc,char**argv)
{
	glutInit(&argc,argv);                           //初始化glut
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //设置窗口模式为单缓冲和RGB模式
	glutInitWindowSize(500,500);                    //设置窗口大小
	init();
	glutCreateWindow("test");                       //设置窗口标题
	glutDisplayFunc(display);                       //设置绘图回调函数
	glutReshapeFunc(reshape);                       //设置窗口回调函数
	glutMainLoop();                                 //开始循环,等待响应
	return 0;
}

运行得到:

    wKiom1QAOM7hZ2YNAACvmPTtob8421.jpg

    因为把摄像机的位置放在了(1,1,1)那点,所以得到这样的图像。

    

OpenGL学习(三)三维编程基础