一、 观察点信息定义 和 投影信息定义
1. 观察点定义(相机定义) void gluLookAt(
GLdouble eyex,GLdouble eyey,GLdouble eyez,
GLdouble centerx,GLdouble centery,GLdouble centerz,
GLdouble upx,GLdouble upy,GLdouble upz
);
观察点的世界坐标系坐标;焦点的世界坐标; 观察者(相机)的正上方的世界坐标系中的矢量。
默认情况下:观察点在世界坐标系原点,看向Z负半轴,且观察者的正上方是Y正半轴。
以上,以世界坐标系(右手坐标系)定义观察点的信息:同时也定了投影函数信息如正交投影函数各个参数的原点,因为投影的裁剪空间信息是观察点的相对尺寸(相对距离)!
如:正价投影中正交裁剪空间的所有信息,都是以“观察点”为相对的尺寸来定义。
2. glOrtho 定义投影信息: 正交投影信息(正交裁剪界面)
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)
以观察点,给出相对坐标,定义一个裁剪空间。
裁剪空间的实际世界坐标系,为了便于计算,观察点信息:gluLookAt( 0,0,-5, 0,0,0 ,0,0,1);X轴表示左右, Z轴表示上下, Y轴表示远近。
(1)左下角坐标 = eye(x, y, z) + (left, -near, botton)
(2)右下角坐标 = eye(x, y, z) + 。。。
只有实体模型在裁剪空间中,才能被视口捕获显示,否则只显示背景颜色。
3. 透视投影的裁剪体
void gluPerspective(GLdouble fovy, //角度
GLdouble aspect,//视景体的宽高比
GLdouble zNear,//观察点正前方(观察点信息定义)距离
GLdouble zFar //观察点正前方(观察点信息定义)距离
)
其中,zNear和zFar两个参数也是以观察点为原点的相对坐标。
二、 投影变换 到 视口变换
视口是一个矩形的窗口区域,三维图像通过映射生成二维平面的像素后,就是在这片区域(视口)绘制的。默认情况下,视口被设置为打开窗口的整个像素矩形,两者的位置以及尺寸一致(默认)。
glViewport(GLint x,GLint y,GLsizei width,GLsizei height)定义了视口在窗口中的区域同时也规定了视口区域的映射到窗口中二维的像素平面关系。
(1)视口默认与OG绘制的窗口位置与尺寸一致,即通过视口映射到窗口不变形;
(2)参数的所有单位都是像素,因为视口的作用是指定观察者通过裁剪空间(世界坐标尺寸)获取的二维信息(世界坐标系,投影变换)。 转化为视口(像素)的位置,以及尺寸。
(3)前两个参数定义视口在窗口中的位置,后两个参数定义视口在窗口的尺寸且以及“横纵比”关键。
说明:
(1)视口可以窗口任意像素位置,如果不在窗口覆盖,则绘制结果不可见
(2)永远保证“视口”与窗口的“横纵比”一致,则保证图形绘制结果不变形。
(3)通过移动眼睛的位置(观察点)的位置,可以实现平移的效果。
如果定义的视口(位置,尺寸)信息与窗口()
若有glViewport(0,0,w/2,h),则会发生形变。为了防止视图变形,则需要保证视口横纵比 必须 与窗口(OG需要绘制显示的窗口)的横纵比一致。
也可以利用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);
(1)因为视口的横纵比与 窗口一致,所以图形不变形;
(2)指定了不同窗口中不同的位置以及尺寸。
endl;
参考博客:http://www.360doc.com/content/14/0828/10/13726687_405278861.shtml
浙公网安备 33010602011771号