OpenGL中的投影使用
OpenGL中的投影使用
在OpenGL中,投影矩阵指定了可视区域的大小和形状。对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途。
正投影
它适用于2D图形,如文本、建筑画图等。在它的应用场合,我们希望在屏幕上展示准确的物体大小和度量。
透视投影
它使用透视除法,对距离观察者较远的物体进行缩短和收缩。由于可视区域前端和后端的宽度度量方法并不同样,导致两个逻辑大小同样的物体,当它们分别位于可视区域的前面和后面时,前者看上去要比后者大一些。
下图展示了平截头体(frustum)所定义的透视投影,它的观察方向是从狭窄端到宽阔端。工具函数gluPerspective能够方便的定义一个平截头体:
void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far);
參数 fovy表示垂直方向的视野角度,aspect表示宽度与高度的纵横比,near与far表示近端和远端裁剪平面之间的距离。
以下的代码设置使用了透视投影,展示了一个由太阳(黄色)、地球(红色)、月亮(灰色)三者构成的运动系统。这是一个经典的嵌套变换的样例,我们使用矩阵堆栈将一个物体依据还有一个物体进行变换,执行结果如图所看到的:
/* 程序清单 4-3
* 2014/5/18
*/
#include <glut.h>
#include <math.h>
// 旋转的步进值
static float fMoonRot =0.0f;
static float fEarthRot= 0.0f;
// 设置渲染状态
void SetupRC()
{
// 设置清除窗体的颜色(黑色背景)
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 设置画图颜色为绿色
glColor3f(0.0f, 1.0f, 0.0f);
// 打开深度測试
glEnable(GL_DEPTH_TEST);
}
// 绘制场景(显示回调函数)
void RenderScene()
{
// 用当前的清除颜色清除窗体
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
// 保存矩阵状态(模型视图矩阵)
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
// 平移坐标系,注意是相对于视觉坐标的位置
glTranslatef(0.0f, 0.0f, -300.0f);
// 绘制太阳
glColor3ub(255, 255, 0);
glutSolidSphere(15.0f, 15, 15);
// 旋转坐标系,累加效果
glRotatef(fEarthRot, 0.0f, 1.0f, 0.0f);
// 绘制地球
glColor3ub(255, 0, 0);
// 平移坐标系,累加效果
glTranslatef(105.0f, 0.0f, 0.0f);
// 设置地球的旋转步进
fEarthRot += 5.0f;
if(fEarthRot > 360.0f) {
fEarthRot = 0.0f;
}
glutSolidSphere(15.0f, 15, 15);
// 绘制月球
glColor3ub(200, 200, 200);
// 旋转坐标系,累加效果
glRotatef(fMoonRot, 0.0f, 1.0f, 0.0f);
// 平移坐标系,累加效果
glTranslatef(30.0f, 0.0f, 0.0f);
// 设置月亮的旋转步进
fMoonRot += 15.0f;
if(fMoonRot > 360.0f) {
fMoonRot = 0.0f;
}
glutSolidSphere(6.0f, 15, 15);
// 恢复矩阵状态(当前坐标系与视觉坐标重合)
glPopMatrix();
// 交换缓冲区,显示画面
glutSwapBuffers();
}
// 当窗体大小改变时由GLUT函数库调用
void ChangeSize(GLsizei w, GLsizei h)
{
// 窗体的纵横比
GLfloat fAspect;
// 防止被0除
if (0== h) {
h = 1;
}
// 将视口设置为窗体的大小
glViewport(0, 0, w, h);
// 计算窗体的纵横比
fAspect = (GLfloat)w / (GLfloat)h;
// 设置当前操作的矩阵为投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 定义平截头体, 45度视野,近、远平面为1.0和425.0
gluPerspective(45.0f,fAspect, 1.0, 425.0);
// 设置当前操作的矩阵为模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// 计时器函数,每秒触发10次窗体重绘事件
void TimerFunc(intvalue)
{
glutPostRedisplay();
glutTimerFunc(100, TimerFunc, 1);
}
int main(int argc,char *argv[])
{
// 传递命令行參数,并对GLUT函数库进行初始化
glutInit(&argc, argv);
// 设置创建窗体时的显示模式(双缓冲区、RGB颜色模式)
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
// 设置窗体的初始大小
glutInitWindowSize(480, 320);
// 创建窗体
glutCreateWindow("Bounce");
// 设置显示回调函数
glutDisplayFunc(RenderScene);
// 设置当窗体的大小发生变化时的回调函数
glutReshapeFunc(ChangeSize);
// 设置计时器函数
glutTimerFunc(100, TimerFunc, 1);
// 设置渲染状态
SetupRC();
// 启动GLUT框架的执行,一经调用便不再返回,直到程序终止
glutMainLoop();
return0;
}
OpenGL中的投影使用相关推荐
- OpenGL中投影变换矩阵的反向推导
在OpenGL中有两个重要的投影变换:正交投影(Orthographic Projection)和透视投影(Perspective Projection),二者各有对应的变换矩阵.初学者比较难理解这两 ...
- OpenGL中投影矩阵(Projection Matrix)详解
在游戏开发中,一个物体模型从它自身的坐标系转换至我们在屏幕上所见的样子,需要进行一系列的坐标变换以及其他的操作.该过程称为渲染管线.以OpenGL为例: 该过程在以前是被封装的,不能访问.但是现在我们 ...
- OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法
OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将 ...
- OpenGL学习脚印: 投影矩阵和视口变换矩阵
OpenGL中的视图可以利用照相机来进行比拟.产生目标的场景的变过过程类似于相机拍照.此步骤大概分为三个: 1)把相机固定在三角架上,并让它对准场景(视图变换) 2)对场景安排,使得各个物体在招片中的 ...
- 【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 )
文章目录 一.初始化 OpenGL 矩阵 1.设置投影矩阵 2.设置模型视图矩阵 二.绘制点 1.清除缓冲区 2.设置当前颜色值 3.设置绘制点的大小 4.绘制点 5.将缓冲区绘制到前台 三.部分代码 ...
- C++ opengl 对OpenGL中矩阵设置的初步认识
对OpenGL中矩阵设置的初步认识: 在入门级的代码里面,通常在初始化OpenGL中可以看到这样的代码: void init(){glMatrixMode(GL_PROJECTION);gluPers ...
- OpenGL中各种坐标系的理解
OPENGL坐标系可分为:世界坐标系和当前绘图坐标系. 世界坐标系:在OpenGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的.你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕 ...
- OpenGL中glRotatef()函数究竟对矩阵做了什么
OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...
- OpenGL中的gl,glu,glut的区别
OpenGL中gl,glu,glut的区别 OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库, gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台工具库,gl中包 ...
最新文章
- R语言构建决策树(decision trees)模型并进行调优和解释
- 打破 Google 破坏性的搜索垄断
- ai如何旋转画布_Ai绘制科技感晶格球体!
- java对象头_我的并发编程(二):java对象头以及synchronized升级过程
- Java虚拟机必学之四大知识要点,附学习资料
- 整理JavaScript中,数组和字符的操作方法
- java使用BZip算法压缩解压缩文件、数据流、byte[]字节数组
- 交换机的VLAN技术
- Com uma forca, com uma forca
- LZJ流体质量计算机价格,LZJ-ⅢC型流体质量计算机
- Qt 的 linuxFB XCB KMS XCB Wayland
- Python 随机漫步
- 概率论-1.4 条件概率(重点:对P(A | B)、P(AB)、P(B)之间关系的理解)
- 数据仓库之搭建ODS(原始数据层)
- R语言的修仙之道--R语言之后天境界
- 树莓派GPIO针脚在python中BCM与BOARD模式
- 音视频基础知识---音频编码格式
- 【Windows】win10多桌面与多任务
- 计算机网络高频知识点(一)
- 项目一 国家电力项目思路总结