VC结合OpenGL实现三维曲线图
一、引入OpenGL
1.1 配置OpenGL
1.1.1 引入GLUT
安装GLUT
前往FREE GLUT官网下载安装包
压缩包解压后将include目录引入项目的include文件夹中
引入include目录
1.1.2 引入GLFW(如有需求引入)
安装GLFW
下载好后将GLFW安装包移入项目include目录中并将在vs中引入GLFW的include目录
引入lib依赖
首先需要引入对应vs版本的lib目录
链接器 > 输入 > 附加依赖项 添加glfw3.lib;opengl32.lib;user32.lib;gdi32.lib;shell32.lib
1.1.3 引入GLAD(如有需求引入)
选择以上配置
引入glad的include目录
源文件添加现有项glad.c
在glad的src目录下
二、VC2015结合OpenGL绘出三维图像
程序界面浏览
系统整体结构图
2.1 初始化程序
实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 (括号内表示的是相应的图形学概念):
第一步,将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation)。
第二步,将三维物体放在适当的位置(模型变换,Modeling Transformation)。
第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation)。
第四步,决定二维像片的大小(视口变换,Viewport Transformation)
其中m_zRotate为绕Z轴旋转的角度,m_xRotate为绕X轴旋转的角度(右手坐标系)
m_dTran_X = 0.1f; // 向X轴方向平移距离
m_dTran_Y = 0.0f; // 向Y轴方向平移距离
m_dTran_Z = 0.1f; // 向Z轴方向平移距离
上述三个参数为模型平移的参数,
2.1.1 初始化窗口句柄
CRect rect;
GetDlgItem(IDC_PICTURE_CTRL)->GetWindowRect(rect);
ScreenToClient(rect);
m_pOpenGlObject.oglCreate(rect, this, 1000, 1000,glm::vec2(-5, 5), glm::vec2(-10,10), glm::vec2(-100, 100)); // 调用初始化方法便于移植
m_pOpenGlObject.SetTimer(1, 10, NULL); // 启动OpenGL对象的定时器,本程序绘制方法放在定时器中进行循环绘制
oglCreate初始化方法:
CString className = AfxRegisterWndClass(CS_HREDRAW |
CS_VREDRAW | CS_OWNDC, NULL,
(HBRUSH)GetStockObject(BLACK_BRUSH), NULL);
this->CreateEx(0, className, "OpenGL", WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN, rect, parent, 0);
// Set initial variables' values
m_oldWindow = rect;
m_originalRect = rect;
hWnd = parent;
oglInitializeData(nXcount, nYcount, vec2Xrange, vec2Yrange, vec2Zrange); // 初始化数据
oglInitialize(); // 初始化系统【配置OpenGL上下文】
oglInitializeFreeType();// 初始化字体绘制
2.1.2 初始化数据(oglInitializeData)
// 参数、数据初始化
void COpenGLObject::oglInitializeData(int nXcount, int nYcount, glm::vec2 vec2Xrange, glm::vec2 vec2Yrange, glm::vec2 vec2Zrange) {
// 初始化参数
m_nAsCount = 7; // 刻度数目
m_fFov = 20.0f; // 相机视场角
m_nDrawMode = 0; // 填充模式
m_nScaleMode = 0; // 视图模式
m_LeftButtonDown = false; // 鼠标左键按下标识
m_RightButtonDown = false; // 鼠标右键按下标识
m_fRotate_X = -25.0f; // 绕X轴旋转度数
m_fRotate_Z = -20.0f; // 绕Z轴旋转度数
m_dTran_X = 0.1f; // 向X轴方向平移距离
m_dTran_Y = 0.0f; // 向Y轴方向平移距离
m_dTran_Z = 0.1f; // 向Z轴方向平移距离
m_fScale_X = 0.83f; // X轴缩放尺寸
m_fScale_Y = 0.83f; // Y轴缩放尺寸
m_fScale_Z = 0.83f; // Z轴缩放尺寸
m_oglCamera.m_fPos_X = -5.0f; // 相机三维坐标
m_oglCamera.m_fPos_Y = -5.0f;
m_oglCamera.m_fPos_Z = 5.0f;
m_oglCamera.m_fTargetX = 0.0f; // 相机目标点坐标
m_oglCamera.m_fTargetY = 0.0f;
m_oglCamera