如何使用glulookat参数对一个物体进行360拍照

本帖子已过去太久远了,不再提供回复功能。OpenGL(1)
1.gluLookAt()——视图变换函数
把自己的眼睛当成是照相机,前三个参数表示眼睛的坐标,中间三个参数表示要拍照的物体的中心位置,可以理解成焦点吧,
后三个参数表示头顶的朝向,比如说头可以歪着(哈哈)。但是我测试过,如果歪的不对,原来的正前方现在已经不是正前方
了,那么就看不见物体了。举个例子:
gluLookAt (0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//这个就表示头顶是朝着y方向
gluLookAt (0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0);//这个表示头歪了45度,头顶朝着(1.0,1.0,0.0)这个方向
2.glScalef() ——模型变换函数&缩放
void&glScalef(GLfloat&&x,& GLfloat&&y,& GLfloat&&z);
模型变换的目的是设置模型的位置和方向,例如可以对模型进行旋转、移动和缩放,或者联合这几种操作。
这个函数表示模型在各轴上是如果进行缩放的。举个例子:
glScalef (1.0, 2.0, 1.0);//表示y坐标值扩大两倍,这样原本方的物体就变成长的了。
3.glTranslatef() ——模型变换函数&移动
void&glTranslatef(GLfloat&&x,& GLfloat&&y,& GLfloat&&z);
这个函数表示模型是怎样移动的。举个例子:
glTranslatef(-1.0,0.0,-2.0);//表示物体沿x负方向移动1.0,沿z轴负方向移动2.0。所以就好像能看见侧面一样
4.glRotatef()——模型变换函数&&旋转
void&glRotatef(GLfloat&&angle,& GLfloat&&x,& GLfloat&&y,& GLfloat&&z);
angle表示旋转的角度(注意单位不是弧度),(x,y,z)表示转轴。举个例子:
glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)这个轴旋转45°。
5.glFrustum() ——投影变换函数&透视投影
前四个参数表示裁剪范围,后两个参数(要求为正数)表示近的面和远的面离眼睛的距离。有点儿像调焦。裁剪完后拉伸铺满整个屏幕。
6.glPerspective() ——投影变换函数&透视投影
void&gluPerspective(GLdouble&&fovy,& GLdouble&&aspect,& GLdouble&&zNear,& GLdouble&&zFar);
第一个参数表示在y方向上的视角度数。个人理解:比如45,表示眼睛和模型中心这个条线与y轴的夹角。
第二个参数表示纵横比。x/y。比如2表示x、y本来都是1个长度,现在x可以当两个长度用,这样,模型就好像被x方向压缩了一样。
后两个参数glFrustum()中后两个相近。要求都是正数。
原文链接:/lihuiyy/archive//2244317.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12297次
积分:1283
积分:1283
排名:千里之外
原创:120篇
转载:11篇
(1)(1)(2)(3)(1)(3)(81)(28)(12)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'记性不好 ,学习opengl的时候,总是忘记视口和投影变换函数配合时需要注意的地方,导致窗口内看不到三维物体。所以写在这以方便提醒自己。(原创,转载请注明出处)
一、&gluLookAt和投影
& & &void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);
  gluLookAt的前三个参数定义了观察点的位置,但同时也定了投影函数如正交投影函数各个参数的原点!
  正交投影是指物体和照相机之间的距离并不影响他看上去的大小。
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)各参数意义如图所示,用来标记正交空间长方体。
& & & & & & & &&
    若在程序中有glOrtho(-2.0,2.0,-2.0,2.0,5.0,100.0);和gluLookAt(1.0,0.0,0.0,1.0,0.0,-4.0,0.0,1.0,0.0);而物体坐标为(0,0,-10)则表示以(1,0,0)点为原点定义了一个宽为4高为4长为95的立方体,其左下角绝对坐标为(1-2,0-2,0-5)=(-1,-2,-5),物体显示时偏左。
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &  
    若物体坐标为(0,0,-4) 此时会显示黑屏。因为物体在正交立方体外。
    对于透视投影函数void gluPerspective(GLdouble fovy, //角度
                      GLdouble aspect,//视景体的宽高比
                      GLdouble zNear,//沿z轴方向的两裁面之间的距离的近处
                      GLdouble zFar //沿z轴方向的两裁面之间的距离的远处)
   其中,zNear和zFar两个参数也是以观察点为原点的相对坐标。
二、投影变换到视口变换
  视口是一个矩形的窗口区域,三维图像通过映射生成二维平面的像素后,就是在这片区域绘制的。默认情况下,视口被设置为打开窗口的整个像素矩形。
& & &glViewport(GLint x,GLint y,GLsizei width,GLsizei height)定义了视口在窗口中的区域同时也规定了二维的像素平面到视口区域的映射关系。
& & & & & & & & & & & & & & & & & & & & & & & & &
& & 若有glViewport(0,0,w/2,h),即有:
& & & & & & & & & & & & & & &
也可以利用glViewPort()生成多窗口模式:
glViewport(0.0,0.0,afxw/2,afxh/2);
glCallList(box);
glViewport(afxw/2,0.0,afxw/2,afxh/2);
glCallList(box);
glViewport(0.0,afxh/2,afxw/2,afxh/2);
glCallList(box);
glViewport(afxw/2,afxh/2,afxw/2,afxh/2);
glCallList(box);
& & & & & & & & & 生成效果如图所示: & & & & & & & & & & & & &
                                               & & & & & & & & & & & & & & & & & & & & & & & & & & &
&&01:31:37
阅读(...) 评论()一般情况下实现第一人称视角游戏有两种方法,一是移动场景,二是移动眼坐标.移动场景方法比较简单,使用glTranslatef与glRotatef配合即可,但一般只在简单场景和单角色的情况下使用,而且角色的各种计算(如实时坐标、碰撞)不好实现,所以不推荐使用;移动眼坐标的方法就非常灵活,它对场景和角色的状态未做任何操作,一般只要设置成跟随主角色移动旋转即可实现第一人称视角视觉效果.
void AirRoam(void)
// 追踪观察点的方向
static GLfloat s_eye[]={0,8.0,0};
static GLfloat s_at[]={0.0,0.0,0.0};
static GLfloat s_angle = -90.0;&&&&&&&&&&&&&&&&&&& //如果初始角度设置为0则初始面向X轴正方向,设置为-90面向
//Z轴负方向,符合默认情况下的设计习惯。
float PI=3.14159f;
// 旋转请求
if(KEY_DOWN(DIK_LEFT))
s_angle -= 2.0;&&&&&&&&&&&&&&&&&&&&&&& //每按一次左键,旋转2度。
if (KEY_DOWN(DIK_RIGHT))
s_angle += 2.0;&&&&&&&&&&&&&&&&&&&&&& //每按一次右键,旋转2度。
float rad =float(PI*s_angle/180.0f);&&&&&&&&&&&&&&&&&&& //计算SIN和COS函数中需要的参数。
// 前进,后退请求
if(KEY_DOWN(DIK_UP))
s_eye[2] += (float)sin(rad) *
s_eye[0] += (float)cos(rad) *
//如果按上方向键,沿着转换角度后的方向前进,speed为每次前进的步长,通过sin和cos函数实现沿着现
//有角度方向前进。
if(KEY_DOWN(DIK_DOWN))
s_eye[2] -= (float)sin(rad) *
s_eye[0] -= (float)cos(rad) *
//如果按下方向键,沿着转换角度后的方向后退,speed为每次前进的步长,通过sin和cos函数实现沿着现
//有角度方向前进。
s_at[0] = float(s_eye[0] + 100*cos(rad));&&&&
s_at[2] = float(s_eye[2] + 100*sin(rad));
s_at[1] = s_eye[1];
//观察点可以设置的更远一些,如果设置的更小可能导致不能看到较远的物体,也是通过sin和cos函数实现
//向前进方向去设置观察点。
// 设置观察点
glLoadIdentity();
gluLookAt(s_eye[0], s_eye[1], s_eye[2],
s_at[0], s_at[1], s_at[2],
0.0, 1.0, 0.0);
本文已收录于以下专栏:
相关文章推荐
目录(?)[+]
      3D游戏中最基本的一个功能就是3D漫游了,玩家可以通过键盘或者鼠标控制自己的视角。
      之前我们也学习过一个相关的函数,glLoo...
上一节视变换(view transformation) ,介绍了相机的设置参数,并建立了圆形坐标系和球形坐标系下的相机位置随着时间改变的绘制立方体程序。程序中用户无法通过键盘和鼠标来...
      3D游戏中最基本的一个功能就是3D漫游了,玩家可以通过键盘或者鼠标控制自己的视角。
      之前我们也学习过一个相关的函数,glLookAt,用来制定摄像机的位置,摄像机观察目标...
opengl漫游模型示例
在前面的教程中,我们讨论了视口矩阵和我们可以怎样利用视口矩阵让绘制的场景移动(我们在上次教程中成功将那个二维平面稍稍向后移动了一点)。OpenGL本身对摄像机这个概念并不熟悉,但是我们可以通过移动场景...
理论基础在3D游戏中,我们通常可以通过鼠标或键盘操纵角色英雄在场景中移动,从不同的角度观察物体,这其实就是本章要介绍的摄像机漫游。
关于摄像机漫游其实就是围绕一个函数实现的(通过改变视点以及观察方向...
在计算机3D图形处理技术中,也有类似我们眼睛的东西gluLookAt()函数,如果这个观察点在OpenGL场景中的位置发生变化,我们在计算机屏幕上的图像(相当于我们的大脑的映像)就发生变化。     ...
opengl Distilled 中介绍了view 坐标转换的原理,先列一下原著中的介绍:
The view transformation transforms vertices into eye ...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 glulookat后三个参数 的文章

 

随机推荐