0、 概念/准备
电脑本身展现的数据是二维,想要用二维的平面展现三维的立体就需要来一些坐标转换和一些显示技巧了。先介绍一些概念,下面用相机拍照来类比opengl中的一些概念。
视图:就是从哪个角度去看模型,就如三脚架放在哪个地方一样;
模型:就是需要拍摄的物体的外轮廓,或者就是物体吧。
投影:就是物体所能够被看见的一面。
视口:就是将物体可见的一面展现到设备上的图形。
(以上是个人理解)
从物体坐标到实际显示设备展示需要经历的一些坐标变换和技术处理流程图:
1、freeglut(64)
本来觉得很简单,跟着书上的内容去做就行了,这里就出现问题了,程序中用了GLUT库的东西,好吧QT自带的不行了,我就只好去下载一个,好家伙我电脑是64位的,GLUT只支持32位的,去官网一看,已经停止维护很多年了。
关键的32位在64位的还编译有问题,只好说使用freeglut代替glut,我又从官网下载源码,然后用Cmake去编译一个x64的库,半天就过去了。有需要的后面传一个下载链接。
在OPengl学习(二)——opengl环境搭建我还信誓旦旦说用QT自带的库就搞定,这么快就打脸。
需要下载库的:freeglut64位传送门(1个积分,没用的话私信我)
2、画一个立方体
有了上面的64位的freeglut库之后,按照流程走了一遍,正好编译完成,具体如下,其中程序中的函数暂时不用管什么含义,后面会一个个介绍。
1.pro配置文件
头文件中加入库的引用
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/3dr/freeglut1/ -lfreeglut
INCLUDEPATH += $$PWD/3dr/freeglut1/include
DEPENDPATH += $$PWD/3dr/freeglut1/include
2.所有程序
代码如下(示例):
#include "3dr/freeglut1/include/GL/freeglut.h"
#include <QApplication>
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glScalef(1.0,2.0,1.0);
glutWireCube(1.0);
glFlush();
}
void reshape(int w ,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return a.exec();
}
3.效果
最后运行效果