opengl 坐标测试

来源:互联网 发布:淘宝客活动可以取消吗 编辑:程序博客网 时间:2024/06/06 05:12


float ratio = 1.0* w / h;
// 投影在屏幕上显示的位置,以及宽度,高度(现在即投影到屏幕(0,0)坐标)
glViewport(0, 0, w, h);


// 看到的是一个1的正方体


// 投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//正投影(左右下上前后的投影范围)(这个是以摄像机为原点的坐标)
// 看到的是眼前6.1 到 7.1 范围的东西,看不到任何东西
//glOrtho(-2, 2, -2, 2, 6.1, 7.1);
glOrtho(-2, 2, -2, 2, 1, 10);
//透视投影
// 第一个是眼睛睁开大小 第二个是宽高比 第三个是近裁面 第四个是远裁剪面
//gluPerspective(45,ratio,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 自定义观察坐标,不设置,则世界坐标的原点为摄影机,z反方向为观察方向,y正方向为上(右手系坐标,右方为x,上为y,向外为z)
// 前三个是摄影机坐标,观察点(摄影机-观察点为z轴正向)最后三个是y轴正方向(不可与z同向),确定yz,x方向就定了
gluLookAt(0,1, 5, 0,0,0, 0,1,0);


//---------------------正投影


// 投影面是-2 到 2,因为摄像机和观察点都上移了2,所以观察的范围就是世界坐标的0-4,所以只看到窗口下面1/4处有正方体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);




// 投影面是-2 到 2,因为摄像机和观察点都上移了2,所以观察的范围就是世界坐标的0-4,所以只看到窗口下面1/4处有正方体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,2,0, 0,1,0);


// 摄像机上移2,观察点不变,上下看到的是斜着穿过正方体的平面,左右还是正方体,所以上下长,左右不变
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 1, 100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,0,0, 0,1,0);




// 摄像机上移2,观察点不变,而截取范围缩小,导致中间有部分投影为空
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 4.5, 5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,2, 5, 0,0,0, 0,1,0);


// 看到的是眼前6.1 到 7.1 范围的东西,而正方体位于-1到1,即4到6,所以看不到任何东西
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2, 2, -2, 2, 6.1, 7.1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);




//// -----------------透视投影---------------------------
// 观察点为5,y轴为上,眼睛睁开90度,宽高比为1,近裁剪面为眼前1,即世界坐标4,所以看到正方型占屏幕1/5
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0,0,0, 0,1,0);


// 眼睛睁开的小,等于正方向放大
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);




// 宽高比为2,因为视口没变,所以感觉左右压缩,上下边长(正常显示应该 glViewport(0, 0, w, h/2);即视口的宽高于此一致)
//glViewport(0, 0, w, h/2);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,2,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);




// 裁剪改变,参考正投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,6.1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0, 5, 0,0,0, 0,1,0);




// 摄像机与观察点同时下移2,等于正方体在头顶,被眼睛看到(不是直视),参考正投影
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-2, 5, 0,-2,0, 0,1,0);




// 摄像机下移2,等于正方体正方体翻转了,参考正投影(注意与上一个的区别
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,-2, 5, 0,0,0, 0,1,0);


// 上方向为0 -1 0 等于上下颠倒,若是正方向有箭头指向就可以看清
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,566);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

gluLookAt(0,0, 5, 0,0,0, 0,-1,0);



原创粉丝点击